#include "nssm.h"\r
\r
-static enum { NSSM_TAB_APPLICATION, NSSM_TAB_DETAILS, NSSM_TAB_LOGON, NSSM_TAB_DEPENDENCIES, NSSM_TAB_PROCESS, NSSM_TAB_SHUTDOWN, NSSM_TAB_EXIT, NSSM_TAB_IO, NSSM_TAB_ROTATION, NSSM_TAB_ENVIRONMENT, NSSM_TAB_HOOKS, NSSM_NUM_TABS };\r
+extern const TCHAR *hook_event_strings[];\r
+extern const TCHAR *hook_action_strings[];\r
+\r
+static enum { NSSM_TAB_APPLICATION, NSSM_TAB_DETAILS, NSSM_TAB_LOGON, NSSM_TAB_DEPENDENCIES, NSSM_TAB_PROCESS, NSSM_TAB_SHUTDOWN, NSSM_TAB_EXIT, NSSM_TAB_IO, NSSM_TAB_ROTATION, NSSM_TAB_ENVIRONMENT, NSSM_TAB_HOOKS, NSSM_NUM_TABS } nssm_tabs;\r
static HWND tablist[NSSM_NUM_TABS];\r
-static const TCHAR *hook_event_strings[] = { NSSM_HOOK_EVENT_START, NSSM_HOOK_EVENT_STOP, NSSM_HOOK_EVENT_EXIT, NSSM_HOOK_EVENT_POWER, NSSM_HOOK_EVENT_ROTATE, NULL };\r
-static const TCHAR *hook_action_strings[] = { NSSM_HOOK_ACTION_PRE, NSSM_HOOK_ACTION_POST, NSSM_HOOK_ACTION_CHANGE, NSSM_HOOK_ACTION_RESUME, NULL };\r
static int selected_tab;\r
\r
static HWND dialog(const TCHAR *templ, HWND parent, DLGPROC function, LPARAM l) {\r
return dialog(templ, parent, function, 0);\r
}\r
\r
+static inline void set_logon_enabled(unsigned char interact_enabled, unsigned char credentials_enabled) {\r
+ EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_INTERACT), interact_enabled);\r
+ EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_USERNAME), credentials_enabled);\r
+ EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD1), credentials_enabled);\r
+ EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2), credentials_enabled);\r
+}\r
+\r
int nssm_gui(int resource, nssm_service_t *service) {\r
/* Create window */\r
HWND dlg = dialog(MAKEINTRESOURCE(resource), 0, nssm_dlg, (LPARAM) service);\r
\r
/* Log on tab. */\r
if (service->username) {\r
- CheckRadioButton(tablist[NSSM_TAB_LOGON], IDC_LOCALSYSTEM, IDC_ACCOUNT, IDC_ACCOUNT);\r
- SetDlgItemText(tablist[NSSM_TAB_LOGON], IDC_USERNAME, service->username);\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_INTERACT), 0);\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_USERNAME), 1);\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD1), 1);\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2), 1);\r
+ if (is_virtual_account(service->name, service->username)) {\r
+ CheckRadioButton(tablist[NSSM_TAB_LOGON], IDC_LOCALSYSTEM, IDC_VIRTUAL_SERVICE, IDC_VIRTUAL_SERVICE);\r
+ set_logon_enabled(0, 0);\r
+ }\r
+ else {\r
+ CheckRadioButton(tablist[NSSM_TAB_LOGON], IDC_LOCALSYSTEM, IDC_VIRTUAL_SERVICE, IDC_ACCOUNT);\r
+ SetDlgItemText(tablist[NSSM_TAB_LOGON], IDC_USERNAME, service->username);\r
+ set_logon_enabled(0, 1);\r
+ }\r
}\r
else {\r
- CheckRadioButton(tablist[NSSM_TAB_LOGON], IDC_LOCALSYSTEM, IDC_ACCOUNT, IDC_LOCALSYSTEM);\r
+ CheckRadioButton(tablist[NSSM_TAB_LOGON], IDC_LOCALSYSTEM, IDC_VIRTUAL_SERVICE, IDC_LOCALSYSTEM);\r
if (service->type & SERVICE_INTERACTIVE_PROCESS) SendDlgItemMessage(tablist[NSSM_TAB_LOGON], IDC_INTERACT, BM_SETCHECK, BST_CHECKED, 0);\r
}\r
\r
SetDlgItemText(tablist[NSSM_TAB_IO], IDC_STDIN, service->stdin_path);\r
SetDlgItemText(tablist[NSSM_TAB_IO], IDC_STDOUT, service->stdout_path);\r
SetDlgItemText(tablist[NSSM_TAB_IO], IDC_STDERR, service->stderr_path);\r
+ if (service->timestamp_log) SendDlgItemMessage(tablist[NSSM_TAB_IO], IDC_TIMESTAMP, BM_SETCHECK, BST_CHECKED, 0);\r
\r
/* Rotation tab. */\r
if (service->stdout_disposition == CREATE_ALWAYS) SendDlgItemMessage(tablist[NSSM_TAB_ROTATION], IDC_TRUNCATE, BM_SETCHECK, BST_CHECKED, 0);\r
SetDlgItemInt(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_SECONDS, service->rotate_seconds, 0);\r
if (! service->rotate_bytes_high) SetDlgItemInt(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_BYTES_LOW, service->rotate_bytes_low, 0);\r
\r
+ /* Hooks tab. */\r
+ if (service->hook_share_output_handles) SendDlgItemMessage(tablist[NSSM_TAB_HOOKS], IDC_REDIRECT_HOOK, BM_SETCHECK, BST_CHECKED, 0);\r
+\r
/* Check if advanced settings are in use. */\r
if (service->stdout_disposition != service->stderr_disposition || (service->stdout_disposition && service->stdout_disposition != NSSM_STDOUT_DISPOSITION && service->stdout_disposition != CREATE_ALWAYS) || (service->stderr_disposition && service->stderr_disposition != NSSM_STDERR_DISPOSITION && service->stderr_disposition != CREATE_ALWAYS)) popup_message(dlg, MB_OK | MB_ICONWARNING, NSSM_GUI_WARN_STDIO);\r
if (service->rotate_bytes_high) popup_message(dlg, MB_OK | MB_ICONWARNING, NSSM_GUI_WARN_ROTATE_BYTES);\r
EnableWindow(GetDlgItem(tablist[NSSM_TAB_SHUTDOWN], dependent), enabled);\r
}\r
\r
-static inline void set_logon_enabled(unsigned char enabled) {\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_INTERACT), ! enabled);\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_USERNAME), enabled);\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD1), enabled);\r
- EnableWindow(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2), enabled);\r
-}\r
-\r
static inline void set_affinity_enabled(unsigned char enabled) {\r
EnableWindow(GetDlgItem(tablist[NSSM_TAB_PROCESS], IDC_AFFINITY), enabled);\r
}\r
SetEnvironmentVariable(hook_name, cmd);\r
}\r
else {\r
- GetEnvironmentVariable(hook_name, cmd, _countof(cmd));\r
+ if (! GetEnvironmentVariable(hook_name, cmd, _countof(cmd))) cmd[0] = _T('\0');\r
SetDlgItemText(tablist[NSSM_TAB_HOOKS], IDC_HOOK, cmd);\r
}\r
}\r
service->username = 0;\r
service->usernamelen = 0;\r
if (service->password) {\r
- SecureZeroMemory(service->password, service->passwordlen);\r
+ SecureZeroMemory(service->password, service->passwordlen * sizeof(TCHAR));\r
HeapFree(GetProcessHeap(), 0, service->password);\r
}\r
service->password = 0;\r
service->passwordlen = 0;\r
}\r
+ else if (SendDlgItemMessage(tablist[NSSM_TAB_LOGON], IDC_VIRTUAL_SERVICE, BM_GETCHECK, 0, 0) & BST_CHECKED) {\r
+ if (service->username) HeapFree(GetProcessHeap(), 0, service->username);\r
+ service->username = virtual_account(service->name);\r
+ if (! service->username) {\r
+ popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("account name"), _T("install()"));\r
+ return 6;\r
+ }\r
+ service->usernamelen = _tcslen(service->username) + 1;\r
+ service->password = 0;\r
+ service->passwordlen = 0;\r
+ }\r
else {\r
/* Username. */\r
service->usernamelen = SendMessage(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_USERNAME), WM_GETTEXTLENGTH, 0, 0);\r
/* Get first password. */\r
if (! GetDlgItemText(tablist[NSSM_TAB_LOGON], IDC_PASSWORD1, service->password, (int) service->passwordlen)) {\r
HeapFree(GetProcessHeap(), 0, password);\r
- SecureZeroMemory(service->password, service->passwordlen);\r
+ SecureZeroMemory(service->password, service->passwordlen * sizeof(TCHAR));\r
HeapFree(GetProcessHeap(), 0, service->password);\r
service->password = 0;\r
service->passwordlen = 0;\r
\r
/* Get confirmation. */\r
if (! GetDlgItemText(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2, password, (int) service->passwordlen)) {\r
- SecureZeroMemory(password, service->passwordlen);\r
+ SecureZeroMemory(password, service->passwordlen * sizeof(TCHAR));\r
HeapFree(GetProcessHeap(), 0, password);\r
- SecureZeroMemory(service->password, service->passwordlen);\r
+ SecureZeroMemory(service->password, service->passwordlen * sizeof(TCHAR));\r
HeapFree(GetProcessHeap(), 0, service->password);\r
service->password = 0;\r
service->passwordlen = 0;\r
/* Compare. */\r
if (_tcsncmp(password, service->password, service->passwordlen)) {\r
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PASSWORD);\r
- SecureZeroMemory(password, service->passwordlen);\r
+ SecureZeroMemory(password, service->passwordlen * sizeof(TCHAR));\r
HeapFree(GetProcessHeap(), 0, password);\r
- SecureZeroMemory(service->password, service->passwordlen);\r
+ SecureZeroMemory(service->password, service->passwordlen * sizeof(TCHAR));\r
HeapFree(GetProcessHeap(), 0, service->password);\r
service->password = 0;\r
service->passwordlen = 0;\r
check_io(window, _T("stdin"), service->stdin_path, _countof(service->stdin_path), IDC_STDIN);\r
check_io(window, _T("stdout"), service->stdout_path, _countof(service->stdout_path), IDC_STDOUT);\r
check_io(window, _T("stderr"), service->stderr_path, _countof(service->stderr_path), IDC_STDERR);\r
+ if (SendDlgItemMessage(tablist[NSSM_TAB_IO], IDC_TIMESTAMP, BM_GETCHECK, 0, 0) & BST_CHECKED) service->timestamp_log = true;\r
+ else service->timestamp_log = false;\r
\r
/* Override stdout and/or stderr. */\r
if (SendDlgItemMessage(tablist[NSSM_TAB_ROTATION], IDC_TRUNCATE, BM_GETCHECK, 0, 0) & BST_CHECKED) {\r
check_number(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_BYTES_LOW, &service->rotate_bytes_low);\r
}\r
\r
+ /* Get hook stuff. */\r
+ if (SendDlgItemMessage(tablist[NSSM_TAB_HOOKS], IDC_REDIRECT_HOOK, BM_GETCHECK, 0, 0) & BST_CHECKED) service->hook_share_output_handles = true;\r
+\r
/* Get environment. */\r
unsigned long envlen = (unsigned long) SendMessage(GetDlgItem(tablist[NSSM_TAB_ENVIRONMENT], IDC_ENVIRONMENT), WM_GETTEXTLENGTH, 0, 0);\r
if (envlen) {\r
\r
case 3:\r
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_SERVICE_NOT_INSTALLED);\r
- return 3;\r
cleanup_nssm_service(service);\r
+ return 3;\r
\r
case 4:\r
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_REMOVE_SERVICE_FAILED);\r
va_start(arg, flags);\r
while (i = va_arg(arg, int)) {\r
TCHAR *localised = message_string(i);\r
- _sntprintf_s((TCHAR *) ofn.lpstrFilter + len, bufsize, _TRUNCATE, localised);\r
+ _sntprintf_s((TCHAR *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, localised);\r
len += _tcslen(localised) + 1;\r
LocalFree(localised);\r
TCHAR *filter = browse_filter(i);\r
\r
/* Log on. */\r
case IDC_LOCALSYSTEM:\r
- set_logon_enabled(0);\r
+ set_logon_enabled(1, 0);\r
+ break;\r
+\r
+ case IDC_VIRTUAL_SERVICE:\r
+ set_logon_enabled(0, 0);\r
break;\r
\r
case IDC_ACCOUNT:\r
- set_logon_enabled(1);\r
+ set_logon_enabled(0, 1);\r
break;\r
\r
/* Affinity. */\r
\r
/* Set defaults. */\r
CheckRadioButton(tablist[NSSM_TAB_LOGON], IDC_LOCALSYSTEM, IDC_ACCOUNT, IDC_LOCALSYSTEM);\r
- set_logon_enabled(0);\r
+ set_logon_enabled(1, 0);\r
\r
/* Dependencies tab. */\r
tab.pszText = message_string(NSSM_GUI_TAB_DEPENDENCIES);\r
tablist[NSSM_TAB_IO] = dialog(MAKEINTRESOURCE(IDD_IO), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_IO], SW_HIDE);\r
\r
+ /* Set defaults. */\r
+ SendDlgItemMessage(tablist[NSSM_TAB_IO], IDC_TIMESTAMP, BM_SETCHECK, BST_UNCHECKED, 0);\r
+\r
/* Rotation tab. */\r
tab.pszText = message_string(NSSM_GUI_TAB_ROTATION);\r
tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_EXIT));\r
SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_POWER));\r
SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_ROTATE));\r
+ SendDlgItemMessage(tablist[NSSM_TAB_HOOKS], IDC_REDIRECT_HOOK, BM_SETCHECK, BST_UNCHECKED, 0);\r
if (_tcslen(service->name)) {\r
TCHAR hook_name[HOOK_NAME_LENGTH];\r
TCHAR cmd[CMD_LENGTH];\r