static HWND tablist[NSSM_NUM_TABS];\r
static int selected_tab;\r
\r
+static HWND dialog(const TCHAR *templ, HWND parent, DLGPROC function, LPARAM l) {\r
+ /* The caller will deal with GetLastError()... */\r
+ HRSRC resource = FindResourceEx(0, RT_DIALOG, templ, GetUserDefaultLangID());\r
+ if (! resource) {\r
+ if (GetLastError() != ERROR_RESOURCE_LANG_NOT_FOUND) return 0;\r
+ resource = FindResourceEx(0, RT_DIALOG, templ, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));\r
+ if (! resource) return 0;\r
+ }\r
+\r
+ HGLOBAL ret = LoadResource(0, resource);\r
+ if (! ret) return 0;\r
+\r
+ return CreateDialogIndirectParam(0, (DLGTEMPLATE *) ret, parent, function, l);\r
+}\r
+\r
+static HWND dialog(const TCHAR *templ, HWND parent, DLGPROC function) {\r
+ return dialog(templ, parent, function, 0);\r
+}\r
+\r
int nssm_gui(int resource, nssm_service_t *service) {\r
/* Create window */\r
- HWND dlg = CreateDialogParam(0, MAKEINTRESOURCE(resource), 0, nssm_dlg, (LPARAM) service);\r
+ HWND dlg = dialog(MAKEINTRESOURCE(resource), 0, nssm_dlg, (LPARAM) service);\r
if (! dlg) {\r
popup_message(MB_OK, NSSM_GUI_CREATEDIALOG_FAILED, error_string(GetLastError()));\r
return 1;\r
}\r
\r
if (envlen) {\r
- /* Replace NULL with CRLF. Leave NULL NULL as the end marker. */\r
- unsigned long i, j;\r
- unsigned long newlen = envlen;\r
- for (i = 0; i < envlen; i++) if (! env[i] && env[i + 1]) newlen++;\r
-\r
- TCHAR *formatted = (TCHAR *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newlen * sizeof(TCHAR));\r
- if (formatted) {\r
- for (i = 0, j = 0; i < envlen; i++) {\r
- formatted[j] = env[i];\r
- if (! env[i]) {\r
- if (env[i + 1]) {\r
- formatted[j] = _T('\r');\r
- formatted[++j] = _T('\n');\r
- }\r
- }\r
- j++;\r
- }\r
+ TCHAR *formatted;\r
+ unsigned long newlen;\r
+ if (format_environment(env, envlen, &formatted, &newlen)) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("nssm_dlg()"));\r
+ }\r
+ else {\r
SetDlgItemText(tablist[NSSM_TAB_ENVIRONMENT], IDC_ENVIRONMENT, formatted);\r
HeapFree(GetProcessHeap(), 0, formatted);\r
}\r
- else popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("nssm_dlg()"));\r
}\r
if (service->envlen && service->env_extralen) popup_message(MB_OK | MB_ICONWARNING, NSSM_GUI_WARN_ENVIRONMENT);\r
}\r
service->username = 0;\r
service->usernamelen = 0;\r
}\r
- else if (! orig_service || ! orig_service->username || ! str_equiv(service->username, orig_service->username)) {\r
+ else {\r
/* Password. */\r
service->passwordlen = SendMessage(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD1), WM_GETTEXTLENGTH, 0, 0);\r
- if (! service->passwordlen) {\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PASSWORD);\r
- return 6;\r
- }\r
- if (SendMessage(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2), WM_GETTEXTLENGTH, 0, 0) != service->passwordlen) {\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PASSWORD);\r
- return 6;\r
- }\r
- service->passwordlen++;\r
-\r
- /* Temporary buffer for password validation. */\r
- TCHAR *password = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, service->passwordlen * sizeof(TCHAR));\r
- if (! password) {\r
- HeapFree(GetProcessHeap(), 0, service->username);\r
- service->username = 0;\r
- service->usernamelen = 0;\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("password confirmation"), _T("install()"));\r
- return 6;\r
- }\r
+ size_t passwordlen = SendMessage(GetDlgItem(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2), WM_GETTEXTLENGTH, 0, 0);\r
\r
- /* Actual password buffer. */\r
- service->password = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, service->passwordlen * sizeof(TCHAR));\r
- if (! service->password) {\r
- HeapFree(GetProcessHeap(), 0, password);\r
- HeapFree(GetProcessHeap(), 0, service->username);\r
- service->username = 0;\r
- service->usernamelen = 0;\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("password"), _T("install()"));\r
- return 6;\r
- }\r
+ if (! orig_service || ! orig_service->username || ! str_equiv(service->username, orig_service->username) || service->passwordlen || passwordlen) {\r
+ if (! service->passwordlen) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PASSWORD);\r
+ return 6;\r
+ }\r
+ if (passwordlen != service->passwordlen) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PASSWORD);\r
+ return 6;\r
+ }\r
+ service->passwordlen++;\r
+\r
+ /* Temporary buffer for password validation. */\r
+ TCHAR *password = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, service->passwordlen * sizeof(TCHAR));\r
+ if (! password) {\r
+ HeapFree(GetProcessHeap(), 0, service->username);\r
+ service->username = 0;\r
+ service->usernamelen = 0;\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("password confirmation"), _T("install()"));\r
+ return 6;\r
+ }\r
\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
- HeapFree(GetProcessHeap(), 0, service->password);\r
- service->password = 0;\r
- service->passwordlen = 0;\r
- HeapFree(GetProcessHeap(), 0, service->username);\r
- service->username = 0;\r
- service->usernamelen = 0;\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_PASSWORD);\r
- return 6;\r
- }\r
+ /* Actual password buffer. */\r
+ service->password = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, service->passwordlen * sizeof(TCHAR));\r
+ if (! service->password) {\r
+ HeapFree(GetProcessHeap(), 0, password);\r
+ HeapFree(GetProcessHeap(), 0, service->username);\r
+ service->username = 0;\r
+ service->usernamelen = 0;\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("password"), _T("install()"));\r
+ return 6;\r
+ }\r
\r
- /* Get confirmation. */\r
- if (! GetDlgItemText(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2, password, (int) service->passwordlen)) {\r
- SecureZeroMemory(password, service->passwordlen);\r
- HeapFree(GetProcessHeap(), 0, password);\r
- SecureZeroMemory(service->password, service->passwordlen);\r
- HeapFree(GetProcessHeap(), 0, service->password);\r
- service->password = 0;\r
- service->passwordlen = 0;\r
- HeapFree(GetProcessHeap(), 0, service->username);\r
- service->username = 0;\r
- service->usernamelen = 0;\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_PASSWORD);\r
- return 6;\r
- }\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
+ HeapFree(GetProcessHeap(), 0, service->password);\r
+ service->password = 0;\r
+ service->passwordlen = 0;\r
+ HeapFree(GetProcessHeap(), 0, service->username);\r
+ service->username = 0;\r
+ service->usernamelen = 0;\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_PASSWORD);\r
+ return 6;\r
+ }\r
\r
- /* Compare. */\r
- if (_tcsncmp(password, service->password, service->passwordlen)) {\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PASSWORD);\r
- SecureZeroMemory(password, service->passwordlen);\r
- HeapFree(GetProcessHeap(), 0, password);\r
- SecureZeroMemory(service->password, service->passwordlen);\r
- HeapFree(GetProcessHeap(), 0, service->password);\r
- service->password = 0;\r
- service->passwordlen = 0;\r
- HeapFree(GetProcessHeap(), 0, service->username);\r
- service->username = 0;\r
- service->usernamelen = 0;\r
- return 6;\r
+ /* Get confirmation. */\r
+ if (! GetDlgItemText(tablist[NSSM_TAB_LOGON], IDC_PASSWORD2, password, (int) service->passwordlen)) {\r
+ SecureZeroMemory(password, service->passwordlen);\r
+ HeapFree(GetProcessHeap(), 0, password);\r
+ SecureZeroMemory(service->password, service->passwordlen);\r
+ HeapFree(GetProcessHeap(), 0, service->password);\r
+ service->password = 0;\r
+ service->passwordlen = 0;\r
+ HeapFree(GetProcessHeap(), 0, service->username);\r
+ service->username = 0;\r
+ service->usernamelen = 0;\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_PASSWORD);\r
+ return 6;\r
+ }\r
+\r
+ /* Compare. */\r
+ if (_tcsncmp(password, service->password, service->passwordlen)) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PASSWORD);\r
+ SecureZeroMemory(password, service->passwordlen);\r
+ HeapFree(GetProcessHeap(), 0, password);\r
+ SecureZeroMemory(service->password, service->passwordlen);\r
+ HeapFree(GetProcessHeap(), 0, service->password);\r
+ service->password = 0;\r
+ service->passwordlen = 0;\r
+ HeapFree(GetProcessHeap(), 0, service->username);\r
+ service->username = 0;\r
+ service->usernamelen = 0;\r
+ return 6;\r
+ }\r
}\r
}\r
}\r
return 5;\r
}\r
\r
- /* Strip CR and replace LF with NULL. */\r
- unsigned long newlen = 0;\r
- unsigned long i, j;\r
- for (i = 0; i < envlen; i++) if (env[i] != _T('\r')) newlen++;\r
- /* Must end with two NULLs. */\r
- newlen += 2;\r
-\r
- TCHAR *newenv = (TCHAR *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newlen * sizeof(TCHAR));\r
- if (! newenv) {\r
+ TCHAR *newenv;\r
+ unsigned long newlen;\r
+ if (unformat_environment(env, envlen, &newenv, &newlen)) {\r
HeapFree(GetProcessHeap(), 0, env);\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("install()"));\r
cleanup_nssm_service(service);\r
return 5;\r
}\r
\r
- for (i = 0, j = 0; i < envlen; i++) {\r
- if (env[i] == _T('\r')) continue;\r
- if (env[i] == _T('\n')) newenv[j] = _T('\0');\r
- else newenv[j] = env[i];\r
- j++;\r
- }\r
-\r
HeapFree(GetProcessHeap(), 0, env);\r
env = newenv;\r
envlen = newlen;\r
cleanup_nssm_service(service);\r
return 4;\r
\r
+ case 5:\r
case 6:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_EDIT_PARAMETERS_FAILED);\r
cleanup_nssm_service(service);\r
tab.cchTextMax = (int) _tcslen(tab.pszText);\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_APPLICATION, (LPARAM) &tab);\r
if (service->native) {\r
- tablist[NSSM_TAB_APPLICATION] = CreateDialog(0, MAKEINTRESOURCE(IDD_NATIVE), window, tab_dlg);\r
+ tablist[NSSM_TAB_APPLICATION] = dialog(MAKEINTRESOURCE(IDD_NATIVE), window, tab_dlg);\r
EnableWindow(tablist[NSSM_TAB_APPLICATION], 0);\r
EnableWindow(GetDlgItem(tablist[NSSM_TAB_APPLICATION], IDC_PATH), 0);\r
}\r
- else tablist[NSSM_TAB_APPLICATION] = CreateDialog(0, MAKEINTRESOURCE(IDD_APPLICATION), window, tab_dlg);\r
+ else tablist[NSSM_TAB_APPLICATION] = dialog(MAKEINTRESOURCE(IDD_APPLICATION), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_APPLICATION], SW_SHOW);\r
\r
/* Details tab. */\r
tab.pszText = message_string(NSSM_GUI_TAB_DETAILS);\r
tab.cchTextMax = (int) _tcslen(tab.pszText);\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_DETAILS, (LPARAM) &tab);\r
- tablist[NSSM_TAB_DETAILS] = CreateDialog(0, MAKEINTRESOURCE(IDD_DETAILS), window, tab_dlg);\r
+ tablist[NSSM_TAB_DETAILS] = dialog(MAKEINTRESOURCE(IDD_DETAILS), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_DETAILS], SW_HIDE);\r
\r
/* Set defaults. */\r
tab.pszText = message_string(NSSM_GUI_TAB_LOGON);\r
tab.cchTextMax = (int) _tcslen(tab.pszText);\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_LOGON, (LPARAM) &tab);\r
- tablist[NSSM_TAB_LOGON] = CreateDialog(0, MAKEINTRESOURCE(IDD_LOGON), window, tab_dlg);\r
+ tablist[NSSM_TAB_LOGON] = dialog(MAKEINTRESOURCE(IDD_LOGON), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_LOGON], SW_HIDE);\r
\r
/* Set defaults. */\r
tab.pszText = message_string(NSSM_GUI_TAB_SHUTDOWN);\r
tab.cchTextMax = (int) _tcslen(tab.pszText);\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_SHUTDOWN, (LPARAM) &tab);\r
- tablist[NSSM_TAB_SHUTDOWN] = CreateDialog(0, MAKEINTRESOURCE(IDD_SHUTDOWN), window, tab_dlg);\r
+ tablist[NSSM_TAB_SHUTDOWN] = dialog(MAKEINTRESOURCE(IDD_SHUTDOWN), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_SHUTDOWN], SW_HIDE);\r
\r
/* Set defaults. */\r
tab.pszText = message_string(NSSM_GUI_TAB_EXIT);\r
tab.cchTextMax = (int) _tcslen(tab.pszText);\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_EXIT, (LPARAM) &tab);\r
- tablist[NSSM_TAB_EXIT] = CreateDialog(0, MAKEINTRESOURCE(IDD_APPEXIT), window, tab_dlg);\r
+ tablist[NSSM_TAB_EXIT] = dialog(MAKEINTRESOURCE(IDD_APPEXIT), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_EXIT], SW_HIDE);\r
\r
/* Set defaults. */\r
tab.pszText = message_string(NSSM_GUI_TAB_IO);\r
tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_IO, (LPARAM) &tab);\r
- tablist[NSSM_TAB_IO] = CreateDialog(0, MAKEINTRESOURCE(IDD_IO), window, tab_dlg);\r
+ tablist[NSSM_TAB_IO] = dialog(MAKEINTRESOURCE(IDD_IO), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_IO], SW_HIDE);\r
\r
/* Rotation tab. */\r
tab.pszText = message_string(NSSM_GUI_TAB_ROTATION);\r
tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_ROTATION, (LPARAM) &tab);\r
- tablist[NSSM_TAB_ROTATION] = CreateDialog(0, MAKEINTRESOURCE(IDD_ROTATION), window, tab_dlg);\r
+ tablist[NSSM_TAB_ROTATION] = dialog(MAKEINTRESOURCE(IDD_ROTATION), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_ROTATION], SW_HIDE);\r
\r
/* Set defaults. */\r
tab.pszText = message_string(NSSM_GUI_TAB_ENVIRONMENT);\r
tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_ENVIRONMENT, (LPARAM) &tab);\r
- tablist[NSSM_TAB_ENVIRONMENT] = CreateDialog(0, MAKEINTRESOURCE(IDD_ENVIRONMENT), window, tab_dlg);\r
+ tablist[NSSM_TAB_ENVIRONMENT] = dialog(MAKEINTRESOURCE(IDD_ENVIRONMENT), window, tab_dlg);\r
ShowWindow(tablist[NSSM_TAB_ENVIRONMENT], SW_HIDE);\r
\r
return 1;\r