terminate.py.in 2.2 KB

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