如何通过ProcessID得到ThreadID?

steel 2000-03-27 04:30:00
在windows中我们可以用EnumProcesses得到一个应用程序的ProcessID,但是又如何得到其下所有线程的ThreadID呢?
...全文
285 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sniper 2000-03-28
  • 打赏
  • 举报
回复
Traversing the Thread List
The following example obtains a list of running threads for the specified process. First, the RefreshThreadList function takes a snapshot of the currently executing threads in the system using the CreateToolhelp32Snapshot function, then it walks through the list recorded in the snapshot, using the Thread32First and Thread32Next functions. The parameter for RefreshThreadList is the identifier of the process whose threads will be listed.

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

BOOL RefreshThreadList (DWORD dwOwnerPID)
{
HANDLE hThreadSnap = NULL;
BOOL bRet = FALSE;
THREADENTRY32 te32 = {0};

// Take a snapshot of all threads currently in the system.

hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == (HANDLE)-1)
return (FALSE);

// Fill in the size of the structure before using it.

te32.dwSize = sizeof(THREADENTRY32);

// Walk the thread snapshot to find all threads of the process.
// If the thread belongs to the process, add its information
// to the display list.

if (Thread32First(hThreadSnap, &te32))
{
do
{
if (te32.th32OwnerProcessID == dwOwnerPID)
{
printf( "\nTID\t\t%d\n", te32.th32ThreadID);
printf( "Owner PID\t%d\n", te32.th32OwnerProcessID);
printf( "Delta Priority\t%d\n", te32.tpDeltaPri);
printf( "Base Priority\t%d\n", te32.tpBasePri);
}
}
while (Thread32Next(hThreadSnap, &te32));
bRet = TRUE;
}
else
bRet = FALSE; // could not walk the list of threads

// Do not forget to clean up the snapshot object.

CloseHandle (hThreadSnap);

return (bRet);
}

这是MSDN中的一段,标题为"Traversing the Thread List",看一下吧。
诊断是HCIE考试中重要的一板块,本课程围绕这一板块进行讲解,其中范文展示如下:                                    关于“AR29 loopback 0不能访问AR28 loopback0”的诊断报告一、故障根因。    经过分析,“AR29 loopback 0不能访问AR28 loopback0”的原因是,LSW6连接AR29和AR28的接口错误划分进不同的vlan,导致AR29和AR28不在一个广播域。 二、故障分析。    步骤2-1:故障现象重现,AR29使用loopback0作为源IP地址去ping AR28的loopback0,命令:   ping -a 10.5.1.29 10.5.1.28  PING 10.5.1.28: 56  data bytes, press CTRL_C to break    Request time out    Request time out    Request time out    Request time out    Request time out   --- 10.5.1.28 ping statistics ---    5 packet(s) transmitted    0 packet(s) received    100.00% packet loss      上面结果表明,确实存在故障,由于AR29和AR28之间运行OSPF协议,所以下一步将在AR29进一步查看路由表以确定是否存在AR28 loopback0接口的ip地址的路由信息。    步骤2-2:在AR29上检查路由表,以确定是否存在AR28 loopback0接口的ip地址的路由信息。查看命令及结果如下:    display ip routing-table Route Flags: R - relay, D - download to fib------------------------------------------------------------------------------Routing Tables: Public         Destinations : 12       Routes : 12        Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface       10.5.1.29/32  Direct  0    0           D   127.0.0.1       LoopBack0      10.5.1.33/32  OSPF    10   1           D   10.5.233.33     GigabitEthernet0/0/1     10.5.128.0/24  Direct  0    0           D   10.5.128.29     GigabitEthernet0/0/0    10.5.128.29/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/0   10.5.128.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/0     10.5.233.0/24  Direct  0    0           D   10.5.233.29     GigabitEthernet0/0/1    10.5.233.29/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/1   10.5.233.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/1      127.0.0.0/8   Direct  0    0           D   127.0.0.1       InLoopBack0      127.0.0.1/32  Direct  0    0           D   127.0.0.1       InLoopBack0127.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0255.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0     上面结果表明,AR29没有去往AR28 loopback0的路由。所以下一步将检查AR29和AR28的OSPF邻居关系。    步骤2-3:在AR29上检查AR29和AR28的OSPF邻居关系。检查命令及结果如下:    display ospf peer brief          OSPF Process 1 with Router ID 10.5.1.29              Peer Statistic Information    ----------------------------------------------------------------------------        Area Id          Interface                        Neighbor id      State        0.0.0.2          GigabitEthernet0/0/1             10.5.1.33        Full            ----------------------------------------------------------------------------        上面结果表明,AR29与AR28不存在OSPF邻居关系。所以初步判断OSPF配置错误,需要进一步检查确认。    步骤2-4:由于AR27与AR28 AR29处于同一OSPF区域中,所以可以通过AR27的测试结果来判断AR28配置是否正确,测试及结果如下:[AR27]display ospf peer brief                 //查看OSPF邻居                  OSPF Process 1 with Router ID 10.5.1.27                  Peer Statistic Information ---------------------------------------------------------------------------- Area Id          Interface                        Neighbor id      State     0.0.0.0          GigabitEthernet0/0/0             10.5.1.28        Full         ----------------------------------------------------------------------------[AR27]dis ip routing-table | in 10.5.1.28     //查看OSPF路由Route Flags: R - relay, D - download to fib------------------------------------------------------------------------------Routing Tables: Public         Destinations : 19       Routes : 19        Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface 10.5.1.28/32  OSPF    10   1           D   10.5.128.28     GigabitEthernet0/0/0 [AR27]    上面结果表明,AR27与AR28之间正常建立OSPF邻居,并且AR27能学习到AR28 loopback0的路由,说明AR28的OSPF配置正确,下一步将对比AR27与AR29的OSPF配置,来进一步判断AR29的OSPF配置是否正确。    步骤2-5:在AR27和AR29上使用命令display ospf brief检查对比AR29的OSPF配置是否正确,结果如下:[AR27]dis ospf brief        //查看AR27 OSPF协议简要信息         OSPF Process 1 with Router ID 10.5.1.27                 OSPF Protocol Information  RouterID: 10.5.1.27        Border Router:  ......(此处省略部分内容) Area: 0.0.0.0          (MPLS TE not enabled) Authtype: MD5   Area flag: Normal SPF scheduled Count: 15     ExChange/Loading Neighbors: 0 Router ID conflict state: Normal Area interface up count: 3.......

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧