I have a program that acts like a debugger. I set hw bp to set the dr0 stream to the address that I want to include bp, and dr7 as 1, because I want bp to generate an event every time this address is executed.
This works, but now the problem is that I do not stop getting EXCEPTION_SINGLE_STEP all the time. I created a loop with WaitForDebugEvent as usual:
DebugActiveProcess(pid); while (flag == 0) { WaitForDebugEvent(&DBEvent, INFINITE); if (first_time){ setHWBPInCurrentThreads(pid, breakpoint_address); first_time = 0; } switch (DBEvent.dwDebugEventCode) { // Here we check if a new thread is created and we set a BP for all of them case CREATE_THREAD_DEBUG_EVENT: { HANDLE thread_handle = DBEvent.u.CreateProcessInfo.hProcess; HANDLE hX3 = SetHardwareBreakpoint(thread_handle, HWBRK_TYPE_CODE, HWBRK_SIZE_1, breakpoint_address); }break; case EXCEPTION_DEBUG_EVENT: { switch (DBEvent.u.Exception.ExceptionRecord.ExceptionCode) { case EXCEPTION_SINGLE_STEP: { printf("%d\n", DBEvent.dwThreadId); ///MessageBoxA(0, "yesssssssss", "", 0); }break; case EXCEPTION_BREAKPOINT: { //MessageBoxA(0, "Found break point", "", 0); }break; } }break; } ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE); }
What is wrong here? What should I do to make the exception pass, and only get control the next time the address is executed?
source share