void Trace( struct TDebug *obj ) { char Instr[2] = {0, 0}; int Sel; long Offset; if( obj->CurrentThread ) { Sel = obj->CurrentThread->Cs; Offset = obj->CurrentThread->Eip; ReadMem( obj->CurrentThread, Sel, Offset, Instr, 2 ); if ( Instr[0] == 0xF && Instr[1] == 0xB ) { Offset += 7; AddBreak( obj, Sel, Offset ); Go( obj ); ClearBreak( obj, Sel, Offset ); } else { RdosResetSignal( obj->UserSignal ); SetupTrace( obj->CurrentThread ); RdosContinueDebugEvent( obj->FHandle, obj->CurrentThread->ThreadID); RdosWaitForever( obj->UserWait ); } } }
void DoTrace( struct TDebug *obj ) { if ( ( obj->CurrentThread->Cs & 0x3 ) == 0x3 ) { SetupTrace( obj->CurrentThread ); RdosContinueDebugEvent( obj->FHandle, obj->CurrentThread->ThreadID ); } else { while ( RdosGetDebugThread() != obj->CurrentThread->ThreadID ) RdosDebugNext(); RdosDebugTrace(); } }
void Go( struct TDebug *obj ) { if( obj->CurrentThread ) { RdosResetSignal( obj->UserSignal ); SetupGo( obj->CurrentThread ); ActivateBreaks( obj->CurrentThread, obj->BreakList ); RdosContinueDebugEvent( obj->FHandle, obj->CurrentThread->ThreadID); RdosWaitForever( obj->UserWait ); } }
void DoGo( struct TDebug *obj ) { if ( ( obj->CurrentThread->Cs & 0x3 ) == 0x3 ) { SetupGo( obj->CurrentThread ); ActivateBreaks( obj->CurrentThread, obj->BreakList, obj->WatchList ); RdosContinueDebugEvent( obj->FHandle, obj->CurrentThread->ThreadID ); } else { while ( RdosGetDebugThread() != obj->CurrentThread->ThreadID ) RdosDebugNext(); ActivateBreaks( obj->CurrentThread, obj->BreakList, obj->WatchList ); RdosDebugRun(); } }
static void SignalDebugData( struct TDebug *obj ) { int thread; char debtype; struct TCreateProcessEvent cpe; struct TCreateThreadEvent cte; struct TLoadDllEvent lde; struct TExceptionEvent ee; int ExitCode; int handle; struct TDebugThread *newt; RdosWaitMilli( 5 ); debtype = RdosGetDebugEvent( obj->FHandle, &thread ); switch (debtype) { case EVENT_EXCEPTION: RdosGetDebugEventData( obj->FHandle, &ee ); HandleException( obj, &ee, thread ); break; case EVENT_CREATE_THREAD: RdosGetDebugEventData( obj->FHandle, &cte ); HandleCreateThread( obj, &cte ); obj->FThreadChanged = TRUE; break; case EVENT_CREATE_PROCESS: RdosGetDebugEventData( obj->FHandle, &cpe ); HandleCreateProcess( obj, &cpe ); break; case EVENT_TERMINATE_THREAD: HandleTerminateThread( obj, thread ); obj->FThreadChanged = TRUE; if( !obj->CurrentThread ) { obj->CurrentThread = obj->ThreadList; while( obj->CurrentThread && !IsDebug( obj->CurrentThread ) ) obj->CurrentThread = obj->CurrentThread->Next; if (!obj->CurrentThread) obj->CurrentThread = obj->ThreadList; } break; case EVENT_TERMINATE_PROCESS: RdosGetDebugEventData( obj->FHandle, &ExitCode ); HandleTerminateProcess( obj, ExitCode); obj->FInstalled = FALSE; RdosSetSignal( obj->UserSignal ); break; case EVENT_LOAD_DLL: RdosGetDebugEventData( obj->FHandle, &lde ); HandleLoadDll( obj, &lde ); obj->FModuleChanged = TRUE; break; case EVENT_FREE_DLL: RdosGetDebugEventData( obj->FHandle, &handle ); HandleFreeDll( obj, handle ); obj->FModuleChanged = TRUE; break; } RdosClearDebugEvent( obj->FHandle ); if( debtype == EVENT_EXCEPTION ) { if( obj->CurrentThread ) { DeactivateBreaks( obj->CurrentThread, obj->BreakList); if( thread != obj->CurrentThread->ThreadID ) { newt = LockThread( obj, thread ); if( newt ) { obj->CurrentThread = newt; obj->FThreadChanged = TRUE; } UnlockThread( obj ); } } RdosSetSignal( obj->UserSignal ); } else RdosContinueDebugEvent( obj->FHandle, thread ); }