X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=service.cpp;h=abe745a532727866ef1c539fcab75d7e7e384b04;hb=b3ffb297ad1e4a2eb1142789519f463c6a464b7d;hp=2f1ceb02d91b775a6f4f6e355159eff3c0b570f2;hpb=1c7716c9a9bf3e8dd844fd27d1351dab6ceaf510;p=nssm.git diff --git a/service.cpp b/service.cpp index 2f1ceb0..abe745a 100644 --- a/service.cpp +++ b/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; } @@ -377,6 +386,7 @@ int pre_edit_service(int argc, TCHAR **argv) { if (QueryServiceConfig2(service->handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, (unsigned char *) info, bufsize, &bufsize)) { if (info->fDelayedAutostart) service->startup = NSSM_STARTUP_DELAYED; + HeapFree(GetProcessHeap(), 0, info); } else { error = GetLastError();