Ver código fonte

Moved QueryServiceConfig() to a separate function.

The new function query_service_config() will return a pointer to a
QUERY_SERVICE_CONFIG data structure.
Iain Patterson 10 anos atrás
pai
commit
b6cfe6e22a
2 arquivos alterados com 31 adições e 21 exclusões
  1. 30 21
      service.cpp
  2. 1 0
      service.h

+ 30 - 21
service.cpp

@@ -37,6 +37,34 @@ SC_HANDLE open_service_manager() {
   return ret;
 }
 
+QUERY_SERVICE_CONFIG *query_service_config(const TCHAR *service_name, SC_HANDLE service_handle) {
+  QUERY_SERVICE_CONFIG *qsc;
+  unsigned long bufsize;
+  unsigned long error;
+
+  QueryServiceConfig(service_handle, 0, 0, &bufsize);
+  error = GetLastError();
+  if (error == ERROR_INSUFFICIENT_BUFFER) {
+    qsc = (QUERY_SERVICE_CONFIG *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufsize);
+    if (! qsc) {
+      print_message(stderr, NSSM_MESSAGE_OUT_OF_MEMORY, _T("QUERY_SERVICE_CONFIG"), _T("query_service_config()"), 0);
+      return 0;
+    }
+  }
+  else {
+    print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG_FAILED, service_name, error_string(error), 0);
+    return 0;
+  }
+
+  if (! QueryServiceConfig(service_handle, qsc, bufsize, &bufsize)) {
+    HeapFree(GetProcessHeap(), 0, qsc);
+    print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG_FAILED, service_name, error_string(GetLastError()), 0);
+    return 0;
+  }
+
+  return qsc;
+}
+
 static int grant_logon_as_service(const TCHAR *username) {
   if (str_equiv(username, NSSM_LOCALSYSTEM_ACCOUNT)) return 0;
 
@@ -297,29 +325,10 @@ int pre_edit_service(int argc, TCHAR **argv) {
   /* Get system details. */
   unsigned long bufsize;
   unsigned long error;
-  QUERY_SERVICE_CONFIG *qsc;
-
-  QueryServiceConfig(service->handle, 0, 0, &bufsize);
-  error = GetLastError();
-  if (error == ERROR_INSUFFICIENT_BUFFER) {
-    qsc = (QUERY_SERVICE_CONFIG *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufsize);
-    if (! qsc) {
-      print_message(stderr, NSSM_MESSAGE_OUT_OF_MEMORY, _T("QUERY_SERVICE_CONFIG"), _T("pre_edit_service()"), 0);
-      return 4;
-    }
-  }
-  else {
-    CloseHandle(service->handle);
-    CloseServiceHandle(services);
-    print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG_FAILED, service->name, error_string(error), 0);
-    return 4;
-  }
-
-  if (! QueryServiceConfig(service->handle, qsc, bufsize, &bufsize)) {
-    HeapFree(GetProcessHeap(), 0, qsc);
+  QUERY_SERVICE_CONFIG *qsc = query_service_config(service->name, service->handle);
+  if (! qsc) {
     CloseHandle(service->handle);
     CloseServiceHandle(services);
-    print_message(stderr, NSSM_MESSAGE_QUERYSERVICECONFIG_FAILED, service->name, error_string(GetLastError()), 0);
     return 4;
   }
 

+ 1 - 0
service.h

@@ -89,6 +89,7 @@ nssm_service_t *alloc_nssm_service();
 void set_nssm_service_defaults(nssm_service_t *);
 void cleanup_nssm_service(nssm_service_t *);
 SC_HANDLE open_service_manager();
+QUERY_SERVICE_CONFIG *query_service_config(const TCHAR *, SC_HANDLE);
 int pre_install_service(int, TCHAR **);
 int pre_remove_service(int, TCHAR **);
 int pre_edit_service(int, TCHAR **);