1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#!@PYTHON@
# This file is part of GNUnet.
# (C) 2011 Christian Grothoff (and other contributing authors)
#
# GNUnet is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
# by the Free Software Foundation; either version 2, or (at your
# option) any later version.
#
# GNUnet is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNUnet; see the file COPYING. If not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
# Utility module that implements safe process termination for W32.
# For other platforms it's equivalent to Popen.kill ()
# Requires pywin32 on W32.
import sys
import os
import subprocess
if os.name == 'nt':
import win32api
import win32process
class dummyobj (object):
pass
def safe_terminate_process_by_pid (pid, code):
if os.name == 'nt':
p = dummyobj ()
p._handle = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16, 0, pid)
result = safe_terminate_process (p, code)
win32api.CloseHandle (p._handle)
return result
else:
return os.kill (int (pid), SIGKILL)
def safe_terminate_process (proc, code):
if os.name == 'nt':
cp = win32api.GetCurrentProcess ()
result = False
dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0)
try:
exitcode = win32process.GetExitCodeProcess (dupproc)
if exitcode == 0x103:
kernel32 = win32api.GetModuleHandle ("kernel32")
exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess")
th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0)
win32api.CloseHandle (th)
result = True
else:
result = True
# except failed to get exit code? failed to get module handle?
finally:
win32api.CloseHandle (dupproc)
return result
else:
return proc.kill ()
|