zoukankan      html  css  js  c++  java
  • 利用进程ID获取主线程ID

    利用进程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) );
    }

  • 相关阅读:
    力扣238.除自身以外数组的乘积 & 剑指offer 51.构建乘积数组
    网易的Airtest
    ZOOKEEPER
    Apache和Nginx负载均衡集群及测试分析
    mysql——创建索引、修改索引、删除索引的命令语句
    sql-索引的作用
    ADB连接手机的两种方式(usb数据线连接和wifi连接)
    adb shell dumpsys 命令
    count(*) 和 count(1)和count(列名)区别
    博客园页面设置
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3391285.html
Copyright © 2011-2022 走看看