From 66861c12e7d515f4d0e779102780d89e3fcd2a12 Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Sun, 8 Mar 2015 16:45:55 +0000 Subject: [PATCH] Abstracted open_registry(). Added service_registry_path() to construct a registry path for a service which may contain the Parameters subkey and optional sub-subkey. If no Parameters subkey is needed the constructed path references the native service parameters. The open_registry() function is now a wrapper around the new open_registry_key() function which opens an arbitrary key. The new open_service_resgistry() function also wraps open_registry_key() to access native parameters. --- registry.cpp | 42 +++++++++++++++++++++++++++++++++--------- registry.h | 4 +++- settings.cpp | 20 ++++++++++++++++++++ settings.h | 1 + 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/registry.cpp b/registry.cpp index 5a4c652..5953f8a 100644 --- a/registry.cpp +++ b/registry.cpp @@ -456,18 +456,20 @@ void override_milliseconds(TCHAR *service_name, HKEY key, TCHAR *value, unsigned if (! ok) *buffer = default_value; } -HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam, bool must_exist) { - /* Get registry */ - TCHAR registry[KEY_LENGTH]; - HKEY key; +static int service_registry_path(const TCHAR *service_name, bool parameters, const TCHAR *sub, TCHAR *buffer, unsigned long buflen) { int ret; - if (sub) ret = _sntprintf_s(registry, _countof(registry), _TRUNCATE, NSSM_REGISTRY _T("\\%s"), service_name, sub); - else ret = _sntprintf_s(registry, _countof(registry), _TRUNCATE, NSSM_REGISTRY, service_name); - if (ret < 0) { - log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("NSSM_REGISTRY"), _T("open_registry()"), 0); - return 0; + if (parameters) { + if (sub) ret = _sntprintf_s(buffer, buflen, _TRUNCATE, NSSM_REGISTRY _T("\\") NSSM_REG_PARAMETERS _T("\\%s"), service_name, sub); + else ret = _sntprintf_s(buffer, buflen, _TRUNCATE, NSSM_REGISTRY _T("\\") NSSM_REG_PARAMETERS, service_name); } + else ret = _sntprintf_s(buffer, buflen, _TRUNCATE, NSSM_REGISTRY, service_name); + + return ret; +} + +static HKEY open_registry_key(const TCHAR *registry, REGSAM sam, bool must_exist) { + HKEY key; if (sam & KEY_SET_VALUE) { if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, registry, 0, 0, REG_OPTION_NON_VOLATILE, sam, 0, &key, 0) != ERROR_SUCCESS) { @@ -487,6 +489,28 @@ HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam, bool return key; } +HKEY open_service_registry(const TCHAR *service_name, REGSAM sam, bool must_exist) { + /* Get registry */ + TCHAR registry[KEY_LENGTH]; + if (service_registry_path(service_name, false, 0, registry, _countof(registry)) < 0) { + log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, NSSM_REGISTRY, _T("open_service_registry()"), 0); + return 0; + } + + return open_registry_key(registry, sam, must_exist); +} + +HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam, bool must_exist) { + /* Get registry */ + TCHAR registry[KEY_LENGTH]; + if (service_registry_path(service_name, true, sub, registry, _countof(registry)) < 0) { + log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, NSSM_REGISTRY, _T("open_registry()"), 0); + return 0; + } + + return open_registry_key(registry, sam, must_exist); +} + HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam) { return open_registry(service_name, sub, sam, true); } diff --git a/registry.h b/registry.h index 1649bdf..394a49f 100644 --- a/registry.h +++ b/registry.h @@ -1,7 +1,8 @@ #ifndef REGISTRY_H #define REGISTRY_H -#define NSSM_REGISTRY _T("SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters") +#define NSSM_REGISTRY _T("SYSTEM\\CurrentControlSet\\Services\\%s") +#define NSSM_REG_PARAMETERS _T("Parameters") #define NSSM_REGISTRY_GROUPS _T("SYSTEM\\CurrentControlSet\\Control\\ServiceGroupOrder") #define NSSM_REG_GROUPS _T("List") #define NSSM_REG_EXE _T("Application") @@ -36,6 +37,7 @@ #define NSSM_REG_HOOK _T("AppEvents") #define NSSM_STDIO_LENGTH 29 +HKEY open_service_registry(const TCHAR *, REGSAM sam, bool); HKEY open_registry(const TCHAR *, const TCHAR *, REGSAM sam, bool); HKEY open_registry(const TCHAR *, const TCHAR *, REGSAM sam); HKEY open_registry(const TCHAR *, REGSAM sam); diff --git a/settings.cpp b/settings.cpp index c77c1c9..cbded45 100644 --- a/settings.cpp +++ b/settings.cpp @@ -726,6 +726,25 @@ int native_get_displayname(const TCHAR *service_name, void *param, const TCHAR * return ret; } +int native_set_environment(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) { + HKEY key = open_service_registry(service_name, KEY_SET_VALUE, false); + if (! key) return -1; + + int ret = setting_set_environment(service_name, (void *) key, NSSM_NATIVE_ENVIRONMENT, default_value, value, additional); + RegCloseKey(key); + return ret; +} + +int native_get_environment(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) { + HKEY key = open_service_registry(service_name, KEY_READ, false); + if (! key) return -1; + + ZeroMemory(value, sizeof(value_t)); + int ret = setting_get_environment(service_name, (void *) key, NSSM_NATIVE_ENVIRONMENT, default_value, value, additional); + RegCloseKey(key); + return ret; +} + int native_set_imagepath(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) { SC_HANDLE service_handle = (SC_HANDLE) param; if (! service_handle) return -1; @@ -1101,6 +1120,7 @@ settings_t settings[] = { { NSSM_NATIVE_DEPENDONSERVICE, REG_MULTI_SZ, NULL, true, ADDITIONAL_CRLF, native_set_dependonservice, native_get_dependonservice }, { NSSM_NATIVE_DESCRIPTION, REG_SZ, _T(""), true, 0, native_set_description, native_get_description }, { NSSM_NATIVE_DISPLAYNAME, REG_SZ, NULL, true, 0, native_set_displayname, native_get_displayname }, + { NSSM_NATIVE_ENVIRONMENT, REG_MULTI_SZ, NULL, true, ADDITIONAL_CRLF, native_set_environment, native_get_environment }, { NSSM_NATIVE_IMAGEPATH, REG_EXPAND_SZ, NULL, true, 0, native_set_imagepath, native_get_imagepath }, { NSSM_NATIVE_OBJECTNAME, REG_SZ, NSSM_LOCALSYSTEM_ACCOUNT, true, 0, native_set_objectname, native_get_objectname }, { NSSM_NATIVE_NAME, REG_SZ, NULL, true, 0, native_set_name, native_get_name }, diff --git a/settings.h b/settings.h index a629839..2fcffa5 100644 --- a/settings.h +++ b/settings.h @@ -5,6 +5,7 @@ #define NSSM_NATIVE_DEPENDONSERVICE _T("DependOnService") #define NSSM_NATIVE_DESCRIPTION _T("Description") #define NSSM_NATIVE_DISPLAYNAME _T("DisplayName") +#define NSSM_NATIVE_ENVIRONMENT _T("Environment") #define NSSM_NATIVE_IMAGEPATH _T("ImagePath") #define NSSM_NATIVE_NAME _T("Name") #define NSSM_NATIVE_OBJECTNAME _T("ObjectName") -- 2.20.1