Ejemplo n.º 1
0
trap_retval ReqRunThread_get_name( void )
{
    run_thread_get_name_req *acc;
    char                    *name;
    struct TDebug           *obj;
    struct TDebugThread     *t = 0;

    acc = GetInPtr( 0 );
    name = GetOutPtr( 0 );
    strcpy( name, "" );

    if( acc->thread == 0 )
        strcpy( name, "Name" );
    else {
        obj = GetCurrentDebug();
            if (obj) {
            t = LockThread( obj, acc->thread );

            if( t )
                sprintf( name, "%04hX %s", t->ThreadID, t->ThreadName );

            UnlockThread( obj );
        }
    }

    return( strlen( name ) + 1 );
}
Ejemplo n.º 2
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 );
}