unsigned ReqProg_load() { char *src; char *dst; char *name; char ch; prog_load_ret *ret; unsigned len; _DBG1(( "AccLoadProg\r\n" )); AtEnd = FALSE; dst = UtilBuff; src = name = GetInPtr( sizeof( prog_load_req ) ); ret = GetOutPtr( 0 ); while( *src++ != '\0' ) {}; len = GetTotalSize() - (src - name) - sizeof( prog_load_req ); if( len > 126 ) len = 126; for( ; len > 0; --len ) { ch = *src++; if( ch == '\0' ) { if( len == 1 ) break; ch = ' '; } *dst++ = ch; } *dst = '\0'; _DBG1(( "about to debugload\r\n" )); _DBG1(( "Name :" )); _DBG1(( name )); _DBG1(( "\r\n" )); _DBG1(( "UtilBuff :" )); _DBG1(( UtilBuff )); _DBG1(( "\r\n" )); GetObjectInfo( name ); ret->err = D32DebugLoad( name, UtilBuff, &Proc ); _DBG1(( "back from debugload - %d\r\n", ret->err )); ret->flags = LD_FLAG_IS_32 | LD_FLAG_IS_PROT | LD_FLAG_DISPLAY_DAMAGED; if( ret->err == 0 ) { ret->task_id = Proc.es; } else { ret->task_id = 0; } ret->mod_handle = 0; Proc.int_id = -1; _DBG1(( "done AccLoadProg\r\n" )); return( sizeof( *ret ) ); }
void StartProg( char *cmd, char *prog, char *full_args, char *dos_args ) { seg_offset where; int error_num; char buff[BSIZE]; Fptr32 fp; short initial_cs; int len; cmd = cmd; SampleIndex = 0; CurrTick = 0L; D32HookTimer( TimerMult ); /* ask for timer - before D32DebugInit!! */ D32DebugBreakOp(&Break); /* Get the 1 byte break op */ error_num = D32DebugInit( &Proc ); if( error_num == 0 ) { strcpy( buff, full_args ); error_num = D32DebugLoad( prog, buff, &Proc ); } if( error_num != 0 ) { Output( MsgArray[MSG_SAMPLE_2-ERR_FIRST_MESSAGE] ); Output( prog ); Output( "\r\n" ); MsgFini(); exit(1); } where.offset = 0; where.segment = 0; WriteCodeLoad( where, ExeName, SAMP_MAIN_LOAD ); fp.sel = 1; fp.off = 0; D32Relocate(&fp); WriteAddrMap( 1, fp.sel, fp.off ); initial_cs = Proc.cs; for( ;; ) { D32DebugRun( &Proc ); if( SampleIndex > Margin && Proc.cs == initial_cs ) { StopAndSave(); } if( Proc.int_id == 8 ) { ++InsiderTime; RecordSample( Proc.eip, Proc.cs ); --InsiderTime; } else if( Proc.int_id == 3 && (Proc.edx & 0xffff) != 0 ) { len = 0; /* this is a mark */ where.segment = Proc.edx & 0xffff; where.offset = Proc.eax; for( ;; ) { if( !D32AddressCheck( where.segment, where.offset, 1, NULL ) ) break; D32DebugRead( where.offset, where.segment, 0, &buff[len], 1 ); if( len == BSIZE ) break; if( buff[len] == '\0' ) break; len++; where.offset++; } buff[len] = '\0'; where.segment = Proc.cs; where.offset = Proc.eip; WriteMark( buff, where ); Proc.eip++; } else if( Proc.int_id == 3 ) { /* remember common storage */ CommonAddr.segment = Proc.ecx & 0xffff; /* area ... */ CommonAddr.offset = Proc.ebx; Proc.eip++; } else { break; } } D32UnHookTimer(); if( Proc.int_id != 0x21 ) { Output( MsgArray[MSG_SAMPLE_1-ERR_FIRST_MESSAGE] ); Output( MsgArray[Exceptions[Proc.int_id]+MSG_EXCEPT_0-ERR_FIRST_MESSAGE] ); Output( "\r\n" ); } D32DebugTerm(); report(); }