|
50 | 50 | # endif |
51 | 51 | #endif |
52 | 52 |
|
| 53 | +#ifdef FEAT_JOB_CHANNEL |
| 54 | +# include <tlhelp32.h> |
| 55 | +#endif |
| 56 | + |
53 | 57 | #ifdef __MINGW32__ |
54 | 58 | # ifndef FROM_LEFT_1ST_BUTTON_PRESSED |
55 | 59 | # define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001 |
@@ -5020,17 +5024,59 @@ mch_detect_ended_job(job_T *job_list) |
5020 | 5024 | return NULL; |
5021 | 5025 | } |
5022 | 5026 |
|
| 5027 | + static BOOL |
| 5028 | +terminate_all(HANDLE process, int code) |
| 5029 | +{ |
| 5030 | + PROCESSENTRY32 pe; |
| 5031 | + HANDLE h = INVALID_HANDLE_VALUE; |
| 5032 | + DWORD pid = GetProcessId(process); |
| 5033 | + |
| 5034 | + if (pid != 0) |
| 5035 | + { |
| 5036 | + h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); |
| 5037 | + if (h != INVALID_HANDLE_VALUE) |
| 5038 | + { |
| 5039 | + pe.dwSize = sizeof(PROCESSENTRY32); |
| 5040 | + if (!Process32First(h, &pe)) |
| 5041 | + goto theend; |
| 5042 | + |
| 5043 | + do |
| 5044 | + { |
| 5045 | + if (pe.th32ParentProcessID == pid) |
| 5046 | + { |
| 5047 | + HANDLE ph = OpenProcess( |
| 5048 | + PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); |
| 5049 | + if (ph != NULL) |
| 5050 | + { |
| 5051 | + terminate_all(ph, code); |
| 5052 | + CloseHandle(ph); |
| 5053 | + } |
| 5054 | + } |
| 5055 | + } while (Process32Next(h, &pe)); |
| 5056 | + |
| 5057 | + CloseHandle(h); |
| 5058 | + } |
| 5059 | + } |
| 5060 | + |
| 5061 | +theend: |
| 5062 | + return TerminateProcess(process, code); |
| 5063 | +} |
| 5064 | + |
| 5065 | +/* |
| 5066 | + * Send a (deadly) signal to "job". |
| 5067 | + * Return FAIL if it didn't work. |
| 5068 | + */ |
5023 | 5069 | int |
5024 | 5070 | mch_stop_job(job_T *job, char_u *how) |
5025 | 5071 | { |
5026 | 5072 | int ret; |
5027 | 5073 |
|
5028 | 5074 | if (STRCMP(how, "term") == 0 || STRCMP(how, "kill") == 0 || *how == NUL) |
5029 | 5075 | { |
| 5076 | + /* deadly signal */ |
5030 | 5077 | if (job->jv_job_object != NULL) |
5031 | 5078 | return TerminateJobObject(job->jv_job_object, 0) ? OK : FAIL; |
5032 | | - else |
5033 | | - return TerminateProcess(job->jv_proc_info.hProcess, 0) ? OK : FAIL; |
| 5079 | + return terminate_all(job->jv_proc_info.hProcess, 0) ? OK : FAIL; |
5034 | 5080 | } |
5035 | 5081 |
|
5036 | 5082 | if (!AttachConsole(job->jv_proc_info.dwProcessId)) |
|
0 commit comments