16,550
社区成员
发帖
与我相关
我的任务
分享
//获取当前进程中所有线程,并存入ThreadInfo
EnumThreadInfo(ThreadInfo);
if (!ThreadInfo.empty())
{
vector<THREADENTRY32>::iterator iter = ThreadInfo.begin();
HANDLE CurrTh = GetCurrentThread();
for (iter = ThreadInfo.begin(); iter != ThreadInfo.end(); iter++)
{
HANDLE th = lpfnOpenThread(THREAD_SUSPEND_RESUME, FALSE, iter->th32ThreadID);
if (th == NULL)
{
ShowError("获取所有线程的句柄时失败!");
}
CONTEXT thtext = {0};
if (th != CurrTh)
{
DWORD err = SuspendThread(th);
if (err == 0xFFFFFFFF)
{
ShowError("挂起线程时失败!");
}
//执行到这句程序崩溃,错误代码为5.
if (GetThreadContext(th, &thtext))
{
IntelStackWalk(&thtext);
}
else
{
ShowError("获取所有线程的信息时失败!");
}
err = ResumeThread(th);
if (err == 0xFFFFFFFF)
{
ShowError("运行挂起的线程时失败!");
}
}
}
}
else
{
_tprintf("未找到任何线程。。。。。。。。");
}
BOOL EnumThreadInfo(vector<THREADENTRY32> &ThreadInfo)
{
ThreadInfo.clear();
// 定义线程信息结构
THREADENTRY32 te32 = {0} ;
te32.dwSize = sizeof(THREADENTRY32);
//创建系统线程快照
HANDLE hThreadSnap = CreateToolhelp32Snapshot ( TH32CS_SNAPTHREAD, 0 ) ;
if ( hThreadSnap == INVALID_HANDLE_VALUE )
return FALSE ;
// 循环枚举当前进程中的线程信息
DWORD dwOwnerPID = GetCurrentProcessId();
if ( Thread32First ( hThreadSnap, &te32 ) )
{
do{
if (te32.th32OwnerProcessID == dwOwnerPID)
{
ThreadInfo.push_back(te32);
}
}while ( Thread32Next ( hThreadSnap, &te32 ) ) ;
}
else
{
CloseHandle ( hThreadSnap ) ;
return FALSE;
}
CloseHandle ( hThreadSnap ) ;
return TRUE ;
}