python能否通过句柄得到外部程序的路径?

dailx
  • 47

c++通过函数
GetWindowThreadProcessId CreateToolhelp32Snapshot 可以查到exe程序的路径,python如何查到?

回复
阅读 1.3k
2 个回答
✓ 已被采纳

def _win32_check_running_pid(self, pid):

    class PROCESSENTRY32(ctypes.Structure):
        _fields_ = [("dwSize", ctypes.c_ulong),
                    ("cntUsage", ctypes.c_ulong),
                    ("th32ProcessID", ctypes.c_ulong),
                    ("th32DefaultHeapID", ctypes.c_ulong),
                    ("th32ModuleID", ctypes.c_ulong),
                    ("cntThreads", ctypes.c_ulong),
                    ("th32ParentProcessID", ctypes.c_ulong),
                    ("pcPriClassBase", ctypes.c_ulong),
                    ("dwFlags", ctypes.c_ulong),
                    ("szExeFile", ctypes.c_char * 260)]# win64,这行代码如何改?
    CreateToolhelp32Snapshot = ctypes.windll.kernel32.CreateToolhelp32Snapshot
    Process32First = ctypes.windll.kernel32.Process32First
    Process32Next = ctypes.windll.kernel32.Process32Next
    CloseHandle = ctypes.windll.kernel32.CloseHandle
    TH32CS_SNAPPROCESS = 0x00000002  # win32 magic number
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    pe32 = PROCESSENTRY32()
    pe32.dwSize = ctypes.sizeof(PROCESSENTRY32)
    result = False
    if not Process32First(hProcessSnap, ctypes.byref(pe32)):
        _log.debug("Failed getting first process.")
        CloseHandle(hProcessSnap)
        return result
    while True:
        if pe32.th32ProcessID == pid:
            result = True
            break
        if not Process32Next(hProcessSnap, ctypes.byref(pe32)):
            break
    CloseHandle(hProcessSnap)
    return result
 网上找到一段代码,返回是bytes,转换总是乱码,怀疑是32位程序转换在win64出错
#遍历process获取程序名
def win32_get_path(pid):

    class PROCESSENTRY32(ctypes.Structure):
        _fields_ = [("dwSize", ctypes.c_ulong),
                    ("cntUsage", ctypes.c_ulong),
                    ("th32ProcessID", ctypes.c_ulong),
                    ("th32DefaultHeapID", ctypes.c_void_p),
                    ("th32ModuleID", ctypes.c_ulong),
                    ("cntThreads", ctypes.c_ulong),
                    ("th32ParentProcessID", ctypes.c_ulong),
                    ("pcPriClassBase", ctypes.c_ulong),
                    ("dwFlags", ctypes.c_ulong),
                    ("szExeFile", ctypes.c_char * 260)]

    kernel32 = ctypes.windll.kernel32
    hProcessSnap = kernel32.CreateToolhelp32Snapshot(0x00000002, 0)
    pe32 = PROCESSENTRY32()
    pe32.dwSize = ctypes.sizeof(PROCESSENTRY32)
    ret = kernel32.Process32First(hProcessSnap, ctypes.byref(pe32))
    while ret:
        if pe32.th32ProcessID == pid:
            kernel32.CloseHandle(hProcessSnap)
            #如果要获取全路径 还要遍历module 
            return pe32.szExeFile.decode("gbk")

        ret = kernel32.Process32Next(hProcessSnap, ctypes.byref(pe32))

    kernel32.CloseHandle(hProcessSnap)

    ERROR_NO_MORE_FILES = 18
    err = kernel32.GetLastError()
    if err is not ERROR_NO_MORE_FILES:
        print("error %d" % err)

    return None
 
 #通过psapi获取全路径
def win32_get_path2(pid):

    def invalid_handle(handle):
        return handle == 0 or handle == -1

    kernel32 = ctypes.windll.kernel32
    psapi = ctypes.windll.psapi
    h_Process = kernel32.OpenProcess(0x0400, 0, pid)
    if invalid_handle(h_Process):
        print("error %d" % kernel32.GetLastError())
        return None
    path = (ctypes.c_char * 260)()
    psapi.GetModuleFileNameExA(h_Process, 0, path, 260)
    kernel32.CloseHandle(h_Process)
    return path.value.decode("gbk")
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏