- if (_sntprintf_s(registry, _countof(registry), _TRUNCATE, NSSM_REGISTRY, service->name) < 0) {\r
- log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("NSSM_REGISTRY"), _T("get_parameters()"), 0);\r
+ HKEY key;\r
+ int ret;\r
+\r
+ if (sub) ret = _sntprintf_s(registry, _countof(registry), _TRUNCATE, NSSM_REGISTRY _T("\\%s"), service_name, sub);\r
+ else ret = _sntprintf_s(registry, _countof(registry), _TRUNCATE, NSSM_REGISTRY, service_name);\r
+ if (ret < 0) {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("NSSM_REGISTRY"), _T("open_registry()"), 0);\r
+ return 0;\r
+ }\r
+\r
+ if (sam & KEY_WRITE) {\r
+ if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, registry, 0, 0, REG_OPTION_NON_VOLATILE, sam, 0, &key, 0) != ERROR_SUCCESS) {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OPENKEY_FAILED, registry, error_string(GetLastError()), 0);\r
+ return 0;\r
+ }\r
+ }\r
+ else {\r
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, registry, 0, sam, &key) != ERROR_SUCCESS) {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OPENKEY_FAILED, registry, error_string(GetLastError()), 0);\r
+ return 0;\r
+ }\r
+ }\r
+\r
+ return key;\r
+}\r
+\r
+HKEY open_registry(const TCHAR *service_name, REGSAM sam) {\r
+ return open_registry(service_name, 0, sam);\r
+}\r
+\r
+int get_io_parameters(nssm_service_t *service, HKEY key) {\r
+ /* stdin */\r
+ if (get_createfile_parameters(key, NSSM_REG_STDIN, service->stdin_path, &service->stdin_sharing, NSSM_STDIN_SHARING, &service->stdin_disposition, NSSM_STDIN_DISPOSITION, &service->stdin_flags, NSSM_STDIN_FLAGS)) {\r
+ service->stdin_sharing = service->stdin_disposition = service->stdin_flags = 0;\r
+ ZeroMemory(service->stdin_path, _countof(service->stdin_path) * sizeof(TCHAR));\r