static int find_load(void) { enumerate_processes(); wakeup_process(pid); return -ECANCELED; }
bool is_process_running(WCHAR * process_name) { DWORD *pid_list, pid_list_size; DWORD index; BOOL found_process = FALSE; pid_list = enumerate_processes(&pid_list_size); if (!pid_list) { return FALSE; } for (index = 0; index < pid_list_size; index++) { WCHAR process_name2[MAX_PATH]; if (get_process_name_from_pid (pid_list[index], process_name2, MAX_PATH) == TRUE && !wcscasecmp(process_name2, process_name)) { struct pid_close_info info = { pid_list[index] }; found_process = TRUE; EnumWindows(pid_enum_proc, (LPARAM) & info); } } return found_process; }
static int terminate_processes(void) { DWORD *pid_list, pid_list_size; DWORD self_pid = GetCurrentProcessId(); unsigned int i; int status_code = 0; pid_list = enumerate_processes(&pid_list_size); if (!pid_list) { taskkill_message(STRING_ENUM_FAILED); return 1; } for (i = 0; i < task_count; i++) { WCHAR *p = task_list[i]; BOOL is_numeric = TRUE; /* Determine whether the string is not numeric. */ while (*p) { if (!isdigitW(*p++)) { is_numeric = FALSE; break; } } if (is_numeric) { DWORD pid = atoiW(task_list[i]); HANDLE process; if (pid == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } process = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (!process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; continue; } if (!TerminateProcess(process, 0)) { taskkill_message_printfW(STRING_TERMINATE_FAILED, task_list[i]); status_code = 1; CloseHandle(process); continue; } taskkill_message_printfW(STRING_TERM_PID_SEARCH, pid); CloseHandle(process); } else { DWORD index; BOOL found_process = FALSE; for (index = 0; index < pid_list_size; index++) { WCHAR process_name[MAX_PATH]; if (get_process_name_from_pid(pid_list[index], process_name, MAX_PATH) && !strcmpiW(process_name, task_list[i])) { HANDLE process; if (pid_list[index] == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } process = OpenProcess(PROCESS_TERMINATE, FALSE, pid_list[index]); if (!process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; continue; } if (!TerminateProcess(process, 0)) { taskkill_message_printfW(STRING_TERMINATE_FAILED, task_list[i]); status_code = 1; CloseHandle(process); continue; } found_process = TRUE; taskkill_message_printfW(STRING_TERM_PROC_SEARCH, task_list[i], pid_list[index]); CloseHandle(process); } } if (!found_process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; } } } HeapFree(GetProcessHeap(), 0, pid_list); return status_code; }
/* The implemented task enumeration and termination behavior does not * exactly match native behavior. On Windows: * * In the case of terminating by process name, specifying a particular * process name more times than the number of running instances causes * all instances to be terminated, but termination failure messages to * be printed as many times as the difference between the specification * quantity and the number of running instances. * * Successful terminations are all listed first in order, with failing * terminations being listed at the end. * * A PID of zero causes taskkill to warn about the inability to terminate * system processes. */ static int send_close_messages(void) { DWORD *pid_list, pid_list_size; DWORD self_pid = GetCurrentProcessId(); unsigned int i; int status_code = 0; pid_list = enumerate_processes(&pid_list_size); if (!pid_list) { taskkill_message(STRING_ENUM_FAILED); return 1; } for (i = 0; i < task_count; i++) { WCHAR *p = task_list[i]; BOOL is_numeric = TRUE; /* Determine whether the string is not numeric. */ while (*p) { if (!isdigitW(*p++)) { is_numeric = FALSE; break; } } if (is_numeric) { DWORD pid = atoiW(task_list[i]); struct pid_close_info info = { pid }; if (pid == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } EnumWindows(pid_enum_proc, (LPARAM)&info); if (info.found) taskkill_message_printfW(STRING_CLOSE_PID_SEARCH, pid); else { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; } } else { DWORD index; BOOL found_process = FALSE; for (index = 0; index < pid_list_size; index++) { WCHAR process_name[MAX_PATH]; if (get_process_name_from_pid(pid_list[index], process_name, MAX_PATH) && !strcmpiW(process_name, task_list[i])) { struct pid_close_info info = { pid_list[index] }; found_process = TRUE; if (pid_list[index] == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } EnumWindows(pid_enum_proc, (LPARAM)&info); taskkill_message_printfW(STRING_CLOSE_PROC_SRCH, process_name, pid_list[index]); } } if (!found_process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; } } } HeapFree(GetProcessHeap(), 0, pid_list); return status_code; }