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

  • 相关阅读:
    oracle启动的三步
    Solaris下vi的简单使用帮助
    Solaris下ftp配置(初稿待补充)
    soap笔记1
    Solaris 10 查看机器的网卡mac地址
    查看表空间名称与对应文件
    [转]Ubuntu10.04的网络配置
    [转]红帽企业版RHEL6使用Fedora13的yum源
    [转]linux忘记密码怎么办法
    [转]个人管理 - IT人士书籍推荐(已读)
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3391285.html
Copyright © 2020-2023  润新知