1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-06 00:13:33 +00:00

Updated installation dialog box, new user interface.

This commit is contained in:
Ylian Saint-Hilaire
2022-01-18 10:58:25 -08:00
parent 44edd37fdb
commit 28676d5860
9 changed files with 505 additions and 365 deletions

Binary file not shown.

View File

@@ -12,6 +12,24 @@
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Neutral resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#pragma code_page(1252)
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDB_BITMAP_MC BITMAP "mc.bmp"
#endif // Neutral resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
@@ -45,16 +63,6 @@ END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON "MeshService.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Version
@@ -98,30 +106,38 @@ END
// Dialog
//
IDD_INSTALLDIALOG DIALOGEX 0, 100, 317, 148
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION
IDD_INSTALLDIALOG DIALOGEX 0, 100, 308, 153
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "MeshCentral Agent"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
PUSHBUTTON "Close",IDCANCEL,260,127,50,14
LTEXT "Click the buttons below to install or uninstall the mesh agent. When installed, this software runs in the background allowing this computer to be managed and controlled by a remote administrator.",IDC_DESCRIPTION,7,7,275,28
GROUPBOX "Installation Information",IDC_STATIC,7,38,303,87
PUSHBUTTON "Install / Update",IDC_INSTALLBUTTON,7,127,65,14
PUSHBUTTON "Uninstall",IDC_UNINSTALLBUTTON,75,127,65,14
ICON IDI_ICON1,IDC_STATIC,288,7,20,20
LTEXT "Current Agent Status",IDC_AGENTSTATUS_TEXT,14,51,100,8
LTEXT "Unknown",IDC_STATUSTEXT,127,51,175,8,0,WS_EX_RIGHT
LTEXT "New Agent Version",IDC_AGENT_VERSION,14,63, 100,8
LTEXT "Unknown",IDC_VERSIONTEXT,127,63,175,8,0,WS_EX_RIGHT
LTEXT "New Group Id",IDC_MESH_IDENTIFIER,14,99, 100,8
LTEXT "Unknown",IDC_HASHTEXT,127,99,175,8,0,WS_EX_RIGHT
LTEXT "New Group Name",IDC_MESH_NAME,14,87, 100,8
LTEXT "Unknown",IDC_POLICYTEXT,127,87,175,8,0,WS_EX_RIGHT
LTEXT "New Server Identifier",IDC_SERVER_IDENTIFIER,14,111, 100,8
LTEXT "Unknown",IDC_SERVERID,127,111,175,8,0,WS_EX_RIGHT
LTEXT "New Server Location",IDC_SERVER_LOCATION,14,75, 100,8
LTEXT "Unknown",IDC_SERVERLOCATION,127,75,175,8,0,WS_EX_RIGHT
PUSHBUTTON "Connect",IDC_CONNECTBUTTON,143,127,65,14
PUSHBUTTON "Close",IDCLOSE,251,132,50,14
PUSHBUTTON "Install / Update",IDC_INSTALLBUTTON,7,132,65,14
PUSHBUTTON "Uninstall",IDC_UNINSTALLBUTTON,75,132,65,14
PUSHBUTTON "Connect",IDC_CONNECTBUTTON,143,132,65,14
LTEXT "Click the buttons below to install or uninstall this remote management software. When installed, this software runs in the background allowing this computer to be managed and controlled by a remote administrator.",IDC_STATIC_LEFTTEXT,7,7,171,63
LTEXT "Static",IDC_STATIC_LINE,7,128,294,1
PUSHBUTTON "Connection Details...",IDC_DETAILSBUTTON,7,111,97,14
END
IDD_DETAILSDIALOG DIALOGEX 0, 0, 311, 102
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Connection Details"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,254,81,50,14
LTEXT "Agent Status",IDC_AGENTSTATUS_TEXT,7,7,100,8
LTEXT "Unknown",IDC_STATUSTEXT,129,7,175,8,0,WS_EX_RIGHT
LTEXT "Agent Version",IDC_AGENT_VERSION,7,19,100,8
LTEXT "Unknown",IDC_VERSIONTEXT,129,19,175,8,0,WS_EX_RIGHT
LTEXT "Group Identifier",IDC_MESH_IDENTIFIER,7,67,100,8
LTEXT "Unknown",IDC_HASHTEXT,129,67,175,8,0,WS_EX_RIGHT
LTEXT "Group Name",IDC_MESH_NAME,7,55,100,8
LTEXT "Unknown",IDC_POLICYTEXT,129,55,175,8,0,WS_EX_RIGHT
LTEXT "Server Identifier",IDC_SERVER_IDENTIFIER,7,43,100,8
LTEXT "Unknown",IDC_SERVERID,129,43,175,8,0,WS_EX_RIGHT
LTEXT "Server Location",IDC_SERVER_LOCATION,7,31,100,8
LTEXT "Unknown",IDC_SERVERLOCATION,129,31,175,8,0,WS_EX_RIGHT
END
@@ -136,9 +152,17 @@ BEGIN
IDD_INSTALLDIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 310
RIGHTMARGIN, 301
TOPMARGIN, 7
BOTTOMMARGIN, 141
BOTTOMMARGIN, 146
END
IDD_DETAILSDIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 304
TOPMARGIN, 7
BOTTOMMARGIN, 95
END
END
#endif // APSTUDIO_INVOKED
@@ -154,6 +178,11 @@ BEGIN
0
END
IDD_DETAILSDIALOG AFX_DIALOG_LAYOUT
BEGIN
0
END
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////

View File

@@ -552,6 +552,7 @@
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<Image Include="mc.bmp" />
<Image Include="MeshService.ico" />
</ItemGroup>
<ItemGroup>
@@ -666,6 +667,7 @@
<ClInclude Include="..\microstack\ILibWebServer.h" />
<ClInclude Include="..\microstack\ILibWrapperWebRTC.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="stdafx.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@@ -30,6 +30,9 @@
<Image Include="MeshService.ico">
<Filter>Resource Files</Filter>
</Image>
<Image Include="mc.bmp">
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
<ItemGroup>
<ClCompile Include="firewall.cpp" />
@@ -355,5 +358,6 @@
<ClInclude Include="..\microscript\ILibDuktape_CompressedStream.h">
<Filter>Microscript</Filter>
</ClInclude>
<ClInclude Include="stdafx.h" />
</ItemGroup>
</Project>

View File

@@ -15,11 +15,11 @@ limitations under the License.
*/
#if defined(WINSOCK2)
#include <winsock2.h>
#include <ws2tcpip.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#elif defined(WINSOCK1)
#include <winsock.h>
#include <wininet.h>
#include <winsock.h>
#include <wininet.h>
#endif
#include <stdio.h>
@@ -57,6 +57,7 @@ TCHAR* serviceName = TEXT("Mesh Agent background service");
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
INT_PTR CALLBACK DialogHandler(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK DialogHandler2(HWND, UINT, WPARAM, LPARAM);
MeshAgentHostContainer *agent = NULL;
DWORD g_serviceArgc;
@@ -64,6 +65,9 @@ char **g_serviceArgv;
extern int gRemoteMouseRenderDefault;
char *DIALOG_LANG = NULL;
HBRUSH DialogBackgroundBrush = NULL;
HBITMAP g_hbmLogo = NULL;
/*
extern int g_TrustedHashSet;
extern char g_TrustedHash[32];
@@ -75,6 +79,7 @@ extern char* g_ServiceProxyHost;
extern int g_ServiceConnectFlags;
*/
#if defined(_LINKVM)
extern DWORD WINAPI kvm_server_mainloop(LPVOID Param);
#endif
@@ -82,12 +87,12 @@ extern DWORD WINAPI kvm_server_mainloop(LPVOID Param);
BOOL IsAdmin()
{
BOOL admin;
PSID AdministratorsGroup;
PSID AdministratorsGroup;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
if ((admin = AllocateAndInitializeSid( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup)) != 0)
if ((admin = AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup)) != 0)
{
if (!CheckTokenMembership( NULL, AdministratorsGroup, &admin)) admin = FALSE;
if (!CheckTokenMembership(NULL, AdministratorsGroup, &admin)) admin = FALSE;
FreeSid(AdministratorsGroup);
}
return admin;
@@ -96,12 +101,12 @@ BOOL IsAdmin()
BOOL RunAsAdmin(char* args, int isAdmin)
{
WCHAR szPath[_MAX_PATH + 100];
if (GetModuleFileNameW(NULL, szPath, sizeof(szPath)/2))
if (GetModuleFileNameW(NULL, szPath, sizeof(szPath) / 2))
{
SHELLEXECUTEINFOW sei = { sizeof(sei) };
sei.hwnd = NULL;
sei.nShow = SW_NORMAL;
sei.lpVerb = isAdmin?L"open":L"runas";
sei.lpVerb = isAdmin ? L"open" : L"runas";
sei.lpFile = szPath;
sei.lpParameters = ILibUTF8ToWide(args, -1);
return ShellExecuteExW(&sei);
@@ -109,68 +114,68 @@ BOOL RunAsAdmin(char* args, int isAdmin)
return FALSE;
}
DWORD WINAPI ServiceControlHandler( DWORD controlCode, DWORD eventType, void *eventData, void* eventContext )
DWORD WINAPI ServiceControlHandler(DWORD controlCode, DWORD eventType, void *eventData, void* eventContext)
{
switch (controlCode)
{
case SERVICE_CONTROL_INTERROGATE:
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
if (agent != NULL) { MeshAgent_Stop(agent); }
return(0);
case SERVICE_CONTROL_POWEREVENT:
switch (eventType)
{
case PBT_APMPOWERSTATUSCHANGE: // Power status has changed.
break;
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus( serviceStatusHandle, &serviceStatus );
if (agent != NULL) { MeshAgent_Stop(agent); }
return(0);
case SERVICE_CONTROL_POWEREVENT:
switch (eventType)
{
case PBT_APMPOWERSTATUSCHANGE: // Power status has changed.
break;
case PBT_APMRESUMEAUTOMATIC: // Operation is resuming automatically from a low - power state.This message is sent every time the system resumes.
break;
case PBT_APMRESUMESUSPEND: // Operation is resuming from a low - power state.This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.
break;
case PBT_APMSUSPEND: // System is suspending operation.
break;
case PBT_POWERSETTINGCHANGE: // Power setting change event has been received.
break;
}
case PBT_APMRESUMEAUTOMATIC: // Operation is resuming automatically from a low - power state.This message is sent every time the system resumes.
break;
case SERVICE_CONTROL_SESSIONCHANGE:
if (agent == NULL)
{
break; // If there isn't an agent, no point in doing anything, cuz nobody will hear us
}
case PBT_APMRESUMESUSPEND: // Operation is resuming from a low - power state.This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.
break;
case PBT_APMSUSPEND: // System is suspending operation.
break;
case PBT_POWERSETTINGCHANGE: // Power setting change event has been received.
break;
}
break;
case SERVICE_CONTROL_SESSIONCHANGE:
if (agent == NULL)
{
break; // If there isn't an agent, no point in doing anything, cuz nobody will hear us
}
switch (eventType)
{
case WTS_CONSOLE_CONNECT: // The session identified by lParam was connected to the console terminal or RemoteFX session.
break;
case WTS_CONSOLE_DISCONNECT: // The session identified by lParam was disconnected from the console terminal or RemoteFX session.
break;
case WTS_REMOTE_CONNECT: // The session identified by lParam was connected to the remote terminal.
break;
case WTS_REMOTE_DISCONNECT: // The session identified by lParam was disconnected from the remote terminal.
break;
case WTS_SESSION_LOGON: // A user has logged on to the session identified by lParam.
case WTS_SESSION_LOGOFF: // A user has logged off the session identified by lParam.
break;
case WTS_SESSION_LOCK: // The session identified by lParam has been locked.
break;
case WTS_SESSION_UNLOCK: // The session identified by lParam has been unlocked.
break;
case WTS_SESSION_REMOTE_CONTROL:// The session identified by lParam has changed its remote controlled status.To determine the status, call GetSystemMetrics and check the SM_REMOTECONTROL metric.
break;
case WTS_SESSION_CREATE: // Reserved for future use.
case WTS_SESSION_TERMINATE: // Reserved for future use.
break;
}
switch (eventType)
{
case WTS_CONSOLE_CONNECT: // The session identified by lParam was connected to the console terminal or RemoteFX session.
break;
default:
case WTS_CONSOLE_DISCONNECT: // The session identified by lParam was disconnected from the console terminal or RemoteFX session.
break;
case WTS_REMOTE_CONNECT: // The session identified by lParam was connected to the remote terminal.
break;
case WTS_REMOTE_DISCONNECT: // The session identified by lParam was disconnected from the remote terminal.
break;
case WTS_SESSION_LOGON: // A user has logged on to the session identified by lParam.
case WTS_SESSION_LOGOFF: // A user has logged off the session identified by lParam.
break;
case WTS_SESSION_LOCK: // The session identified by lParam has been locked.
break;
case WTS_SESSION_UNLOCK: // The session identified by lParam has been unlocked.
break;
case WTS_SESSION_REMOTE_CONTROL:// The session identified by lParam has changed its remote controlled status.To determine the status, call GetSystemMetrics and check the SM_REMOTECONTROL metric.
break;
case WTS_SESSION_CREATE: // Reserved for future use.
case WTS_SESSION_TERMINATE: // Reserved for future use.
break;
}
break;
default:
break;
}
SetServiceStatus( serviceStatusHandle, &serviceStatus );
SetServiceStatus(serviceStatusHandle, &serviceStatus);
return(0);
}
@@ -182,8 +187,8 @@ void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
WCHAR str[_MAX_PATH];
UNREFERENCED_PARAMETER( argc );
UNREFERENCED_PARAMETER( argv );
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
// Initialise service status
serviceStatus.dwServiceType = SERVICE_WIN32;
@@ -204,7 +209,7 @@ void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
// Service running
serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_SESSIONCHANGE);
serviceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus( serviceStatusHandle, &serviceStatus);
SetServiceStatus(serviceStatusHandle, &serviceStatus);
// Get our own executable name
GetModuleFileNameW(NULL, str, _MAX_PATH);
@@ -251,7 +256,7 @@ int RunService(int argc, char* argv[])
g_serviceArgc = argc;
g_serviceArgv = argv;
return StartServiceCtrlDispatcher( serviceTable );
return StartServiceCtrlDispatcher(serviceTable);
}
// SERVICE_STOPPED 1 The service is not running.
@@ -269,21 +274,21 @@ int GetServiceState(LPCSTR servicename)
if (serviceControlManager)
{
SC_HANDLE service = OpenService( serviceControlManager, servicename, SERVICE_QUERY_STATUS );
SC_HANDLE service = OpenService(serviceControlManager, servicename, SERVICE_QUERY_STATUS);
if (service)
{
SERVICE_STATUS serviceStatusEx;
if ( QueryServiceStatus( service, &serviceStatusEx) )
if (QueryServiceStatus(service, &serviceStatusEx))
{
r = serviceStatusEx.dwCurrentState;
}
CloseServiceHandle( service );
CloseServiceHandle(service);
}
else
{
r = 100;
}
CloseServiceHandle( serviceControlManager );
CloseServiceHandle(serviceControlManager);
}
return r;
}
@@ -291,9 +296,9 @@ int GetServiceState(LPCSTR servicename)
/*
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
@@ -335,7 +340,7 @@ int wmain(int argc, char* wargv[])
int retCode = 0;
int argvi, argvsz;
char **argv = (char**)ILibMemory_SmartAllocate((argc+1) * sizeof(void*));
char **argv = (char**)ILibMemory_SmartAllocate((argc + 1) * sizeof(void*));
for (argvi = 0; argvi < argc; ++argvi)
{
argvsz = WideCharToMultiByte(CP_UTF8, 0, (LPCWCH)wargv[argvi], -1, NULL, 0, NULL, NULL);
@@ -343,9 +348,9 @@ int wmain(int argc, char* wargv[])
WideCharToMultiByte(CP_UTF8, 0, (LPCWCH)wargv[argvi], -1, argv[argvi], argvsz, NULL, NULL);
}
if (argc > 1 && (strcasecmp(argv[1], "-finstall") == 0 || strcasecmp(argv[1], "-funinstall") == 0 ||
if (argc > 1 && (strcasecmp(argv[1], "-finstall") == 0 || strcasecmp(argv[1], "-funinstall") == 0 ||
strcasecmp(argv[1], "-fulluninstall") == 0 || strcasecmp(argv[1], "-fullinstall") == 0 ||
strcasecmp(argv[1], "-install")==0 || strcasecmp(argv[1], "-uninstall") == 0 ||
strcasecmp(argv[1], "-install") == 0 || strcasecmp(argv[1], "-uninstall") == 0 ||
strcasecmp(argv[1], "-state") == 0))
{
argv[argc] = argv[1];
@@ -547,9 +552,9 @@ int wmain(int argc, char* wargv[])
wmain_free(argv);
return(0);
}
#if defined(_LINKVM)
#if defined(_LINKVM)
if (argc > 1 && strcasecmp(argv[1], "-kvm0") == 0)
{
{
void **parm = (void**)ILibMemory_Allocate(4 * sizeof(void*), 0, 0, NULL);
parm[0] = kvm_serviceWriteSink;
((int*)&(parm[2]))[0] = 0;
@@ -625,7 +630,7 @@ int wmain(int argc, char* wargv[])
wmain_free(argv);
return 0;
}
#endif
#endif
if (integratedJavaScript != NULL || (argc > 0 && strcasecmp(argv[0], "--slave") == 0) || (argc > 1 && ((strcasecmp(argv[1], "run") == 0) || (strcasecmp(argv[1], "connect") == 0) || (strcasecmp(argv[1], "--slave") == 0))))
{
// Run the mesh agent in console mode, since the agent is compiled for windows service, the KVM will not work right. This is only good for testing.
@@ -652,7 +657,7 @@ int wmain(int argc, char* wargv[])
return(retCode);
}
else if (argc > 1 && memcmp(argv[1], "-update:", 8) == 0)
{
{
char *update = ILibMemory_Allocate(1024, 0, NULL, NULL);
int updateLen;
@@ -704,13 +709,15 @@ int wmain(int argc, char* wargv[])
{
// Reset the firewall rules
GetModuleFileNameW(NULL, str, _MAX_PATH);
if (IsAdmin() == FALSE) { printf("Must run as administrator"); } else { ClearWindowsFirewall(str); SetupWindowsFirewall(str); printf("Done"); }
if (IsAdmin() == FALSE) { printf("Must run as administrator"); }
else { ClearWindowsFirewall(str); SetupWindowsFirewall(str); printf("Done"); }
}
else if (argc > 1 && (strcasecmp(argv[1], "-clearfirewall") == 0))
{
// Clear the firewall rules
GetModuleFileNameW(NULL, str, _MAX_PATH);
if (IsAdmin() == FALSE) { printf("Must run as administrator"); } else { ClearWindowsFirewall(str); printf("Done"); }
if (IsAdmin() == FALSE) { printf("Must run as administrator"); }
else { ClearWindowsFirewall(str); printf("Done"); }
}
#endif
else if (argc == 2 && (strcasecmp(argv[1], "-resetnodeid") == 0))
@@ -718,9 +725,9 @@ int wmain(int argc, char* wargv[])
// Set "resetnodeid" in registry
HKEY hKey;
#ifndef _WIN64
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Open Source\\MeshAgent2", 0, KEY_WRITE | KEY_WOW64_32KEY, &hKey) == ERROR_SUCCESS )
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Open Source\\MeshAgent2", 0, KEY_WRITE | KEY_WOW64_32KEY, &hKey) == ERROR_SUCCESS)
#else
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Open Source\\MeshAgent2", 0, KEY_WRITE, &hKey) == ERROR_SUCCESS )
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Open Source\\MeshAgent2", 0, KEY_WRITE, &hKey) == ERROR_SUCCESS)
#endif
{
i = 1;
@@ -774,7 +781,7 @@ int wmain(int argc, char* wargv[])
void *dialogchain = ILibCreateChain();
ILibChain_PartialStart(dialogchain);
duk_context *ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, dialogchain, NULL, NULL, selfexe, NULL, NULL, dialogchain);
if (duk_peval_string(ctx, "require('util-language').current.toUpperCase().split('-').join('_');") == 0)
if (duk_peval_string(ctx, "require('util-language').current.toUpperCase().split('-').join('_');") == 0)
{
lang = (char*)duk_safe_to_string(ctx, -1);
printf("Current Language: %s\n", lang);
@@ -814,7 +821,7 @@ int wmain(int argc, char* wargv[])
printf(" --WebProxy=\"http://proxyhost:port\" Specify an HTTPS proxy.\r\n");
printf(" --agentName=\"alternate name\" Specify an alternate name to be provided by the agent.\r\n");
}
else if(skip==0)
else if (skip == 0)
{
// This is only supported on Windows 8 / Windows Server 2012 R2 and newer
FreeConsole();
@@ -892,269 +899,312 @@ INT_PTR CALLBACK DialogHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
case WM_CTLCOLORDLG: {
// Set the background of the dialog box to blue
if (DialogBackgroundBrush == NULL) {
DialogBackgroundBrush = CreateSolidBrush(RGB(0, 54, 105));
}
return (INT_PTR)DialogBackgroundBrush;
}
case WM_CTLCOLORSTATIC: {
// Set the left text to white over transparent
if ((HWND)lParam == GetDlgItem(hDlg, IDC_STATIC_LEFTTEXT))
{
char selfexe[_MAX_PATH];
char *lang = NULL;
SetBkMode((HDC)wParam, TRANSPARENT);
SetTextColor((HDC)wParam, RGB(255, 255, 255));
return (INT_PTR)GetStockObject(NULL_BRUSH);
}
break;
}
case WM_PAINT:
{
// Paint the logo
// TODO: We need to auto-scale the image to fit
// TODO: Paint using GDI+ with transparency support
if (g_hbmLogo != NULL) {
BITMAP bm;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hDlg, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = SelectObject(hdcMem, g_hbmLogo);
GetObject(g_hbmLogo, sizeof(bm), &bm);
BitBlt(hdc, 326, 14, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
EndPaint(hDlg, &ps);
}
break;
}
case WM_INITDIALOG:
{
char selfexe[_MAX_PATH];
char *lang = NULL;
WCHAR *agentstatus = NULL;
WCHAR *agentversion = NULL;
WCHAR *serverlocation = NULL;
WCHAR *meshname = NULL;
WCHAR *meshidentitifer = NULL;
WCHAR *serveridentifier = NULL;
WCHAR *dialogdescription = NULL;
WCHAR *install_buttontext = NULL;
WCHAR *update_buttontext = NULL;
WCHAR *uninstall_buttontext = NULL;
WCHAR *connect_buttontext = NULL;
WCHAR *cancel_buttontext = NULL;
WCHAR *disconnect_buttontext = NULL;
WCHAR *state_notinstalled = NULL;
WCHAR *state_running = NULL;
WCHAR *state_notrunning = NULL;
WCHAR *agentstatus = NULL;
WCHAR *agentversion = NULL;
WCHAR *serverlocation = NULL;
WCHAR *meshname = NULL;
WCHAR *meshidentitifer = NULL;
WCHAR *serveridentifier = NULL;
WCHAR *dialogdescription = NULL;
WCHAR *install_buttontext = NULL;
WCHAR *update_buttontext = NULL;
WCHAR *uninstall_buttontext = NULL;
WCHAR *connect_buttontext = NULL;
WCHAR *close_buttontext = NULL;
WCHAR *disconnect_buttontext = NULL;
WCHAR *state_notinstalled = NULL;
WCHAR *state_running = NULL;
WCHAR *state_notrunning = NULL;
// Get current executable path
WCHAR wselfexe[MAX_PATH];
GetModuleFileNameW(NULL, wselfexe, sizeof(wselfexe) / 2);
ILibWideToUTF8Ex(wselfexe, -1, selfexe, (int)sizeof(selfexe));
// Load the bitmap
// TODO: We need to load a PNG from the .MSH file if present
g_hbmLogo = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP_MC));
void *dialogchain = ILibCreateChain();
ILibChain_PartialStart(dialogchain);
duk_context *ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, dialogchain, NULL, NULL, selfexe, NULL, NULL, dialogchain);
if (duk_peval_string(ctx, "require('util-language').current.toLowerCase().split('_').join('-');") == 0) { lang = (char*)duk_safe_to_string(ctx, -1); }
if (duk_peval_string(ctx, "(function foo(){return(JSON.parse(_MSH().translation));})()") != 0 || !duk_has_prop_string(ctx, -1, "en"))
{
duk_push_object(ctx); // [translation][en]
duk_push_string(ctx, "Install"); duk_put_prop_string(ctx, -2, "install");
duk_push_string(ctx, "Uninstall"); duk_put_prop_string(ctx, -2, "uninstall");
duk_push_string(ctx, "Connect"); duk_put_prop_string(ctx, -2, "connect");
duk_push_string(ctx, "Disconnect"); duk_put_prop_string(ctx, -2, "disconnect");
duk_push_string(ctx, "Update"); duk_put_prop_string(ctx, -2, "update");
duk_push_array(ctx);
duk_push_string(ctx, "NOT INSTALLED"); duk_array_push(ctx, -2);
duk_push_string(ctx, "RUNNING"); duk_array_push(ctx, -2);
duk_push_string(ctx, "NOT RUNNING"); duk_array_push(ctx, -2);
duk_put_prop_string(ctx, -2, "status");
duk_put_prop_string(ctx, -2, "en"); // [translation]
}
if (DIALOG_LANG != NULL) { lang = DIALOG_LANG; }
if (!duk_has_prop_string(ctx, -1, lang))
{
duk_push_string(ctx, lang); // [obj][string]
duk_string_split(ctx, -1, "-"); // [obj][string][array]
duk_array_shift(ctx, -1); // [obj][string][array][string]
lang = (char*)duk_safe_to_string(ctx, -1);
duk_dup(ctx, -4); // [obj][string][array][string][obj]
}
if (!duk_has_prop_string(ctx, -1, lang))
{
lang = "en";
}
// Get current executable path
WCHAR wselfexe[MAX_PATH];
GetModuleFileNameW(NULL, wselfexe, sizeof(wselfexe) / 2);
ILibWideToUTF8Ex(wselfexe, -1, selfexe, (int)sizeof(selfexe));
if (strcmp("en", lang) != 0)
void *dialogchain = ILibCreateChain();
ILibChain_PartialStart(dialogchain);
duk_context *ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, dialogchain, NULL, NULL, selfexe, NULL, NULL, dialogchain);
if (duk_peval_string(ctx, "require('util-language').current.toLowerCase().split('_').join('-');") == 0) { lang = (char*)duk_safe_to_string(ctx, -1); }
if (duk_peval_string(ctx, "(function foo(){return(JSON.parse(_MSH().translation));})()") != 0 || !duk_has_prop_string(ctx, -1, "en"))
{
duk_push_object(ctx); // [translation][en]
duk_push_string(ctx, "Install"); duk_put_prop_string(ctx, -2, "install");
duk_push_string(ctx, "Uninstall"); duk_put_prop_string(ctx, -2, "uninstall");
duk_push_string(ctx, "Connect"); duk_put_prop_string(ctx, -2, "connect");
duk_push_string(ctx, "Disconnect"); duk_put_prop_string(ctx, -2, "disconnect");
duk_push_string(ctx, "Update"); duk_put_prop_string(ctx, -2, "update");
duk_push_array(ctx);
duk_push_string(ctx, "NOT INSTALLED"); duk_array_push(ctx, -2);
duk_push_string(ctx, "RUNNING"); duk_array_push(ctx, -2);
duk_push_string(ctx, "NOT RUNNING"); duk_array_push(ctx, -2);
duk_put_prop_string(ctx, -2, "status");
duk_put_prop_string(ctx, -2, "en"); // [translation]
}
if (DIALOG_LANG != NULL) { lang = DIALOG_LANG; }
if (!duk_has_prop_string(ctx, -1, lang))
{
duk_push_string(ctx, lang); // [obj][string]
duk_string_split(ctx, -1, "-"); // [obj][string][array]
duk_array_shift(ctx, -1); // [obj][string][array][string]
lang = (char*)duk_safe_to_string(ctx, -1);
duk_dup(ctx, -4); // [obj][string][array][string][obj]
}
if (!duk_has_prop_string(ctx, -1, lang))
{
lang = "en";
}
if (strcmp("en", lang) != 0)
{
// Not English, so check the minimum set is present
duk_get_prop_string(ctx, -1, "en"); // [en]
duk_get_prop_string(ctx, -2, lang); // [en][lang]
duk_enum(ctx, -2, DUK_ENUM_OWN_PROPERTIES_ONLY);// [en][lang][enum]
while (duk_next(ctx, -1, 1)) // [en][lang][enum][key][val]
{
// Not English, so check the minimum set is present
duk_get_prop_string(ctx, -1, "en"); // [en]
duk_get_prop_string(ctx, -2, lang); // [en][lang]
duk_enum(ctx, -2, DUK_ENUM_OWN_PROPERTIES_ONLY);// [en][lang][enum]
while (duk_next(ctx, -1, 1)) // [en][lang][enum][key][val]
if (!duk_has_prop_string(ctx, -4, duk_get_string(ctx, -2)))
{
if (!duk_has_prop_string(ctx, -4, duk_get_string(ctx, -2)))
{
duk_put_prop(ctx, -4); // [en][lang][enum]
}
else
{
duk_pop_2(ctx); // [en][lang][enum]
}
duk_put_prop(ctx, -4); // [en][lang][enum]
}
duk_pop_3(ctx); // ...
}
if (duk_has_prop_string(ctx, -1, lang))
{
duk_get_prop_string(ctx, -1, lang);
agentstatus = Dialog_GetTranslation(ctx, "statusDescription");
if (agentstatus != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_AGENTSTATUS_TEXT), agentstatus); }
agentversion = Dialog_GetTranslation(ctx, "agentVersion");
if (agentversion != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_AGENT_VERSION), agentversion); }
serverlocation = Dialog_GetTranslation(ctx, "url");
if (serverlocation != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_SERVER_LOCATION), serverlocation); }
meshname = Dialog_GetTranslation(ctx, "meshName");
if (meshname != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_MESH_NAME), meshname); }
meshidentitifer = Dialog_GetTranslation(ctx, "meshId");
if (meshidentitifer != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_MESH_IDENTIFIER), meshidentitifer); }
serveridentifier = Dialog_GetTranslation(ctx, "serverId");
if (serveridentifier != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_SERVER_IDENTIFIER), serveridentifier); }
dialogdescription = Dialog_GetTranslation(ctx, "description");
if (dialogdescription != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_DESCRIPTION), dialogdescription); }
install_buttontext = Dialog_GetTranslation(ctx, "install");
update_buttontext = Dialog_GetTranslation(ctx, "update");
uninstall_buttontext = Dialog_GetTranslation(ctx, "uninstall");
cancel_buttontext = Dialog_GetTranslation(ctx, "cancel");
disconnect_buttontext = Dialog_GetTranslation(ctx, "disconnect");
if (disconnect_buttontext != NULL)
else
{
wcscpy_s(closeButtonText, sizeof(closeButtonText) / 2, disconnect_buttontext);
closeButtonTextSet = 1;
duk_pop_2(ctx); // [en][lang][enum]
}
if (uninstall_buttontext != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), uninstall_buttontext); }
connect_buttontext = Dialog_GetTranslation(ctx, "connect");
if (connect_buttontext != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_CONNECTBUTTON), connect_buttontext); }
if (cancel_buttontext != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDCANCEL), cancel_buttontext); }
duk_get_prop_string(ctx, -1, "status"); // [Array]
state_notinstalled = Dialog_GetTranslationEx(ctx, Duktape_GetStringPropertyIndexValue(ctx, -1, 0, NULL));
state_running = Dialog_GetTranslationEx(ctx, Duktape_GetStringPropertyIndexValue(ctx, -1, 1, NULL));
state_notrunning = Dialog_GetTranslationEx(ctx, Duktape_GetStringPropertyIndexValue(ctx, -1, 2, NULL));
}
duk_pop_3(ctx); // ...
}
fileName = MeshAgent_MakeAbsolutePath(selfexe, ".msh");
if (duk_has_prop_string(ctx, -1, lang))
{
duk_get_prop_string(ctx, -1, lang);
agentstatus = Dialog_GetTranslation(ctx, "statusDescription");
if (agentstatus != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_AGENTSTATUS_TEXT), agentstatus); }
agentversion = Dialog_GetTranslation(ctx, "agentVersion");
if (agentversion != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_AGENT_VERSION), agentversion); }
serverlocation = Dialog_GetTranslation(ctx, "url");
if (serverlocation != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_SERVER_LOCATION), serverlocation); }
meshname = Dialog_GetTranslation(ctx, "meshName");
if (meshname != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_MESH_NAME), meshname); }
meshidentitifer = Dialog_GetTranslation(ctx, "meshId");
if (meshidentitifer != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_MESH_IDENTIFIER), meshidentitifer); }
serveridentifier = Dialog_GetTranslation(ctx, "serverId");
if (serveridentifier != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_SERVER_IDENTIFIER), serveridentifier); }
dialogdescription = Dialog_GetTranslation(ctx, "description");
if (dialogdescription != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_STATIC_LEFTTEXT), dialogdescription); }
install_buttontext = Dialog_GetTranslation(ctx, "install");
update_buttontext = Dialog_GetTranslation(ctx, "update");
uninstall_buttontext = Dialog_GetTranslation(ctx, "uninstall");
close_buttontext = Dialog_GetTranslation(ctx, "close");
disconnect_buttontext = Dialog_GetTranslation(ctx, "disconnect");
if (disconnect_buttontext != NULL)
{
DWORD dwSize = 0;
BYTE *pVersionInfo = NULL;
VS_FIXEDFILEINFO *pFileInfo = NULL;
UINT pLenFileInfo = 0;
int major, minor, hotfix, other;
wcscpy_s(closeButtonText, sizeof(closeButtonText) / 2, disconnect_buttontext);
closeButtonTextSet = 1;
}
if ((dwSize = GetFileVersionInfoSizeW(wselfexe, NULL)))
{
if ((pVersionInfo = malloc(dwSize)) == NULL) { ILIBCRITICALEXIT(254); }
if (GetFileVersionInfoW(wselfexe, 0, dwSize, pVersionInfo))
if (uninstall_buttontext != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), uninstall_buttontext); }
connect_buttontext = Dialog_GetTranslation(ctx, "connect");
if (connect_buttontext != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDC_CONNECTBUTTON), connect_buttontext); }
if (close_buttontext != NULL) { SetWindowTextW(GetDlgItem(hDlg, IDCLOSE), close_buttontext); }
duk_get_prop_string(ctx, -1, "status"); // [Array]
state_notinstalled = Dialog_GetTranslationEx(ctx, Duktape_GetStringPropertyIndexValue(ctx, -1, 0, NULL));
state_running = Dialog_GetTranslationEx(ctx, Duktape_GetStringPropertyIndexValue(ctx, -1, 1, NULL));
state_notrunning = Dialog_GetTranslationEx(ctx, Duktape_GetStringPropertyIndexValue(ctx, -1, 2, NULL));
}
fileName = MeshAgent_MakeAbsolutePath(selfexe, ".msh");
{
DWORD dwSize = 0;
BYTE *pVersionInfo = NULL;
VS_FIXEDFILEINFO *pFileInfo = NULL;
UINT pLenFileInfo = 0;
int major, minor, hotfix, other;
if ((dwSize = GetFileVersionInfoSizeW(wselfexe, NULL)))
{
if ((pVersionInfo = malloc(dwSize)) == NULL) { ILIBCRITICALEXIT(254); }
if (GetFileVersionInfoW(wselfexe, 0, dwSize, pVersionInfo))
{
if (VerQueryValue(pVersionInfo, TEXT("\\"), (LPVOID*)&pFileInfo, &pLenFileInfo))
{
if (VerQueryValue(pVersionInfo, TEXT("\\"), (LPVOID*)&pFileInfo, &pLenFileInfo))
{
// Display the version of this software
major = (pFileInfo->dwFileVersionMS >> 16) & 0xffff;
minor = (pFileInfo->dwFileVersionMS) & 0xffff;
hotfix = (pFileInfo->dwFileVersionLS >> 16) & 0xffff;
other = (pFileInfo->dwFileVersionLS) & 0xffff;
// Display the version of this software
major = (pFileInfo->dwFileVersionMS >> 16) & 0xffff;
minor = (pFileInfo->dwFileVersionMS) & 0xffff;
hotfix = (pFileInfo->dwFileVersionLS >> 16) & 0xffff;
other = (pFileInfo->dwFileVersionLS) & 0xffff;
#ifdef _WIN64
if (SOURCE_COMMIT_DATE != NULL)
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "%s, 64bit", SOURCE_COMMIT_DATE);
}
else
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "v%d.%d.%d, 64bit", major, minor, hotfix);
}
#else
if (SOURCE_COMMIT_DATE != NULL)
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "%s", SOURCE_COMMIT_DATE);
}
else
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "v%d.%d.%d", major, minor, hotfix);
}
#endif
SetWindowTextA(GetDlgItem(hDlg, IDC_VERSIONTEXT), ILibScratchPad);
if (SOURCE_COMMIT_DATE != NULL)
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "%s, 64bit", SOURCE_COMMIT_DATE);
}
else
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "v%d.%d.%d, 64bit", major, minor, hotfix);
}
#else
if (SOURCE_COMMIT_DATE != NULL)
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "%s", SOURCE_COMMIT_DATE);
}
else
{
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "v%d.%d.%d", major, minor, hotfix);
}
#endif
SetWindowTextA(GetDlgItem(hDlg, IDC_VERSIONTEXT), ILibScratchPad);
}
free(pVersionInfo);
}
free(pVersionInfo);
}
}
if (duk_peval_string(ctx, "_MSH();") == 0)
{
int installFlagsInt = 0;
WINDOWPLACEMENT lpwndpl;
if (duk_peval_string(ctx, "_MSH();") == 0)
{
int installFlagsInt = 0;
WINDOWPLACEMENT lpwndpl;
installFlags = Duktape_GetStringPropertyValue(ctx, -1, "InstallFlags", NULL);
meshname = (WCHAR*)Duktape_GetStringPropertyValue(ctx, -1, "MeshName", NULL);
meshid = Duktape_GetStringPropertyValue(ctx, -1, "MeshID", NULL);
serverid = Duktape_GetStringPropertyValue(ctx, -1, "ServerID", NULL);
serverurl = Duktape_GetStringPropertyValue(ctx, -1, "MeshServer", NULL);
displayName = Duktape_GetStringPropertyValue(ctx, -1, "displayName", NULL);
meshServiceName = Duktape_GetStringPropertyValue(ctx, -1, "meshServiceName", NULL);
installFlags = Duktape_GetStringPropertyValue(ctx, -1, "InstallFlags", NULL);
meshname = (WCHAR*)Duktape_GetStringPropertyValue(ctx, -1, "MeshName", NULL);
meshid = Duktape_GetStringPropertyValue(ctx, -1, "MeshID", NULL);
serverid = Duktape_GetStringPropertyValue(ctx, -1, "ServerID", NULL);
serverurl = Duktape_GetStringPropertyValue(ctx, -1, "MeshServer", NULL);
displayName = Duktape_GetStringPropertyValue(ctx, -1, "displayName", NULL);
meshServiceName = Duktape_GetStringPropertyValue(ctx, -1, "meshServiceName", NULL);
// Set text in the dialog box
if (installFlags != NULL) { installFlagsInt = ILib_atoi2_int32(installFlags, 255); }
if (strnlen_s(meshid, 255) > 50) { meshid += 2; meshid[42] = 0; }
if (strnlen_s(serverid, 255) > 50) { serverid[42] = 0; }
if (displayName != NULL) { SetWindowTextW(hDlg, ILibUTF8ToWide(displayName, -1)); }
SetWindowTextW(GetDlgItem(hDlg, IDC_POLICYTEXT), ILibUTF8ToWide((meshname != NULL) ? (char*)meshname : "(None)", -1));
SetWindowTextA(GetDlgItem(hDlg, IDC_HASHTEXT), (meshid != NULL) ? meshid : "(None)");
SetWindowTextW(GetDlgItem(hDlg, IDC_SERVERLOCATION), ILibUTF8ToWide((serverurl != NULL) ? serverurl : "(None)", -1));
SetWindowTextA(GetDlgItem(hDlg, IDC_SERVERID), (serverid != NULL) ? serverid : "(None)");
if (meshid == NULL) { EnableWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), FALSE); }
if ((installFlagsInt & 3) == 1) {
// Temporary Agent Only
hiddenButtons |= 6; // Both install and uninstall buttons are hidden
ShowWindow(GetDlgItem(hDlg, IDC_INSTALLBUTTON), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), SW_HIDE);
GetWindowPlacement(GetDlgItem(hDlg, IDC_INSTALLBUTTON), &lpwndpl);
SetWindowPlacement(GetDlgItem(hDlg, IDC_CONNECTBUTTON), &lpwndpl);
} else if ((installFlagsInt & 3) == 2) {
// Background Only
hiddenButtons |= 1; // Connect button is hidden hidden
ShowWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), SW_HIDE);
} else if ((installFlagsInt & 3) == 3) {
// Uninstall only
GetWindowPlacement(GetDlgItem(hDlg, IDC_INSTALLBUTTON), &lpwndpl);
SetWindowPlacement(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), &lpwndpl);
hiddenButtons |= 5; // Both install and connect buttons are hidden
ShowWindow(GetDlgItem(hDlg, IDC_INSTALLBUTTON), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), SW_HIDE);
}
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), FALSE);
}
// Get the current service running state
int r = GetServiceState(meshServiceName != NULL ? meshServiceName : serviceFile);
SetWindowTextW(GetDlgItem(hDlg, IDC_INSTALLBUTTON), update_buttontext);
switch (r)
{
case SERVICE_RUNNING:
SetWindowTextW(GetDlgItem(hDlg, IDC_STATUSTEXT), state_running);
break;
case 0:
case 100: // Not installed
SetWindowTextW(GetDlgItem(hDlg, IDC_STATUSTEXT), state_notinstalled);
SetWindowTextW(GetDlgItem(hDlg, IDC_INSTALLBUTTON), install_buttontext);
hiddenButtons |= 2; // Uninstall buttons is hidden
ShowWindow(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), SW_HIDE);
break;
default: // Not running
SetWindowTextW(GetDlgItem(hDlg, IDC_STATUSTEXT), state_notrunning);
break;
}
// Correct the placement of buttons, push them to the left side if some of them are hidden.
if (hiddenButtons == 2) { // Uninstall button is the only one hidden. Place connect button at uninstall position
WINDOWPLACEMENT lpwndpl;
GetWindowPlacement(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), &lpwndpl);
SetWindowPlacement(GetDlgItem(hDlg, IDC_CONNECTBUTTON), &lpwndpl);
} else if (hiddenButtons == 6) { // Only connect button is showing, place it in the install button location
WINDOWPLACEMENT lpwndpl;
// Set text in the dialog box
if (installFlags != NULL) { installFlagsInt = ILib_atoi2_int32(installFlags, 255); }
if (strnlen_s(meshid, 255) > 50) { meshid += 2; meshid[42] = 0; }
if (strnlen_s(serverid, 255) > 50) { serverid[42] = 0; }
if (displayName != NULL) { SetWindowTextW(hDlg, ILibUTF8ToWide(displayName, -1)); }
SetWindowTextW(GetDlgItem(hDlg, IDC_POLICYTEXT), ILibUTF8ToWide((meshname != NULL) ? (char*)meshname : "(None)", -1));
SetWindowTextA(GetDlgItem(hDlg, IDC_HASHTEXT), (meshid != NULL) ? meshid : "(None)");
SetWindowTextW(GetDlgItem(hDlg, IDC_SERVERLOCATION), ILibUTF8ToWide((serverurl != NULL) ? serverurl : "(None)", -1));
SetWindowTextA(GetDlgItem(hDlg, IDC_SERVERID), (serverid != NULL) ? serverid : "(None)");
if (meshid == NULL) { EnableWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), FALSE); }
if ((installFlagsInt & 3) == 1) {
// Temporary Agent Only
hiddenButtons |= 6; // Both install and uninstall buttons are hidden
ShowWindow(GetDlgItem(hDlg, IDC_INSTALLBUTTON), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), SW_HIDE);
GetWindowPlacement(GetDlgItem(hDlg, IDC_INSTALLBUTTON), &lpwndpl);
SetWindowPlacement(GetDlgItem(hDlg, IDC_CONNECTBUTTON), &lpwndpl);
}
if (mshfile != NULL) { free(mshfile); }
Duktape_SafeDestroyHeap(ctx);
ILibStopChain(dialogchain);
ILibStartChain(dialogchain);
return (INT_PTR)TRUE;
else if ((installFlagsInt & 3) == 2) {
// Background Only
hiddenButtons |= 1; // Connect button is hidden hidden
ShowWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), SW_HIDE);
}
else if ((installFlagsInt & 3) == 3) {
// Uninstall only
GetWindowPlacement(GetDlgItem(hDlg, IDC_INSTALLBUTTON), &lpwndpl);
SetWindowPlacement(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), &lpwndpl);
hiddenButtons |= 5; // Both install and connect buttons are hidden
ShowWindow(GetDlgItem(hDlg, IDC_INSTALLBUTTON), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), SW_HIDE);
}
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), FALSE);
}
// Get the current service running state
int r = GetServiceState(meshServiceName != NULL ? meshServiceName : serviceFile);
SetWindowTextW(GetDlgItem(hDlg, IDC_INSTALLBUTTON), update_buttontext);
switch (r)
{
case SERVICE_RUNNING:
SetWindowTextW(GetDlgItem(hDlg, IDC_STATUSTEXT), state_running);
break;
case 0:
case 100: // Not installed
SetWindowTextW(GetDlgItem(hDlg, IDC_STATUSTEXT), state_notinstalled);
SetWindowTextW(GetDlgItem(hDlg, IDC_INSTALLBUTTON), install_buttontext);
hiddenButtons |= 2; // Uninstall buttons is hidden
ShowWindow(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), SW_HIDE);
break;
default: // Not running
SetWindowTextW(GetDlgItem(hDlg, IDC_STATUSTEXT), state_notrunning);
break;
}
// Correct the placement of buttons, push them to the left side if some of them are hidden.
if (hiddenButtons == 2) { // Uninstall button is the only one hidden. Place connect button at uninstall position
WINDOWPLACEMENT lpwndpl;
GetWindowPlacement(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), &lpwndpl);
SetWindowPlacement(GetDlgItem(hDlg, IDC_CONNECTBUTTON), &lpwndpl);
}
else if (hiddenButtons == 6) { // Only connect button is showing, place it in the install button location
WINDOWPLACEMENT lpwndpl;
GetWindowPlacement(GetDlgItem(hDlg, IDC_INSTALLBUTTON), &lpwndpl);
SetWindowPlacement(GetDlgItem(hDlg, IDC_CONNECTBUTTON), &lpwndpl);
}
if (mshfile != NULL) { free(mshfile); }
Duktape_SafeDestroyHeap(ctx);
ILibStopChain(dialogchain);
ILibStartChain(dialogchain);
return (INT_PTR)TRUE;
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCLOSE || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
@@ -1165,13 +1215,17 @@ INT_PTR CALLBACK DialogHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
return (INT_PTR)TRUE;
}
else if (LOWORD(wParam) == IDC_DETAILSBUTTON) {
DialogBoxW(NULL, MAKEINTRESOURCEW(IDD_DETAILSDIALOG), hDlg, DialogHandler2);
return (INT_PTR)TRUE;
}
else if (LOWORD(wParam) == IDC_INSTALLBUTTON || LOWORD(wParam) == IDC_UNINSTALLBUTTON)
{
BOOL result = FALSE;
EnableWindow( GetDlgItem( hDlg, IDC_INSTALLBUTTON ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_UNINSTALLBUTTON ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDCANCEL ), FALSE );
EnableWindow(GetDlgItem(hDlg, IDC_INSTALLBUTTON), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), FALSE);
EnableWindow(GetDlgItem(hDlg, IDCLOSE), FALSE);
if (LOWORD(wParam) == IDC_INSTALLBUTTON)
{
@@ -1190,7 +1244,7 @@ INT_PTR CALLBACK DialogHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
{
EnableWindow(GetDlgItem(hDlg, IDC_INSTALLBUTTON), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), TRUE);
EnableWindow(GetDlgItem(hDlg, IDCANCEL), TRUE);
EnableWindow(GetDlgItem(hDlg, IDCLOSE), TRUE);
}
#ifdef _DEBUG
@@ -1200,7 +1254,7 @@ INT_PTR CALLBACK DialogHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
return (INT_PTR)TRUE;
}
else if (LOWORD(wParam) == IDC_CONNECTBUTTON)
else if (LOWORD(wParam) == IDC_CONNECTBUTTON)
{
//
// Temporary Agent
@@ -1209,12 +1263,12 @@ INT_PTR CALLBACK DialogHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
EnableWindow(GetDlgItem(hDlg, IDC_UNINSTALLBUTTON), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CONNECTBUTTON), FALSE);
SetWindowTextA(GetDlgItem(hDlg, IDC_STATUSTEXT), "Running as temporary agent");
DWORD pid = GetCurrentProcessId();
sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "connect --disableUpdate=1 --hideConsole=1 --exitPID=%u", pid);
if (RunAsAdmin(ILibScratchPad, IsAdmin() == TRUE) == 0) { RunAsAdmin(ILibScratchPad, 1); }
if (closeButtonTextSet != 0) { SetWindowTextW(GetDlgItem(hDlg, IDCANCEL), closeButtonText); }
if (closeButtonTextSet != 0) { SetWindowTextW(GetDlgItem(hDlg, IDCLOSE), closeButtonText); }
return (INT_PTR)TRUE;
}
break;
@@ -1224,6 +1278,49 @@ INT_PTR CALLBACK DialogHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
#endif
// Message handler for details dialog box.
INT_PTR CALLBACK DialogHandler2(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char *fileName = NULL, *meshname = NULL, *meshid = NULL, *serverid = NULL, *serverurl = NULL, *installFlags = NULL, *mshfile = NULL;
char *displayName = NULL, *meshServiceName = NULL;
int hiddenButtons = 0; // Flags: 1 if "Connect" is hidden, 2 if "Uninstall" is hidden, 4 is "Install is hidden"
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_CTLCOLORDLG: {
// Set the background of the dialog box to blue
if (DialogBackgroundBrush == NULL) {
DialogBackgroundBrush = CreateSolidBrush(RGB(0, 54, 105));
}
return (INT_PTR)DialogBackgroundBrush;
}
case WM_CTLCOLORSTATIC: {
// Set the left text to white over transparent
SetBkMode((HDC)wParam, TRANSPARENT);
SetTextColor((HDC)wParam, RGB(255, 255, 255));
return (INT_PTR)GetStockObject(NULL_BRUSH);
break;
}
case WM_INITDIALOG:
{
break;
}
case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCLOSE || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
}
}
return (INT_PTR)FALSE;
}
#ifdef _MINCORE
BOOL WINAPI AreFileApisANSI(void) { return FALSE; }
VOID WINAPI FatalAppExitA(_In_ UINT uAction, _In_ LPCSTR lpMessageText) {}

BIN
meshservice/mc.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

View File

@@ -2,8 +2,9 @@
// Microsoft Visual C++ generated include file.
// Used by MeshService.rc
//
#define IDI_ICON1 101
#define IDD_INSTALLDIALOG 103
#define IDB_BITMAP_MC 108
#define IDD_DETAILSDIALOG 111
#define IDC_BUTTON2 1002
#define IDC_INSTALLBUTTON 1002
#define IDC_BUTTON3 1004
@@ -25,14 +26,19 @@
#define IDC_MESH_IDENTIFIER 1016
#define IDC_SERVER_IDENTIFIER 1017
#define IDC_DESCRIPTION 1018
#define IDC_TAB2 1021
#define IDC_TABS 1021
#define IDC_STATIC_LEFTTEXT 1022
#define IDC_STATIC_LINE 1024
#define IDC_DETAILSBUTTON 1031
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 106
#define _APS_NEXT_RESOURCE_VALUE 113
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1019
#define _APS_NEXT_CONTROL_VALUE 1032
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

2
meshservice/stdafx.h Normal file
View File

@@ -0,0 +1,2 @@
#pragma once
#include <afxcontrolbars.h>

View File

@@ -1,3 +1,3 @@
// This file is auto-generated, any edits may be overwritten
#define SOURCE_COMMIT_DATE "2021-Jul-11 11:42:24-0700"
#define SOURCE_COMMIT_HASH "5618516cb96f22a24ae06fc910a61cfeb2d9eaa9"
#define SOURCE_COMMIT_DATE "2022-Jan-17 15:14:56-0800"
#define SOURCE_COMMIT_HASH "44edd37fdbf2650de46cd04653525add37a15c6b"