-
-
[求助]多线程中的硬件断点报错!
-
发表于:
2018-9-28 19:38
4847
-
写了一个VEH HOOK,在多线程情况下总是会报异常(C0000005),有时在设置硬件断点时,有时在取消硬件断点时。
请问各位大大,在设置多线程硬件断点时应该怎么避免这个问题?感恩!
BOOL VEHHook(DWORD idProcess)
{
HANDLE hThread = OpenThread(THREAD_SET_CONTEXT | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, idProcess); //打开线程
CONTEXT thread_context;
memset(&thread_context, 0, sizeof(CONTEXT)); //清零结构内存
thread_context.ContextFlags = CONTEXT_ALL; //设置flag CONTEXT_ALL
SuspendThread(hThread); //暂停线程
GetThreadContext(hThread, &thread_context); //获取线程环境(上下文)
thread_context.Dr0 = ProcessBase;
thread_context.Dr1 = NULL;
thread_context.Dr2 = NULL;
thread_context.Dr3 = NULL;
thread_context.Dr6 = NULL;
thread_context.Dr7 = Dr7int;
thread_context.ContextFlags = CONTEXT_ALL; //设置flag
BOOL Tf = SetThreadContext(hThread, &thread_context); //重置上下文
if (Tf == FALSE)
{
ResumeThread(hThread);
CloseHandle(hThread); //关闭对象
daAddText(pWndTO, 1001, L"设置上下文失败!");
return FALSE;
}
ResumeThread(hThread); //恢复线程
CloseHandle(hThread); //关闭对象
return TRUE;
}
void ThreadID(UINT32 processId)
{
DWORD idProcess = 0; // 线程ID
THREADENTRY32 te; // 线程信息
te.dwSize = sizeof(THREADENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); // 系统所有线程快照
if (Thread32First(hSnapshot, &te)) // 第一个线程
{
do
{
if (processId == te.th32OwnerProcessID) // 如果进程ID等于当前进程ID
{
idProcess = te.th32ThreadID; // 取当前进程主线程ID
VEHHook(idProcess);
}
} while (Thread32Next(hSnapshot, &te)); // 下一个线程
}
CloseHandle(hSnapshot); // 删除快照
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-9-28 19:39
被卡达编辑
,原因: