+static inline int hook_env(const TCHAR *hook_event, const TCHAR *hook_action, TCHAR *buffer, unsigned long buflen) {\r
+ return _sntprintf_s(buffer, buflen, _TRUNCATE, _T("NSSM_HOOK_%s_%s"), hook_event, hook_action);\r
+}\r
+\r
+static inline void set_hook_tab(int event_index, int action_index, bool changed) {\r
+ int first_event = NSSM_GUI_HOOK_EVENT_START;\r
+ HWND combo;\r
+ combo = GetDlgItem(tablist[NSSM_TAB_HOOKS], IDC_HOOK_EVENT);\r
+ SendMessage(combo, CB_SETCURSEL, event_index, 0);\r
+ combo = GetDlgItem(tablist[NSSM_TAB_HOOKS], IDC_HOOK_ACTION);\r
+ SendMessage(combo, CB_RESETCONTENT, 0, 0);\r
+\r
+ const TCHAR *hook_event = hook_event_strings[event_index];\r
+ TCHAR *hook_action;\r
+ int i;\r
+ switch (event_index + first_event) {\r
+ case NSSM_GUI_HOOK_EVENT_ROTATE:\r
+ i = 0;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_ROTATE_PRE));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_PRE;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_ROTATE_POST));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_POST;\r
+ break;\r
+\r
+ case NSSM_GUI_HOOK_EVENT_START:\r
+ i = 0;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_START_PRE));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_PRE;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_START_POST));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_POST;\r
+ break;\r
+\r
+ case NSSM_GUI_HOOK_EVENT_STOP:\r
+ i = 0;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_STOP_PRE));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_PRE;\r
+ break;\r
+\r
+ case NSSM_GUI_HOOK_EVENT_EXIT:\r
+ i = 0;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_EXIT_POST));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_POST;\r
+ break;\r
+\r
+ case NSSM_GUI_HOOK_EVENT_POWER:\r
+ i = 0;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_POWER_CHANGE));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_CHANGE;\r
+ SendMessage(combo, CB_INSERTSTRING, i, (LPARAM) message_string(NSSM_GUI_HOOK_ACTION_POWER_RESUME));\r
+ if (action_index == i++) hook_action = NSSM_HOOK_ACTION_RESUME;\r
+ break;\r
+ }\r
+\r
+ SendMessage(combo, CB_SETCURSEL, action_index, 0);\r
+\r
+ TCHAR hook_name[HOOK_NAME_LENGTH];\r
+ hook_env(hook_event, hook_action, hook_name, _countof(hook_name));\r
+\r
+ if (! *hook_name) return;\r
+\r
+ TCHAR cmd[CMD_LENGTH];\r
+ if (changed) {\r
+ GetDlgItemText(tablist[NSSM_TAB_HOOKS], IDC_HOOK, cmd, _countof(cmd));\r
+ SetEnvironmentVariable(hook_name, cmd);\r
+ }\r
+ else {\r
+ GetEnvironmentVariable(hook_name, cmd, _countof(cmd));\r
+ SetDlgItemText(tablist[NSSM_TAB_HOOKS], IDC_HOOK, cmd);\r
+ }\r
+}\r
+\r
+static inline int update_hook(TCHAR *service_name, const TCHAR *hook_event, const TCHAR *hook_action) {\r
+ TCHAR hook_name[HOOK_NAME_LENGTH];\r
+ if (hook_env(hook_event, hook_action, hook_name, _countof(hook_name)) < 0) return 1;\r
+ TCHAR cmd[CMD_LENGTH];\r
+ ZeroMemory(cmd, sizeof(cmd));\r
+ GetEnvironmentVariable(hook_name, cmd, _countof(cmd));\r
+ if (set_hook(service_name, hook_event, hook_action, cmd)) return 2;\r
+ return 0;\r
+}\r
+\r
+static inline int update_hooks(TCHAR *service_name) {\r
+ int ret = 0;\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE);\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_POST);\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_STOP, NSSM_HOOK_ACTION_PRE);\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_EXIT, NSSM_HOOK_ACTION_POST);\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_POWER, NSSM_HOOK_ACTION_CHANGE);\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_POWER, NSSM_HOOK_ACTION_RESUME);\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_ROTATE, NSSM_HOOK_ACTION_PRE);\r
+ ret += update_hook(service_name, NSSM_HOOK_EVENT_ROTATE, NSSM_HOOK_ACTION_POST);\r
+ return ret;\r
+}\r
+\r
+static inline void check_io(HWND owner, TCHAR *name, TCHAR *buffer, unsigned long len, unsigned long control) {\r