void set_nssm_service_defaults(nssm_service_t *service) {\r
if (! service) return;\r
\r
+ service->type = SERVICE_WIN32_OWN_PROCESS;\r
service->stdin_sharing = NSSM_STDIN_SHARING;\r
service->stdin_disposition = NSSM_STDIN_DISPOSITION;\r
service->stdin_flags = NSSM_STDIN_FLAGS;\r
/* Free memory for a service. */\r
void cleanup_nssm_service(nssm_service_t *service) {\r
if (! service) return;\r
+ if (service->username) HeapFree(GetProcessHeap(), 0, service->username);\r
+ if (service->password) {\r
+ SecureZeroMemory(service->password, service->passwordlen);\r
+ HeapFree(GetProcessHeap(), 0, service->password);\r
+ }\r
if (service->env) HeapFree(GetProcessHeap(), 0, service->env);\r
if (service->env_extra) HeapFree(GetProcessHeap(), 0, service->env_extra);\r
if (service->handle) CloseServiceHandle(service->handle);\r
TCHAR command[MAX_PATH];\r
GetModuleFileName(0, command, _countof(command));\r
\r
+ /*\r
+ The only two valid flags for service type are SERVICE_WIN32_OWN_PROCESS\r
+ and SERVICE_INTERACTIVE_PROCESS.\r
+ */\r
+ service->type &= SERVICE_INTERACTIVE_PROCESS;\r
+ service->type |= SERVICE_WIN32_OWN_PROCESS;\r
+\r
/* Startup type. */\r
unsigned long startup;\r
switch (service->startup) {\r
if (! service->displayname[0]) _sntprintf_s(service->displayname, _countof(service->displayname), _TRUNCATE, _T("%s"), service->name);\r
\r
/* Create the service */\r
- service->handle = CreateService(services, service->name, service->displayname, SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, startup, SERVICE_ERROR_NORMAL, command, 0, 0, 0, 0, 0);\r
+ service->handle = CreateService(services, service->name, service->displayname, SC_MANAGER_ALL_ACCESS, service->type, startup, SERVICE_ERROR_NORMAL, command, 0, 0, 0, service->username, service->password);\r
if (! service->handle) {\r
print_message(stderr, NSSM_MESSAGE_CREATESERVICE_FAILED);\r
CloseServiceHandle(services);\r