diff options
Diffstat (limited to 'contrib/terminate.py.in')
-rw-r--r-- | contrib/terminate.py.in | 84 |
1 files changed, 42 insertions, 42 deletions
diff --git a/contrib/terminate.py.in b/contrib/terminate.py.in index 14c79c10d..aeaaa1501 100644 --- a/contrib/terminate.py.in +++ b/contrib/terminate.py.in | |||
@@ -20,45 +20,45 @@ | |||
20 | # Utility module that implements safe process termination for W32. | 20 | # Utility module that implements safe process termination for W32. |
21 | # For other platforms it's equivalent to Popen.kill () | 21 | # For other platforms it's equivalent to Popen.kill () |
22 | # Requires pywin32 on W32. | 22 | # Requires pywin32 on W32. |
23 | 23 | ||
24 | import sys | 24 | import sys |
25 | import os | 25 | import os |
26 | import subprocess | 26 | import subprocess |
27 | if os.name == 'nt': | 27 | if os.name == 'nt': |
28 | import win32api | 28 | import win32api |
29 | import win32process | 29 | import win32process |
30 | 30 | ||
31 | class dummyobj (object): | 31 | class dummyobj (object): |
32 | pass | 32 | pass |
33 | 33 | ||
34 | def safe_terminate_process_by_pid (pid, code): | 34 | def safe_terminate_process_by_pid (pid, code): |
35 | if os.name == 'nt': | 35 | if os.name == 'nt': |
36 | p = dummyobj () | 36 | p = dummyobj () |
37 | p._handle = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16, 0, pid) | 37 | p._handle = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16, 0, pid) |
38 | result = safe_terminate_process (p, code) | 38 | result = safe_terminate_process (p, code) |
39 | win32api.CloseHandle (p._handle) | 39 | win32api.CloseHandle (p._handle) |
40 | return result | 40 | return result |
41 | else: | 41 | else: |
42 | return os.kill (int (pid), SIGKILL) | 42 | return os.kill (int (pid), SIGKILL) |
43 | 43 | ||
44 | def safe_terminate_process (proc, code): | 44 | def safe_terminate_process (proc, code): |
45 | if os.name == 'nt': | 45 | if os.name == 'nt': |
46 | cp = win32api.GetCurrentProcess () | 46 | cp = win32api.GetCurrentProcess () |
47 | result = False | 47 | result = False |
48 | dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0) | 48 | dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0) |
49 | try: | 49 | try: |
50 | exitcode = win32process.GetExitCodeProcess (dupproc) | 50 | exitcode = win32process.GetExitCodeProcess (dupproc) |
51 | if exitcode == 0x103: | 51 | if exitcode == 0x103: |
52 | kernel32 = win32api.GetModuleHandle ("kernel32") | 52 | kernel32 = win32api.GetModuleHandle ("kernel32") |
53 | exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess") | 53 | exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess") |
54 | th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0) | 54 | th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0) |
55 | win32api.CloseHandle (th) | 55 | win32api.CloseHandle (th) |
56 | result = True | 56 | result = True |
57 | else: | 57 | else: |
58 | result = True | 58 | result = True |
59 | # except failed to get exit code? failed to get module handle? | 59 | # except failed to get exit code? failed to get module handle? |
60 | finally: | 60 | finally: |
61 | win32api.CloseHandle (dupproc) | 61 | win32api.CloseHandle (dupproc) |
62 | return result | 62 | return result |
63 | else: | 63 | else: |
64 | return proc.kill () | 64 | return proc.kill () |