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