Esempio n. 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, TRUE );
            Go( obj );
            ClearBreak( obj, Sel, Offset );
        } else {
            RdosResetSignal( obj->UserSignal );
            DoTrace( obj );
            RdosWaitForever( obj->UserWait );
        }
    }
}
Esempio n. 2
0
int AsyncTrace( struct TDebug *obj, int ms )
{
    char    Instr[2] = {0, 0};
    int     ok = TRUE;
    void    *wait;

    if( obj->CurrentThread ) {
        BreakSel = obj->CurrentThread->Cs;
        BreakOffset = obj->CurrentThread->Eip;

        ReadMem( obj->CurrentThread, BreakSel, BreakOffset, Instr, 2 );

        if ( Instr[0] == 0xF && Instr[1] == 0xB ) {
            BreakOffset += 7;
            AddBreak( obj, BreakSel, BreakOffset, TRUE );
            ok = AsyncGo( obj, ms );
            if( ok ) {
                ClearBreak( obj, BreakSel, BreakOffset );
            } else {
                HasBreak = TRUE;
            }
            return( ok );
        } else {
            RdosResetSignal( obj->UserSignal );
            DoTrace( obj );

            wait = RdosWaitTimeout( obj->UserWait, ms );
            if( wait ) {
                return( TRUE );
            }
            else
                return( FALSE );
        }
    }
    return( TRUE );
}