2013-08-28 34 views
1

我想获得一个线程ID的文件路径。 我希望这将work..but它不线程ID的GetModuleFileNameEx?

NtOpenThread(@hProc, THREAD_ALL_ACCESS, @ObjAttr, @ClientID) ; 
     pBuf := AllocMem(MAX_PATH); 
     GetModuleFileNameEx(hProc, 0, pBuf, MAX_PATH); 

任何想法是怎么做的?

+0

什么让你觉得你需要使用本地API?为什么Win32对你来说不够好?线程没有文件名。 –

回答

6

GetModuleFileNameEx需要一个进程句柄,而不是线程句柄,这就解释了为什么你的代码不工作。有两种主要的方法来获得一个进程句柄。第一个来自CreateProcess,但这并不好,除非你是开始这个​​过程的人,如果你这样做,你首先不需要GetModuleFileNameEx。

获得进程句柄的第二种方法是从OpenProcess。这需要一个进程ID。您可以使用GetProcessIdOfThread获取线程的进程ID,该进程需要一个线程句柄。您已经知道如何使用NtOpenThread从线程标识中获取线程句柄,尽管通常的函数是普通的旧式OpenThread。

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

另请注意,在打开线程或进程时,您不应该请求ALL_ACCESS权限,并且尝试这样做可能会导致程序失败。只请求您完成您的任务所需的最低权限。当你不知道你需要什么时,请求所有的访问是懒惰的方式,但只有当你的程序已经具有管理权限时才能工作。相反,花时间弄清楚你真正需要什么权限。