/* * ScrollAsmDisplay - move asm display in response to a scroll request */ static void ScrollAsmDisplay( HWND hwnd, WORD wparam, address *paddr ) { switch( wparam ) { case SB_PAGEDOWN: if( !InstructionFoward( 8, paddr ) ) { return; } break; case SB_PAGEUP: if( !InstructionBackward( 8, paddr ) ) { return; } break; case SB_LINEDOWN: if( !InstructionFoward(1, paddr)){ return; } break; case SB_LINEUP: if( !InstructionBackward( 1, paddr ) ){ return; } break; default: return; } DisplayAsmLines( hwnd, paddr ); } /* ScrollAsmDisplay */
/* * ScrollAsmDisplay - move asm display in response to a scroll request */ void ScrollAsmDisplay( HWND hwnd, WORD wparam, ADDRESS *paddr, ADDRESS *flagaddr, int idlo, int idhi, int sbid ) { int i; char buff[256]; switch( wparam ) { case SB_PAGEDOWN: for( i=0;i<8;i++ ) { paddr->offset += Disassemble( paddr, buff, FALSE ); } break; case SB_PAGEUP: for( i=0;i<8;i++ ) { InstructionBackup( 1, paddr ); } break; case SB_LINEDOWN: paddr->offset += Disassemble( paddr, buff, FALSE ); break; case SB_LINEUP: InstructionBackup( 1, paddr ); break; default: return; } DisplayAsmLines( hwnd, paddr, flagaddr, idlo, idhi, sbid ); } /* ScrollAsmDisplay */
/* * StatDialog - show task status */ BOOL CALLBACK StatDialog( HWND hwnd, UINT msg,WPARAM wparam, LPARAM lparam ) { WORD cmd; FARPROC fp; StatData *statdata; statdata = (StatData *)GetWindowLong( hwnd, DWL_USER ); fp = fp; switch( msg ) { case STAT_FOREGROUND: #ifdef __NT__ SetForegroundWindow( hwnd ); #else SetActiveWindow( hwnd ); #endif break; case WM_INITDIALOG: InitStatDialog( hwnd ); return( FALSE ); case STAT_MAD_NOTIFY: switch( wparam ) { case MNT_REDRAW_REG: case MNT_MODIFY_REG: DoUpdateWalk( hwnd, (mad_reg_set_data *)lparam ); break; case MNT_MODIFY_IP: case MNT_REDRAW_DISASM: DisplayAsmLines( hwnd, &( statdata->curr_addr ) ); break; } break; case WM_VSCROLL: ScrollAsmDisplay( hwnd, wparam, &( statdata->curr_addr ) ); break; case WM_CLOSE: PostMessage( hwnd, WM_COMMAND, IDCANCEL, 0L ); return( TRUE ); case WM_DESTROY: StatHdl = NULL; MemFree( statdata ); break; case WM_COMMAND: if( HIWORD( wparam ) == CBN_SELCHANGE ) { SwitchRegSets( hwnd, statdata ); break; } cmd = LOWORD( wparam ); switch( cmd ) { #ifndef __NT__ case STAT_SEG_MAP: fp = MakeProcInstance( SegMapDlgProc, Instance ); JDialogBox( Instance, "SEG_MAP_DLG", hwnd, fp ); FreeProcInstance( fp ); break; case STAT_STACK_TRACE: StartStackTraceDialog( hwnd ); break; #else case STAT_SEG_MAP: { HANDLE hdl; ExceptDlgInfo * info; info = StatGetExceptDlgInfo( hwnd ); DuplicateHandle( GetCurrentProcess(), info->procinfo->prochdl, GetCurrentProcess(), &hdl, 0, FALSE, DUPLICATE_SAME_ACCESS ); WalkMemory( hwnd, hdl, info->procinfo->procid ); } break; #endif case STAT_SYMBOLS: if( StatShowSymbols == TRUE ) { StatShowSymbols = FALSE; } else { StatShowSymbols = TRUE; } DisplayAsmLines( hwnd, &( statdata->curr_addr ) ); break; case IDCANCEL: EndDialog( hwnd, 0 ); return( TRUE ); case IDOK: EndDialog( hwnd, 1 ); return( TRUE ); } } return( FALSE ); } /* StatDialog */
/* * InitStatDialog */ static void InitStatDialog( HWND hwnd ) { int i; char buff[256]; ExceptDlgInfo *info; syminfo si; CreateRegListData data; StatData *statdata; RECT c_rect; HWND combo; info = StatGetExceptDlgInfo( hwnd ); StatHdl = hwnd; statdata = MemAlloc( sizeof( StatData ) ); /* * fill in source information */ GetCurrAddr( &( statdata->curr_addr ), info->regs ); if( FindWatSymbol( &( statdata->curr_addr ), &si, TRUE ) == FOUND ) { RCsprintf( buff, STR_SRC_INFO_FMT, si.linenum, si.filename ); StatShowSymbols = TRUE; CheckDlgButton( hwnd, STAT_SYMBOLS, ( StatShowSymbols ) ? BST_CHECKED : BST_UNCHECKED ); } else { RCsprintf( buff, STR_N_A ); StatShowSymbols = FALSE; EnableWindow( GetDlgItem( hwnd, STAT_SYMBOLS ), FALSE ); } SetDlgMonoFont( hwnd, STAT_SRC_INFO ); SetDlgItemText( hwnd, STAT_SRC_INFO, buff ); #ifdef __NT__ { ProcStats procinfo; HWND button; if( GetProcessInfo( info->procinfo->procid, &procinfo ) ) { RCsprintf( buff, STR_STATUS_4_PROC_X, info->procinfo->procid, procinfo.name ); SetWindowText( hwnd, buff ); } CopyRCString( STR_VIEW_MEM_HT_KEY, buff, sizeof( buff ) ); SetDlgItemText( hwnd, STAT_SEG_MAP, buff ); button = GetDlgItem( hwnd, STAT_STACK_TRACE ); ShowWindow( button, SW_HIDE ); } #endif InstructionBackward( 2, &( statdata->curr_addr ) ); for( i = STAT_DISASM_1;i <= STAT_DISASM_8; i++ ) { SetDlgCourierFont( hwnd, i ); } DisplayAsmLines( hwnd, &( statdata->curr_addr ) ); data.index = 0; data.parent = hwnd; data.max_len = 0; combo = GetDlgItem( hwnd, STAT_REGISTER_COMBO ); MADRegSetWalk( MTK_ALL, CreateAllRegLists, &data ); if( data.index == 1 ) { SendMessage( combo, CB_GETLBTEXT, (WPARAM)0, (LPARAM)buff ); SetDlgItemText( hwnd, STAT_REGISTER_SET, buff ); DestroyWindow( combo ); } else { GetChildPos( hwnd, combo, &c_rect ); SendMessage( combo, CB_SETCURSEL, (WPARAM)0, (LPARAM)0 ); c_rect.right += data.max_len; c_rect.bottom += SendMessage( combo, CB_GETITEMHEIGHT, 0, 0 ) * ( data.index + 1); MoveWindow( combo, c_rect.left, c_rect.top, c_rect.right, c_rect.bottom, FALSE ); } SetFocus( GetDlgItem( hwnd, IDOK ) ); statdata->reg_set_index = 0; SetWindowLong(hwnd,DWL_USER,(LONG)statdata); } /* InitStatDialog */
/* * StatDialog - show task status */ BOOL FAR PASCAL StatDialog( HWND hwnd, UINT msg, UINT wparam, DWORD lparam ) { WORD cmd; FARPROC fp; fp = fp; lparam = lparam; switch( msg ) { case WM_INITDIALOG: InitStatDialog( hwnd ); oldIntData = IntData; return( TRUE ); break; case WM_VSCROLL: ScrollAsmDisplay( hwnd, wparam, &currAddr, &firstAddr, STAT_DISASM_1, STAT_DISASM_8, STAT_SCROLL ); break; case WM_USER: /* an owned window is being destroyed make sure * Windows doesn't take the focus away from us*/ SetFocus( hwnd ); break; case WM_CLOSE: PostMessage( hwnd, WM_COMMAND, STAT_CANCEL, 0L ); return( TRUE ); case WM_COMMAND: cmd = LOWORD( wparam ); switch( cmd ) { #ifndef __NT__ case STAT_SEG_MAP: fp = MakeProcInstance( SegMapDlgProc, Instance ); JDialogBox( Instance, "SEG_MAP_DLG", hwnd, fp ); FreeProcInstance( fp ); break; case STAT_STACK_TRACE: StartStackTraceDialog( hwnd ); break; #else case STAT_SEG_MAP: { HANDLE hdl; DuplicateHandle( GetCurrentProcess(), processHdl, GetCurrentProcess(), &hdl, 0, FALSE, DUPLICATE_SAME_ACCESS ); WalkMemory( hwnd, hdl, processID ); } break; #endif case STAT_SYMBOLS: StatShowSymbols = !StatShowSymbols; CheckDlgButton( hwnd, STAT_SYMBOLS, ( StatShowSymbols ) ? BST_CHECKED : BST_UNCHECKED ); DisplayAsmLines( hwnd, &currAddr, &firstAddr, STAT_DISASM_1, STAT_DISASM_8, STAT_SCROLL ); break; case STAT_APPLY: GetStatRegisters( hwnd ); InitStatDialog( hwnd ); return( TRUE ); case IDCANCEL: IntData = oldIntData; EndDialog( hwnd, 0 ); return( TRUE ); case IDOK: GetStatRegisters( hwnd ); EndDialog( hwnd, 0 ); return( TRUE ); } } return( FALSE ); } /* StatDialog */
/* * InitStatDialog */ static void InitStatDialog( HWND hwnd ) { int i; char buff[256]; syminfo si; ADDRESS addr; SetDWORDEditField( hwnd, STAT_AX, IntData.EAX ); SetDWORDEditField( hwnd, STAT_BX, IntData.EBX ); SetDWORDEditField( hwnd, STAT_CX, IntData.ECX ); SetDWORDEditField( hwnd, STAT_DX, IntData.EDX ); SetDWORDEditField( hwnd, STAT_SI, IntData.ESI ); SetDWORDEditField( hwnd, STAT_DI, IntData.EDI ); SetDWORDEditField( hwnd, STAT_BP, IntData.EBP ); SetWORDEditField( hwnd, STAT_DS, IntData.DS ); SetWORDEditField( hwnd, STAT_ES, IntData.ES ); SetWORDEditField( hwnd, STAT_FS, IntData.FS ); SetWORDEditField( hwnd, STAT_GS, IntData.GS ); SetWORDEditField( hwnd, STAT_CS, IntData.CS ); SetDWORDEditField( hwnd, STAT_IP, IntData.EIP ); SetWORDEditField( hwnd, STAT_SS, IntData.SS ); SetDWORDEditField( hwnd, STAT_SP, IntData.ESP ); CheckDlgButton( hwnd, STAT_FLAG_A, ( IntData.EFlags & FLAG_A_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_FLAG_C, ( IntData.EFlags & FLAG_C_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_FLAG_D, ( IntData.EFlags & FLAG_D_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_FLAG_I, ( IntData.EFlags & FLAG_I_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_FLAG_Z, ( IntData.EFlags & FLAG_Z_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_FLAG_S, ( IntData.EFlags & FLAG_S_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_FLAG_P, ( IntData.EFlags & FLAG_P_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_FLAG_O, ( IntData.EFlags & FLAG_O_MASK ) ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hwnd, STAT_SYMBOLS, ( StatShowSymbols ) ? BST_CHECKED : BST_UNCHECKED ); /* * fill in source information */ addr.seg = IntData.CS; addr.offset = IntData.EIP; if( FindWatSymbol( &addr, &si, TRUE ) == FOUND ) { RCsprintf( buff, STR_SRC_INFO_FMT, si.linenum, si.filename ); } else { RCsprintf( buff, STR_N_A ); } SetDlgMonoFont( hwnd, STAT_SRC_INFO ); SetDlgItemText( hwnd, STAT_SRC_INFO, buff ); #ifdef __NT__ { ProcStats procinfo; HWND button; if( GetProcessInfo( processID, &procinfo ) ) { RCsprintf( buff, STR_STATUS_4_PROC_X, processID, procinfo.name ); SetWindowText( hwnd, buff ); } CopyRCString( STR_VIEW_MEM_HT_KEY, buff, sizeof( buff ) ); SetDlgItemText( hwnd, STAT_SEG_MAP, buff ); button = GetDlgItem( hwnd, STAT_STACK_TRACE ); ShowWindow( button, SW_HIDE ); } #endif /* * display code, starting 2 instructions before hand */ currAddr.seg = IntData.CS; currAddr.offset = IntData.EIP; firstAddr = currAddr; InstructionBackup( 2, &currAddr ); for( i=STAT_DISASM_1;i<=STAT_DISASM_8;i++ ) { SetDlgCourierFont( hwnd, i ); } DisplayAsmLines( hwnd, &currAddr, &firstAddr, STAT_DISASM_1, STAT_DISASM_8, STAT_SCROLL ); } /* InitStatDialog */