29 lines
1013 B
Python
29 lines
1013 B
Python
from ctypes import windll, POINTER, byref, WinError
|
|
from ctypes.wintypes import WINFUNCTYPE, HANDLE, DWORD, BOOL
|
|
|
|
INFINITE = -1
|
|
WAIT_FAILED = 0xFFFFFFFF
|
|
|
|
LPDWORD = POINTER(DWORD)
|
|
_GetExitCodeProcessProto = WINFUNCTYPE(BOOL, HANDLE, LPDWORD)
|
|
_GetExitCodeProcess = _GetExitCodeProcessProto(("GetExitCodeProcess", windll.kernel32))
|
|
def GetExitCodeProcess(h):
|
|
exitcode = DWORD()
|
|
r = _GetExitCodeProcess(h, byref(exitcode))
|
|
if r is 0:
|
|
raise WinError()
|
|
return exitcode.value
|
|
|
|
_WaitForMultipleObjectsProto = WINFUNCTYPE(DWORD, DWORD, POINTER(HANDLE), BOOL, DWORD)
|
|
_WaitForMultipleObjects = _WaitForMultipleObjectsProto(("WaitForMultipleObjects", windll.kernel32))
|
|
|
|
def WaitForAnyProcess(processes):
|
|
arrtype = HANDLE * len(processes)
|
|
harray = arrtype(*(int(p._handle) for p in processes))
|
|
|
|
r = _WaitForMultipleObjects(len(processes), harray, False, INFINITE)
|
|
if r == WAIT_FAILED:
|
|
raise WinError()
|
|
|
|
return processes[r], GetExitCodeProcess(int(processes[r]._handle)) <<8
|