如何找程序线程入口地址,已经可以枚举id和句柄

 我来答
草原上之狼
高粉答主

2017-10-19 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.9万
采纳率:93%
帮助的人:3894万
展开全部
在一个线程出现异常行为时,比如说CPU占用率过高,抛出异常等,你一定想知道这个线程是由哪个模块创建的。因此无论在哪个操作系统上,获取线程名称是诊断线程相关问题的重要一步。
从线程ID获取线程名称通常的方法是,先获取该线程的入口地址,然后枚举进程内所有已加载模块,最后判断线程入口地址落在哪个加载模块范围内。枚举进程内已加载模块可用Win32标准的CreateToolhelp32Snapshot/Module32First/Module32Next系列ToolHelp API得到。获取线程入口地址则没有线程的Win32 API可用。不过在Windows NT based操作系统上(包括Windows NT 4.0/2000/XP/2003,等),有一个未公开的Native API可用:NtQueryInformationThread。其声明如下:
DWORDWINAPINtQueryInformationThread(
HANDLEThreadHandle,
THREAD_INFORMATION_CLASSThreadInformationClass,
PVOIDThreadInformation,
ULONGThreadInformationLength,
PULONGReturnLength);获取线程入口地址可用:
DWORDGetThreadStartAddress(DWORDdwThreadId){HANDLEhThread=OpenThread(THREAD_ALL_ACCESS,FALSE,dwThreadId);
DWORDretaddr,len,error;retaddr=len=0;error=NtQueryInformationThread(hThread,9,
&retaddr,
sizeof(retaddr),
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式