如何找程序线程入口地址,已经可以枚举id和句柄
展开全部
在一个线程出现异常行为时,比如说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),
从线程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),
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询