Example #1
0
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 );
        }
    }
}
Example #2
0
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();
    }
}
Example #3
0
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 );
    }
}
Example #4
0
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();
    }
}
Example #5
0
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 );
}