+ switch (qsc->dwStartType) {\r
+ case SERVICE_DEMAND_START: service->startup = NSSM_STARTUP_MANUAL; break;\r
+ case SERVICE_DISABLED: service->startup = NSSM_STARTUP_DISABLED; break;\r
+ default: service->startup = NSSM_STARTUP_AUTOMATIC;\r
+ }\r
+ if (! str_equiv(qsc->lpServiceStartName, NSSM_LOCALSYSTEM_ACCOUNT)) {\r
+ size_t len = _tcslen(qsc->lpServiceStartName);\r
+ service->username = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR));\r
+ if (service->username) {\r
+ memmove(service->username, qsc->lpServiceStartName, (len + 1) * sizeof(TCHAR));\r
+ service->usernamelen = (unsigned long) len;\r
+ }\r
+ else {\r
+ HeapFree(GetProcessHeap(), 0, qsc);\r
+ CloseHandle(service->handle);\r
+ CloseServiceHandle(services);\r
+ print_message(stderr, NSSM_EVENT_OUT_OF_MEMORY, _T("username"), _T("pre_edit_service()"));\r
+ return 4;\r
+ }\r
+ }\r
+ _sntprintf_s(service->displayname, _countof(service->displayname), _TRUNCATE, _T("%s"), qsc->lpDisplayName);\r
+\r
+ /* Remember the executable in case it isn't NSSM. */\r
+ _sntprintf_s(service->image, _countof(service->image), _TRUNCATE, _T("%s"), qsc->lpBinaryPathName);\r
+ HeapFree(GetProcessHeap(), 0, qsc);\r
+\r
+ /* Get extended system details. */\r
+ if (service->startup == NSSM_STARTUP_AUTOMATIC) {\r
+ QueryServiceConfig2(service->handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, 0, 0, &bufsize);\r
+ error = GetLastError();\r
+ if (error == ERROR_INSUFFICIENT_BUFFER) {\r
+ SERVICE_DELAYED_AUTO_START_INFO *info = (SERVICE_DELAYED_AUTO_START_INFO *) HeapAlloc(GetProcessHeap(), 0, bufsize);\r
+ if (! info) {\r
+ CloseHandle(service->handle);\r
+ CloseServiceHandle(services);\r
+ print_message(stderr, NSSM_EVENT_OUT_OF_MEMORY, _T("SERVICE_DELAYED_AUTO_START_INFO"), _T("pre_edit_service()"));\r
+ return 5;\r
+ }\r
+\r
+ if (QueryServiceConfig2(service->handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, (unsigned char *) info, bufsize, &bufsize)) {\r
+ if (info->fDelayedAutostart) service->startup = NSSM_STARTUP_DELAYED;\r
+ }\r
+ else {\r
+ error = GetLastError();\r
+ if (error != ERROR_INVALID_LEVEL) {\r
+ CloseHandle(service->handle);\r
+ CloseServiceHandle(services);\r
+ print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG2_FAILED, service->name, _T("SERVICE_CONFIG_DELAYED_AUTO_START_INFO"), error_string(error));\r
+ return 5;\r
+ }\r
+ }\r
+ }\r
+ else if (error != ERROR_INVALID_LEVEL) {\r
+ CloseHandle(service->handle);\r
+ CloseServiceHandle(services);\r
+ print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG2_FAILED, service->name, _T("SERVICE_DELAYED_AUTO_START_INFO"), error_string(error));\r
+ return 5;\r
+ }\r
+ }\r
+\r
+ QueryServiceConfig2(service->handle, SERVICE_CONFIG_DESCRIPTION, 0, 0, &bufsize);\r
+ error = GetLastError();\r
+ if (error == ERROR_INSUFFICIENT_BUFFER) {\r
+ SERVICE_DESCRIPTION *description = (SERVICE_DESCRIPTION *) HeapAlloc(GetProcessHeap(), 0, bufsize);\r
+ if (! description) {\r
+ CloseHandle(service->handle);\r
+ CloseServiceHandle(services);\r
+ print_message(stderr, NSSM_EVENT_OUT_OF_MEMORY, _T("SERVICE_CONFIG_DESCRIPTION"), _T("pre_edit_service()"));\r
+ return 6;\r
+ }\r
+\r
+ if (QueryServiceConfig2(service->handle, SERVICE_CONFIG_DESCRIPTION, (unsigned char *) description, bufsize, &bufsize)) {\r
+ if (description->lpDescription) _sntprintf_s(service->description, _countof(service->description), _TRUNCATE, _T("%s"), description->lpDescription);\r
+ HeapFree(GetProcessHeap(), 0, description);\r
+ }\r
+ else {\r
+ HeapFree(GetProcessHeap(), 0, description);\r
+ CloseHandle(service->handle);\r
+ CloseServiceHandle(services);\r
+ print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG2_FAILED, service->name, _T("SERVICE_CONFIG_DELAYED_AUTO_START_INFO"), error_string(error));\r
+ return 6;\r
+ }\r
+ }\r
+ else {\r
+ CloseHandle(service->handle);\r
+ CloseServiceHandle(services);\r
+ print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG2_FAILED, service->name, _T("SERVICE_CONFIG_DELAYED_AUTO_START_INFO"), error_string(error));\r
+ return 6;\r
+ }\r
+\r
+ /* Get NSSM details. */\r
+ get_parameters(service, 0);\r
+\r
+ CloseServiceHandle(services);\r
+\r
+ if (! service->exe[0]) {\r
+ print_message(stderr, NSSM_MESSAGE_INVALID_SERVICE, service->name, NSSM, service->image);\r
+ service->native = true;\r
+ }\r
+\r
+ nssm_gui(IDD_EDIT, service);\r
+\r
+ return 0;\r