likewin32api.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import ctypes
  2. DWORD = ctypes.c_ulong
  3. MAX_PATH = ctypes.c_int(260)
  4. MAX_PATH_NULL = int(MAX_PATH.value) + 1
  5. def decode(s):
  6. if isinstance(s, unicode):
  7. return s
  8. return s.decode('mbcs')
  9. def GetModuleFileName(handle):
  10. r = 0
  11. if hasattr(ctypes.windll.kernel32, "GetModuleFileNameW"):
  12. name = ctypes.create_unicode_buffer(MAX_PATH_NULL)
  13. r = ctypes.windll.kernel32.GetModuleFileNameW(handle, name, MAX_PATH_NULL)
  14. if r == 0:
  15. name = ctypes.create_string_buffer(MAX_PATH_NULL)
  16. ctypes.windll.kernel32.GetModuleFileNameA(handle, name, MAX_PATH_NULL)
  17. return decode(name.value)
  18. def GetTempPath():
  19. r = 0
  20. if hasattr(ctypes.windll.kernel32, "GetTempPathW"):
  21. name = ctypes.create_unicode_buffer(MAX_PATH_NULL)
  22. r = ctypes.windll.kernel32.GetTempPathW(MAX_PATH_NULL, name)
  23. if r == 0:
  24. name = ctypes.create_string_buffer(MAX_PATH_NULL)
  25. ctypes.windll.kernel32.GetTempPathA(MAX_PATH_NULL, name)
  26. return decode(name.value)
  27. def ShellExecute(hwnd, operation, file, parameters, directory, showCmd):
  28. if hasattr(ctypes.windll.shell32, 'ShellExecuteW'):
  29. SW = ctypes.windll.shell32.ShellExecuteW
  30. operation = decode(operation)
  31. file = decode(file)
  32. parameters = decode(parameters)
  33. directory = decode(directory)
  34. else:
  35. SW = ctypes.windll.shell32.ShellExecuteA
  36. return SW(hwnd, operation, file, parameters, directory, showCmd)
  37. def GetVolumeInformation(rootPathName):
  38. volumeSerialNumber = DWORD()
  39. maximumComponentLength = DWORD()
  40. fileSystemFlags = DWORD()
  41. if hasattr(ctypes.windll.kernel32, "GetVolumeInformationW"):
  42. rootPathName = decode(rootPathName)
  43. volumeNameBuffer = ctypes.create_unicode_buffer(MAX_PATH_NULL)
  44. fileSystemNameBuffer = ctypes.create_unicode_buffer(MAX_PATH_NULL)
  45. GVI = ctypes.windll.kernel32.GetVolumeInformationW
  46. else:
  47. volumeNameBuffer = ctypes.create_string_buffer(MAX_PATH_NULL)
  48. fileSystemNameBuffer = ctypes.create_string_buffer(MAX_PATH_NULL)
  49. GVI = ctypes.windll.kernel32.GetVolumeInformationA
  50. GVI(rootPathName, volumeNameBuffer, MAX_PATH_NULL,
  51. ctypes.byref(volumeSerialNumber), ctypes.byref(maximumComponentLength),
  52. ctypes.byref(fileSystemFlags), fileSystemNameBuffer, MAX_PATH_NULL)
  53. return (volumeNameBuffer.value, volumeSerialNumber.value,
  54. maximumComponentLength.value, fileSystemFlags.value,
  55. fileSystemNameBuffer.value)
  56. CloseHandle = ctypes.windll.kernel32.CloseHandle
  57. GetLastError = ctypes.windll.kernel32.GetLastError
  58. GetCurrentProcessId = ctypes.windll.kernel32.GetCurrentProcessId
  59. OpenProcess = ctypes.windll.kernel32.OpenProcess
  60. TerminateProcess = ctypes.windll.kernel32.TerminateProcess