return kill_console(NULL, k);\r
}\r
\r
-void kill_process_tree(nssm_service_t * service, kill_t *k, unsigned long ppid) {\r
+void walk_process_tree(nssm_service_t *service, walk_function_t fn, kill_t *k, unsigned long ppid) {\r
if (! k) return;\r
/* Shouldn't happen unless the service failed to start. */\r
if (! k->pid) return; /* XXX: needed? */\r
_sntprintf_s(ppid_string, _countof(ppid_string), _TRUNCATE, _T("%lu"), ppid);\r
log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_KILL_PROCESS_TREE, pid_string, ppid_string, k->name, 0);\r
k->process_handle = process_handle; /* XXX: open directly? */\r
- if (! kill_process(k)) {\r
+ if (! fn(service, k)) {\r
/* Maybe it already died. */\r
unsigned long ret;\r
if (! GetExitCodeProcess(process_handle, &ret) || ret == STILL_ACTIVE) {\r
/* This is a child of the doomed process so kill it. */\r
if (! check_parent(k, &pe, pid)) {\r
k->pid = pe.th32ProcessID;\r
- kill_process_tree(k, ppid);\r
+ walk_process_tree(service, fn, k, ppid);\r
}\r
k->pid = pid;\r
\r
\r
if (! check_parent(k, &pe, pid)) {\r
k->pid = pe.th32ProcessID;\r
- kill_process_tree(k, ppid);\r
+ walk_process_tree(service, fn, k, ppid);\r
}\r
k->pid = pid;\r
}\r
}\r
\r
void kill_process_tree(kill_t *k, unsigned long ppid) {\r
- return kill_process_tree(NULL, k, ppid);\r
+ return walk_process_tree(NULL, kill_process, k, ppid);\r
}\r
int signalled;\r
} kill_t;\r
\r
+typedef int (*walk_function_t)(nssm_service_t *, kill_t *);\r
+\r
void service_kill_t(nssm_service_t *, kill_t *);\r
int get_process_creation_time(HANDLE, FILETIME *);\r
int get_process_exit_time(HANDLE, FILETIME *);\r
int kill_console(kill_t *);\r
int kill_process(nssm_service_t *, kill_t *);\r
int kill_process(kill_t *);\r
-void kill_process_tree(nssm_service_t *, kill_t *, unsigned long);\r
+void walk_process_tree(nssm_service_t *, walk_function_t, kill_t *, unsigned long);\r
void kill_process_tree(kill_t *, unsigned long);\r
\r
#endif\r