static ExceptDlgInfo * StatGetExceptDlgInfo( HWND stat ) { HWND fault; fault = GetWindow( stat, GW_OWNER ); return( FaultGetExceptDlgInfo( fault ) ); }
/* * ExceptionProc */ BOOL CALLBACK ExceptionProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) { WORD cmd; ExceptDlgInfo *info; ProcNode *procinfo; WORD tmp; address addr; info = FaultGetExceptDlgInfo( hwnd ); switch( msg ) { case WM_INITDIALOG: /* make sure this dialog always comes up on top of everything else */ SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE ); SetWindowPos( hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE ); centerDialog( hwnd ); info = MemAlloc( sizeof( ExceptDlgInfo ) ); info->dbinfo = (DEBUG_EVENT *)lparam; info->rc = 0; info->action = 0; SetWindowLong( hwnd, DWL_USER, (DWORD)info ); info->procinfo = FindProcess( info->dbinfo->dwProcessId ); info->threadinfo = FindThread( info->procinfo, info->dbinfo->dwThreadId ); info->module = ModuleFromAddr( info->procinfo, info->dbinfo->u.Exception.ExceptionRecord.ExceptionAddress ); if( info->threadinfo != NULL ) { AllocMadRegisters( &(info->regs) ); LoadMADRegisters( info->regs, info->threadinfo->threadhdl ); GetCurrAddr( &( info->init_ip ), info->regs ); } if( info->module == NULL ) { info->got_dbginfo = FALSE; } else { if( !LoadDbgInfo( info->module ) ) { info->got_dbginfo = FALSE; } else { info->got_dbginfo = TRUE; } } if( LogData.autolog ) { //Just create the log and exit tmp = ConfigData.exception_action; CheckDlgButton( hwnd, INT_TERMINATE, BST_CHECKED ); SendMessage( hwnd, WM_COMMAND, MAKELONG( INT_ACT_AND_LOG, BN_CLICKED ), (LPARAM)GetDlgItem( hwnd, INT_ACT_AND_LOG ) ); ConfigData.exception_action = tmp; } else { fillExceptionDlg( hwnd, info ); } setProcessHdl( info->procinfo->prochdl ); break; case WM_COMMAND: cmd = LOWORD( wparam ); switch( cmd ) { case INT_ACT_AND_LOG: MakeLog( info ); /* fall through */ case INT_ACT: if( IsDlgButtonChecked( hwnd, INT_TERMINATE ) ) { ConfigData.exception_action = INT_TERMINATE; // hp = OpenProcess( PROCESS_TERMINATE, FALSE, // info->dbinfo->dwProcessId ); procinfo = FindProcess( info->dbinfo->dwProcessId ); if( procinfo == NULL ) { RCMessageBox( hwnd, STR_CANT_TERMINATE_APP, AppName, MB_OK | MB_ICONEXCLAMATION ); } else { TerminateProcess( procinfo->prochdl, -1 ); // CloseHandle( hp ); info->rc = DBG_CONTINUE; info->action = INT_TERMINATE; SendMessage( hwnd, WM_CLOSE, 0, 0L ); } } else if( IsDlgButtonChecked( hwnd, INT_CHAIN_TO_NEXT ) ) { ConfigData.exception_action = INT_CHAIN_TO_NEXT; info->rc = DBG_EXCEPTION_NOT_HANDLED; info->action = INT_CHAIN_TO_NEXT; SendMessage( hwnd, WM_CLOSE, 0, 0L ); } else if( IsDlgButtonChecked( hwnd, INT_RESTART ) ) { ConfigData.exception_action = INT_RESTART; info->rc = DBG_CONTINUE; info->action = INT_RESTART; SendMessage( hwnd, WM_CLOSE, 0, 0L ); } break; case INT_REGISTERS: SetDisasmInfo( info->procinfo->prochdl, info->module ); StatShowSymbols = TRUE; if ( DoStatDialog( hwnd ) == 1 ){ StoreMADRegisters( info->regs, info->threadinfo->threadhdl ); GetCurrAddr(&addr,info->regs); SetIp( hwnd, &addr ); } LoadMADRegisters( info->regs, info->threadinfo->threadhdl ); break; case INT_LOG_OPTIONS: SetLogOptions( hwnd ); break; } break; case WM_CLOSE: if( info->rc == 0 ) { SendMessage( hwnd, WM_COMMAND, INT_ACT, 0L ); } else { if( info->got_dbginfo ) { UnloadDbgInfo( info->module ); } EndDialog( hwnd, info->rc ); } break; case WM_DESTROY: DeAllocMadRegisters( info->regs ); MemFree( info ); break; default: return( FALSE ); break; } return( TRUE ); }