线程ID的GetModuleFileNameEx?

use*_*304 1 delphi winapi delphi-7

我试图获取线程ID的文件路径.我希望这会有用......但事实并非如此

NtOpenThread(@hProc, THREAD_ALL_ACCESS, @ObjAttr, @ClientID) ;
        pBuf := AllocMem(MAX_PATH);
        GetModuleFileNameEx(hProc, 0, pBuf, MAX_PATH);
Run Code Online (Sandbox Code Playgroud)

知道怎么做吗?

Rob*_*edy 6

GetModuleFileNameEx需要一个进程句柄,而不是一个线程句柄,这解释了为什么你的代码不起作用.获取进程句柄有两种主要方法.第一个来自CreateProcess,但除非你是启动过程的人,否则这没有用,如果你这样做,你首先不需要GetModuleFileNameEx.

获取进程句柄的第二种方法来自OpenProcess.这需要一个进程ID.您可以使用GetProcessIdOfThread获取线程的进程ID,该进程使用线程句柄.您已经知道如何从具有NtOpenThread的线程ID获取线程句柄,尽管通常的功能是普通的OpenThread.

如果您的Windows版本不支持GetProcessIdOfThread,则可以使用Thread32First和Thread32Next进入另一个路径.调用CreateToolhelp32Snapshot,然后遍历线程列表.查找th32ThreadID等于您感兴趣的线程ID的条目.当您找到它时,th32OwnerProcessID将保存相应的进程ID.调用OpenProcess并按上述步骤操作.

另请注意,打开线程或进程时不必请求ALL_ACCESS权限,尝试这样做可能会导致程序失败.仅请求完成任务所需的最低权限.当您不知道自己需要什么时,请求所有访问权限是懒惰的方式,但只有当您的程序已具有管理权限时才会有效.相反,花时间找出你真正需要的权限.