2016-03-23 61 views
-1

我正在写一个插件。我只允许从衍生主线程运行代码。我无法在主线程上运行代码。获取主线程的线程号

从我的线程,是否有可能获得主线程的线程ID?

我以为OpenProcess这样做 - 但它似乎矫枉过正,因为我的线程过程是相同的。

/* CAUTION: ONLY WIN32 
* get the threadId of the main thread of a target process 
* 
* params: 
*  DWORD pId processId of the target process 
* 
* return: 
*  Success  threadId 
*  Error  NULL 
*/ 
DWORD GetMainThreadId(DWORD pId) 
{ 
    LPVOID lpThId; 

    _asm 
    { 
     mov eax, fs:[18h] 
     add eax, 36 
     mov [lpThId], eax 
    } 

    HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, pId); 
    if(hProcess == NULL) 
     return NULL; 

    DWORD tId; 
    if(ReadProcessMemory(hProcess, lpThId, &tId, sizeof(tId), NULL) == FALSE) 
    { 
     CloseHandle(hProcess); 
     return NULL; 
    } 

    CloseHandle(hProcess); 

    return tId; 
} 

有什么更好的办法吗?

+0

FWIW,考虑到问题中的代码,我没有理由期望在目标进程中的该地址找到线程ID。我认为你的代码看起来工作的确很巧合。 –

回答

2

首先,您需要定义主线程的含义。该系统本身没有这样的概念。

通常,当你说主线程时,你的意思是创建主应用程序窗口的线程。所以,找到主要的应用程序窗口。然后通过该窗口GetWindowThreadProcessId

+0

啊,这是一个好主意,非常感谢您的即时回复!我认为我可能遇到的问题是我的代码在创建窗口之前运行:( – Noitidart

+1

)通常,可能会创建这些窗口的线程尚未创建,但它不一定是线程创建进程时创建的,这将创建窗口。 –

+0

啊非常非常好的一点。谢谢! – Noitidart