利用进程ID获取主线程ID

    技术2026-08-13  2

    利用进程ID获取主线程ID,仅适用于单线程。多线程应区分哪个是主线程,区分方法待验证

    (1)好像可以用StartTime最早的,不过通过线程执行时间不一定可靠,要是在最开始就CreateThread了,线程的执行时间会相同。可以通过回溯栈上的值来判断哪个线程是主线程,主线程的栈多少有些不同。最明显就是主线程栈上的PE入口点 信息,没有这个的就是子线程。 (2)CsrProcessLink中取CsrProcessInfo->ClientId.UniqueThread即可,绝对可靠。

     

    #include <iostream.h> #include <windows.h> #include <tlhelp32.h> void main() {    DWORD dwProcessID, dwThreadID;    while(1)    {      dwThreadID = 0;      cout<< "请输入进程pID:";      cin >>dwProcessID;      THREADENTRY32 te32 = {sizeof(te32)};      HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);      if( Thread32First( hThreadSnap, &te32) )      {        do{           if( dwProcessID == te32.th32OwnerProcessID )           {            dwThreadID = te32.th32ThreadID;            break;           }         }while( Thread32Next( hThreadSnap, &te32) );      }      if (dwThreadID != 0)        cout<<"主线程ID:"<<dwThreadID<<endl;      else        cout<<"没找到"<<endl;    } }

    汇编代码

    local @stProcess:PROCESSENTRY32          ;每一个进程的信息 local @hSnapShot              ;快照句柄

    DWORD dwProcessID = xxxxx, dwThreadID = 0; THREADENTRY32 te32 = {sizeof(te32)}; HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0); if( Thread32First( hThreadSnap, &te32) ) { do{ if( dwProcessID == te32.th32OwnerProcessID ) { dwThreadID = te32.th32ThreadID; break; } }while( Thread32Next( hThreadSnap, &te32) ); }

    最新回复(0)