+\r
+int set_hook(const TCHAR *service_name, const TCHAR *hook_event, const TCHAR *hook_action, TCHAR *cmd) {\r
+ /* Try to open the registry */\r
+ TCHAR registry[KEY_LENGTH];\r
+ if (_sntprintf_s(registry, _countof(registry), _TRUNCATE, _T("%s\\%s"), NSSM_REG_HOOK, hook_event) < 0) {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("hook registry"), _T("set_hook()"), 0);\r
+ return 1;\r
+ }\r
+\r
+ HKEY key;\r
+ long error;\r
+\r
+ /* Don't create keys needlessly. */\r
+ if (! _tcslen(cmd)) {\r
+ key = open_registry(service_name, registry, KEY_READ, false);\r
+ if (! key) return 0;\r
+ error = RegQueryValueEx(key, hook_action, 0, 0, 0, 0);\r
+ RegCloseKey(key);\r
+ if (error == ERROR_FILE_NOT_FOUND) return 0;\r
+ }\r
+\r
+ key = open_registry(service_name, registry, KEY_WRITE);\r
+ if (! key) return 1;\r
+\r
+ int ret = 1;\r
+ if (_tcslen(cmd)) ret = set_string(key, (TCHAR *) hook_action, cmd, true);\r
+ else {\r
+ error = RegDeleteValue(key, hook_action);\r
+ if (error == ERROR_SUCCESS || error == ERROR_FILE_NOT_FOUND) ret = 0;\r
+ }\r
+\r
+ /* Close registry */\r
+ RegCloseKey(key);\r
+\r
+ return ret;\r
+}\r
+\r
+int get_hook(const TCHAR *service_name, const TCHAR *hook_event, const TCHAR *hook_action, TCHAR *buffer, unsigned long buflen) {\r
+ /* Try to open the registry */\r
+ TCHAR registry[KEY_LENGTH];\r
+ if (_sntprintf_s(registry, _countof(registry), _TRUNCATE, _T("%s\\%s"), NSSM_REG_HOOK, hook_event) < 0) {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("hook registry"), _T("get_hook()"), 0);\r
+ return 1;\r
+ }\r
+ HKEY key = open_registry(service_name, registry, KEY_READ, false);\r
+ if (! key) return 1;\r
+\r
+ int ret = expand_parameter(key, (TCHAR *) hook_action, buffer, buflen, true, false);\r
+\r
+ /* Close registry */\r
+ RegCloseKey(key);\r
+\r
+ return ret;\r
+}\r