我正在尝试获取线程 ID 的文件路径。我希望这会奏效..但它没有
NtOpenThread(@hProc, THREAD_ALL_ACCESS, @ObjAttr, @ClientID) ;
pBuf := AllocMem(MAX_PATH);
GetModuleFileNameEx(hProc, 0, pBuf, MAX_PATH);
知道它是如何完成的吗?
GetModuleFileNameEx 需要进程句柄,而不是线程句柄,这就解释了为什么您的代码不起作用。获取进程句柄有两种主要方法。第一个来自 CreateProcess,但这并不好,除非您是启动该流程的人,而且如果您这样做,则首先不需要 GetModuleFileNameEx。
获取进程句柄的第二种方法是从 OpenProcess 获取。这需要一个进程 ID。您可以使用 GetProcessIdOfThread 获取线程的进程 ID,它采用线程句柄。您已经知道如何使用 NtOpenThread 从线程 ID 获取线程句柄,尽管通常的函数是普通的旧 OpenThread。
如果您的 Windows 版本不支持 GetProcessIdOfThread,您可以使用 Thread32First 和 Thread32Next 走另一条路线。调用 CreateToolhelp32Snapshot,然后遍历线程列表。查找 th32ThreadID 等于您感兴趣的线程 ID 的条目。找到后,th32OwnerProcessID 将保存相应的进程 ID。调用 OpenProcess 并按上述方法继续。
另请注意,您不必在打开线程或进程时请求 ALL_ACCESS 权限,尝试这样做可能会导致程序失败。仅请求完成任务所需的最低权限。当您不知道自己需要什么时,请求所有访问权限是一种懒惰的方式,但它仅在您的程序已经具有管理权限时才有效。相反,花时间弄清楚你真正需要什么权限。