void XDbgProxy::onDbgConnect() { // MutexGuard guard(this); clearThreads(); addAllThreads(XDbgGetCurrentThreadId()); delThread(_apiThread.getId()); suspendAll(XDbgGetCurrentThreadId()); DebugEventPacket event; DebugAckPacket ack; event.event.dwProcessId = XDbgGetCurrentProcessId(); event.event.dwThreadId = getFirstThread(); event.event.dwDebugEventCode = ATTACHED_EVENT; // THIS MSG DONT PASS TO DEBUGGER sendDbgEvent(event, ack, false); ignore_dbgstr = ack.args.ignore_dbgstr; inject_method = ack.args.inject_method; simu_attach_bp = ack.args.simu_attach_bp; sendProcessInfo(ack.dwThreadId); sendThreadInfo(); sendModuleInfo(ack.dwThreadId); // attach breakpoint if (simu_attach_bp && !ack.args.createProcess) { DWORD tid; HANDLE hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DebugBreak, NULL, 0, &tid); CloseHandle(hThread); } resumeAll(XDbgGetCurrentThreadId()); }
static void stepCore(uint32_t coreId, bool stepOver) { decaf_check(sIsPaused.load()); const cpu::CoreRegs *state = sCorePauseState[coreId]; uint32_t nextInstr = calculateNextInstr(state, stepOver); cpu::addBreakpoint(nextInstr, cpu::SYSTEM_BPFLAG); resumeAll(); }
BOOL XDbgProxy::sendDbgEvent(const DebugEventPacket& event, struct DebugAckPacket& ack, bool freeze) { BOOL result; if (freeze) suspendAll(event.event.dwThreadId); if (sendDbgEvent(event)) result = recvDbgAck(ack); else result = FALSE; if (freeze) resumeAll(event.event.dwThreadId); return result; }