2013-08-28 31 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權限,並且嘗試這樣做可能會導致程序失敗。只請求您完成您的任務所需的最低權限。當你不知道你需要什麼時,請求所有的訪問是懶惰的方式,但只有當你的程序已經具有管理權限時才能工作。相反,花時間弄清楚你真正需要什麼權限。