Added quote().
[nssm.git] / service.cpp
index b3b0c62..164fbc0 100644 (file)
@@ -653,8 +653,6 @@ int get_service_description(const TCHAR *service_name, SC_HANDLE service_handle,
     print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG2_FAILED, service_name, _T("SERVICE_CONFIG_DESCRIPTION"), error_string(error));\r
     return 4;\r
   }\r
-\r
-  return 0;\r
 }\r
 \r
 int get_service_startup(const TCHAR *service_name, SC_HANDLE service_handle, const QUERY_SERVICE_CONFIG *qsc, unsigned long *startup) {\r
@@ -762,7 +760,7 @@ void cleanup_nssm_service(nssm_service_t *service) {
   if (! service) return;\r
   if (service->username) HeapFree(GetProcessHeap(), 0, service->username);\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
   if (service->dependencies) HeapFree(GetProcessHeap(), 0, service->dependencies);\r
@@ -1723,15 +1721,7 @@ int start_service(nssm_service_t *service) {
   service->status.dwControlsAccepted = SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;\r
   SetServiceStatus(service->status_handle, &service->status);\r
 \r
-  /* Pre-start hook. */\r
   unsigned long control = NSSM_SERVICE_CONTROL_START;\r
-  if (nssm_hook(&hook_threads, service, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, &control, NSSM_SERVICE_STATUS_DEADLINE, false) == NSSM_HOOK_STATUS_ABORT) {\r
-    TCHAR code[16];\r
-    _sntprintf_s(code, _countof(code), _TRUNCATE, _T("%lu"), NSSM_HOOK_STATUS_ABORT);\r
-    log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_PRESTART_HOOK_ABORT, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, service->name, code, 0);\r
-    unset_service_environment(service);\r
-    return stop_service(service, 5, true, true);\r
-  }\r
 \r
   /* Did another thread receive a stop control? */\r
   if (service->allow_restart) {\r
@@ -1744,6 +1734,15 @@ int start_service(nssm_service_t *service) {
       return stop_service(service, 4, true, true);\r
     }\r
 \r
+    /* Pre-start hook. May need I/O to have been redirected already. */\r
+    if (nssm_hook(&hook_threads, service, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, &control, NSSM_SERVICE_STATUS_DEADLINE, false) == NSSM_HOOK_STATUS_ABORT) {\r
+      TCHAR code[16];\r
+      _sntprintf_s(code, _countof(code), _TRUNCATE, _T("%lu"), NSSM_HOOK_STATUS_ABORT);\r
+      log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_PRESTART_HOOK_ABORT, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, service->name, code, 0);\r
+      unset_service_environment(service);\r
+      return stop_service(service, 5, true, true);\r
+    }\r
+\r
     /* The pre-start hook will have cleaned the environment. */\r
     set_service_environment(service);\r
 \r
@@ -1982,7 +1981,6 @@ void CALLBACK end_service(void *arg, unsigned char why) {
       wait_for_hooks(service, false);\r
       free_imports();\r
       exit(exitcode);\r
-    break;\r
   }\r
 }\r
 \r