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 ); } } }
static void DebugThread( void *Param ) { int CurrModuleHandle; int WaitHandle; int thread; struct TDebug *obj = (struct TDebug *)Param; obj->FInstalled = TRUE; CurrModuleHandle = RdosGetModuleHandle(); SelfKey = RdosGetModuleFocusKey( CurrModuleHandle ); if ( SelfKey != RdosGetFocus() ) SelfKey = 0; RdosWaitMilli( 250 ); obj->FHandle = RdosSpawnDebug( obj->FProgram, obj->FParam, obj->FStartDir, 0, 0, &thread); RdosWaitMilli( 250 ); if( obj->FHandle ) { WaitHandle = RdosCreateWait(); RdosAddWaitForDebugEvent( WaitHandle, obj->FHandle, obj ); while( obj->FInstalled ) if( RdosWaitForever( WaitHandle ) ) SignalDebugData( obj ); RdosCloseWait( WaitHandle ); } else obj->FInstalled = FALSE; }
void Go( struct TDebug *obj ) { if( obj->CurrentThread ) { RdosResetSignal( obj->UserSignal ); DoGo( obj ); RdosWaitForever( obj->UserWait ); } }
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 ); } }
int __CBeginThread( thread_fn *start_addr, int prio, const char *thread_name, unsigned stack_size, void *arglist ) /************************************************************/ { thread_args *td; int th; int wait_handle; if( __TlsIndex == NO_INDEX ) { if( !__RdosThreadInit() ) return( -1L ); __InitMultipleThread(); } td = malloc( sizeof( *td ) ); if( td == NULL ) { _RWD_errno = ENOMEM; return( -1L ); } stack_size = __ROUND_UP_SIZE_4K( stack_size ); wait_handle = RdosCreateWait(); td->rtn = start_addr; td->argument = arglist; td->signal = RdosCreateSignal(); RdosResetSignal( td->signal ); RdosAddWaitForSignal( wait_handle, td->signal, 0 ); __create_thread(begin_thread_helper, prio, thread_name, td, stack_size); RdosWaitForever( wait_handle ); RdosFreeSignal( td->signal ); RdosCloseWait( wait_handle ); th = td->tid; free( td ); return( th ); }
void WaitForLoad( struct TDebug *obj ) { RdosWaitForever( obj->UserWait ); }
int _dospawn( int mode, CHAR_TYPE *pgmname, CHAR_TYPE *cmdline, CHAR_TYPE *envpar, const CHAR_TYPE * const argv[] ) { int tid; int handle; int wait; int rc = -1; int fh; int len; char *p; char *drive; char *dir; char *fname; char *ext; char *envdata; char *envp; char *ep; char *options; int ok; options = __CreateInheritString(); __F_NAME(__ccmdline,__wccmdline)( pgmname, argv, cmdline, 0 ); ok = 0; len = strlen( pgmname ) + 7 + _MAX_PATH2; p = lib_malloc( len ); _splitpath2( pgmname, p + (len-_MAX_PATH2), &drive, &dir, &fname, &ext ); _makepath( p, drive, dir, fname, ext ); fh = RdosOpenFile( p, 0 ); if( fh == 0 ) { if( strlen( drive ) == 0 && strlen( dir ) == 0 ) { envdata = getenv( "PATH" ); if( envdata ) { envp = envdata; while( envp && !ok) { ep = strchr( envp, ';' ); if( ep ) { *ep = 0; ep++; } _makepath( p, "", envp, fname, ext ); fh = RdosOpenFile( pgmname, 0 ); if( fh ) { ok = 1; RdosCloseFile( fh ); } envp = ep; } } } } else { RdosCloseFile( fh ); ok = 1; } if( ok ) { handle = RdosSpawn( pgmname, cmdline, 0, envpar, options, &tid ); if( !handle ) ok = 0; } if( ok ) { if( mode == P_WAIT ) { wait = RdosCreateWait(); RdosAddWaitForProcessEnd( wait, handle, 0 ); RdosWaitForever( wait ); rc = RdosGetProcessExitCode( handle ); RdosCloseWait( wait ); } else rc = tid; RdosFreeProcessHandle( handle ); } lib_free( options ); lib_free( p ); return( rc ); }