--- /dev/null
+#!@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.
+\r
+import sys\r
+import os\r
+import subprocess\r
+if os.name == 'nt':\r
+ import win32api\r
+ import win32process\r
+\r
+class dummyobj (object):\r
+ pass\r
+\r
+def safe_terminate_process_by_pid (pid, code):\r
+ if os.name == 'nt':\r
+ p = dummyobj ()\r
+ p._handle = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16, 0, pid)\r
+ result = safe_terminate_process (p, code)\r
+ win32api.CloseHandle (p._handle)\r
+ return result\r
+ else:\r
+ return os.kill (int (pid), SIGKILL)\r
+\r
+def safe_terminate_process (proc, code):\r
+ if os.name == 'nt':\r
+ cp = win32api.GetCurrentProcess ()\r
+ result = False\r
+ dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0)\r
+ try:\r
+ exitcode = win32process.GetExitCodeProcess (dupproc)\r
+ if exitcode == 0x103:\r
+ kernel32 = win32api.GetModuleHandle ("kernel32")\r
+ exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess")\r
+ th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0)\r
+ win32api.CloseHandle (th)\r
+ result = True\r
+ else:\r
+ result = True\r
+ # except failed to get exit code? failed to get module handle?\r
+ finally:\r
+ win32api.CloseHandle (dupproc)\r
+ return result\r
+ else:\r
+ return proc.kill ()\r