mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-31 16:21:50 +03:00
fix(runtime): preserve Windows process handles
This commit is contained in:
@@ -12,6 +12,7 @@ import tempfile
|
|||||||
import time
|
import time
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
|
from ctypes import wintypes
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import UTC, datetime
|
from datetime import UTC, datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -540,7 +541,21 @@ def _windows_process_identity(pid: int) -> str | None:
|
|||||||
return (int(self.high) << 32) | int(self.low)
|
return (int(self.high) << 32) | int(self.low)
|
||||||
|
|
||||||
process_query_limited_information = 0x1000
|
process_query_limited_information = 0x1000
|
||||||
kernel32 = ctypes.windll.kernel32
|
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
|
||||||
|
kernel32.OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD]
|
||||||
|
kernel32.OpenProcess.restype = wintypes.HANDLE
|
||||||
|
kernel32.GetProcessTimes.argtypes = [
|
||||||
|
wintypes.HANDLE,
|
||||||
|
ctypes.POINTER(FileTime),
|
||||||
|
ctypes.POINTER(FileTime),
|
||||||
|
ctypes.POINTER(FileTime),
|
||||||
|
ctypes.POINTER(FileTime),
|
||||||
|
]
|
||||||
|
kernel32.GetProcessTimes.restype = wintypes.BOOL
|
||||||
|
kernel32.GetExitCodeProcess.argtypes = [wintypes.HANDLE, ctypes.POINTER(wintypes.DWORD)]
|
||||||
|
kernel32.GetExitCodeProcess.restype = wintypes.BOOL
|
||||||
|
kernel32.CloseHandle.argtypes = [wintypes.HANDLE]
|
||||||
|
kernel32.CloseHandle.restype = wintypes.BOOL
|
||||||
handle = kernel32.OpenProcess(process_query_limited_information, False, pid)
|
handle = kernel32.OpenProcess(process_query_limited_information, False, pid)
|
||||||
if not handle:
|
if not handle:
|
||||||
return None
|
return None
|
||||||
@@ -558,7 +573,7 @@ def _windows_process_identity(pid: int) -> str | None:
|
|||||||
)
|
)
|
||||||
if not ok:
|
if not ok:
|
||||||
return None
|
return None
|
||||||
exit_code = ctypes.c_uint32()
|
exit_code = wintypes.DWORD()
|
||||||
if not kernel32.GetExitCodeProcess(handle, ctypes.byref(exit_code)):
|
if not kernel32.GetExitCodeProcess(handle, ctypes.byref(exit_code)):
|
||||||
return None
|
return None
|
||||||
if exit_code.value != 259:
|
if exit_code.value != 259:
|
||||||
|
|||||||
Reference in New Issue
Block a user