📄 dump.c
字号:
/*
* dump the directory
*/
dh.num_dir_ents = dirCnt;
dh.dir_offset = TINY_INFO_TELL( TinyTell( fh ) );
for( i=0; i<dirCnt; i++ ) {
TinyWrite( fh, &dirList[i], sizeof( dir_ent ) );
}
/*
* dump the module table
*/
dh.num_mod_ents = modCnt;
dh.mod_offset = TINY_INFO_TELL( TinyTell( fh ) );
for( i=0; i<modCnt; i++ ) {
TinyWrite( fh, &modList[i], sizeof( mod_ent ) );
}
/*
* re-write the header with the new info
*/
TinySeek( fh, 0, TIO_SEEK_START );
TinyWrite( fh, &dh, sizeof( dh ) );
TinyClose( fh );
MemFree( dirList );
MemFree( modList );
} /* DoDump */
/*
* DumpDialog - get dump info
*/
BOOL __export FAR PASCAL DumpDialog( HWND hwnd, WORD msg, WORD wparam,
DWORD lparam )
{
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
switch( msg ) {
case WM_INITDIALOG:
_splitpath( DTModuleEntry.szExePath, drive, dir, fname, ext );
_makepath( dumpFile, drive, dir, fname, ".dmp" );
strlwr( dumpFile );
#if 0
SetCourierFont( hwnd, DUMP_FILE_NAME );
SetCourierFont( hwnd, DUMP_MODULE_NAME );
SetCourierFont( hwnd, DUMP_EXE_NAME );
#endif
SetDlgItemText( hwnd, DUMP_FILE_NAME, dumpFile );
SetDlgItemText( hwnd, DUMP_MODULE_NAME, DTModuleEntry.szModule );
SetDlgItemText( hwnd, DUMP_EXE_NAME, DTModuleEntry.szExePath );
invokeDebugger = FALSE;
CheckDlgButton( hwnd, DUMP_INVOKE_DEBUGGER, invokeDebugger );
CheckRadioButton( hwnd, DUMP_ALL, DUMP_ALL_MEMORY, DumpHow );
return( TRUE );
case WM_CLOSE:
PostMessage( hwnd, WM_COMMAND, IDCANCEL, 0L );
return( TRUE );
case WM_COMMAND:
switch( wparam ) {
case DUMP_INVOKE_DEBUGGER:
if( HIWORD( lparam ) == BN_CLICKED ) {
if( !invokeDebugger ) {
invokeDebugger = TRUE;
} else {
invokeDebugger = FALSE;
}
CheckDlgButton( hwnd, DUMP_INVOKE_DEBUGGER, invokeDebugger );
}
break;
case DUMP_ALL_MEMORY:
case DUMP_TASK:
case DUMP_ALL:
if( HIWORD( lparam ) == BN_CLICKED ) {
DumpHow = wparam;
}
break;
case IDOK:
GetDlgItemText( hwnd, DUMP_FILE_NAME, dumpFile, MAX_FNAME );
DoDump( hwnd );
if( invokeDebugger ) {
char str[256];
sprintf( str, "wvideo /tr=pmd.dll %s", dumpFile );
WinExec( str, SW_SHOWNORMAL );
}
EndDialog( hwnd, 0 );
break;
case IDCANCEL:
EndDialog( hwnd, 0 );
break;
}
return( TRUE );
}
return( FALSE );
} /* DumpDialog */
/*
* DumpTask - run task dump dialog
*/
void DumpTask( HWND hwnd )
{
FARPROC fp;
fp = MakeProcInstance( (FARPROC)DumpDialog, Instance );
JDialogBox( Instance, "DMPTASK", hwnd, (DLGPROC)fp );
FreeProcInstance( fp );
} /* DumpTask */
/*
* SetForDump - set up for dumping a task
*/
void SetForDump( HWND hwnd )
{
char bp=0xcc;
DWORD csip;
hwnd = hwnd;
DumpAny.taskid = currTask;
csip = GetRealCSIP( currTask, NULL );
DumpAny.CS = HIWORD( csip );
DumpAny.EIP = LOWORD( csip );
DumpAny.dump_pending = TRUE;
ReadMem( DumpAny.CS, DumpAny.EIP, &DumpAny.oldbyte, 1 );
WriteMem( DumpAny.CS, DumpAny.EIP, &bp, 1 );
ReadMem( DumpAny.CS, DumpAny.EIP, &bp, 1 );
PostAppMessage( currTask, WM_NULL, 0, 0L );
DirectedYield( currTask );
} /* SetForDump */
#endif
/*
* FillTaskList - put all tasks into task list box
*/
static void FillTaskList( HWND hwnd )
{
DWORD csip;
TASKENTRY te;
char str[128];
SendDlgItemMessage( hwnd, TASKCTL_TASKLIST, LB_RESETCONTENT, 0, 0L );
MyTaskFirst( &te );
currTask = te.hTask;
do {
if( te.hTask != ProgramTask && !IsDip( te.hInst ) ) {
csip = GetRealCSIP( te.hTask, NULL );
RCsprintf( str, STR_TASK_LB_FMT_STR, te.szModule,
HIWORD( csip ), LOWORD( csip ), (WORD)te.hTask );
SendDlgItemMessage( hwnd, TASKCTL_TASKLIST, LB_ADDSTRING, 0,
(DWORD) (LPSTR) str );
}
} while( MyTaskNext( &te ) );
SendDlgItemMessage( hwnd, TASKCTL_TASKLIST, LB_SETCURSEL, 0, 0L );
SendDlgItemMessage( hwnd, TASKCTL_TASKLIST, LB_GETTEXT, 0,
(DWORD) (LPSTR) str );
} /* FillTaskList */
/*
* DebuggerOptDlg - manage the dialog to get debugger options
*/
BOOL __export FAR PASCAL DebuggerOptDlg( HWND hwnd, WORD msg, WORD wparam,
DWORD lparam )
{
char str[128];
lparam = lparam;
switch( msg ) {
case WM_INITDIALOG:
SetDlgItemText( hwnd, DBG_DEBUGGER_OPT, DebuggerOpts );
break;
case WM_COMMAND:
switch( wparam ) {
case IDOK:
GetDlgItemText( hwnd, DBG_DEBUGGER_OPT, DebuggerOpts,
sizeof( DebuggerOpts ) );
sprintf( str,"wdw %s %d", DebuggerOpts, (WORD)currTask );
WinExec( str, SW_SHOWNORMAL );
EndDialog( hwnd, 0 );
break;
case IDCANCEL:
EndDialog( hwnd, 0 );
break;
}
break;
default:
return( FALSE );
}
return( TRUE );
}
/*
* DumpAnyDialog - select a task to dump
*/
BOOL __export FAR PASCAL DumpAnyDialog( HWND hwnd, WORD msg, WORD wparam,
DWORD lparam )
{
char str[128];
int i,j;
FARPROC fp;
lparam = lparam;
switch( msg ) {
case WM_INITDIALOG:
DumpDialogHwnd = hwnd;
SetDlgCourierFont( hwnd, TASKCTL_TASKLIST );
FillTaskList( hwnd );
SetDlgItemText( hwnd, TASKCTL_TASKNAME, str );
return( TRUE );
case WM_CLOSE:
PostMessage( hwnd, WM_COMMAND, IDCANCEL, 0L );
return( TRUE );
case WM_COMMAND:
switch( wparam ) {
case TASKCTL_REDRAW:
FillTaskList( hwnd );
break;
case TASKCTL_TASKLIST:
i = SendDlgItemMessage( hwnd, TASKCTL_TASKLIST, LB_GETCURSEL, 0, 0L );
SendDlgItemMessage( hwnd, TASKCTL_TASKLIST, LB_GETTEXT, i,
(DWORD) (LPSTR) str );
SetDlgItemText( hwnd, TASKCTL_TASKNAME, str );
j = strlen( str )-1;
currTask = 0;
i = 1;
while( str[j] != '=' ) {
if( str[j] >= 'a' && str[j] <='f' ) {
currTask += i * (str[j]-'a'+10);
} else {
currTask += i * (str[j]-'0');
}
i *= 16;
j--;
}
break;
case TASKCTL_DEBUG:
fp = MakeProcInstance( (FARPROC)DebuggerOptDlg, Instance );
JDialogBox( Instance, "DEBUGGER_OPTS", hwnd, (DLGPROC)fp );
FreeProcInstance( fp );
break;
#if( 0 )
case TASKCTL_DUMP:
if( DumpAny.dump_pending ) {
MessageBox( hwnd, "Previous dump is still pending", AppName, MB_OK );
break;
}
SetForDump( hwnd );
break;
#endif
case TASKCTL_KILL:
TerminateApp( currTask, NO_UAE_BOX );
break;
case IDCANCEL:
EndDialog( hwnd, 0 );
break;
}
return( TRUE );
}
return( FALSE );
} /* DumpAnyDialog */
/*
* DumpATask - get a task from a list to dump
*/
void DumpATask( HWND hwnd )
{
FARPROC fp;
fp = MakeProcInstance( (FARPROC)DumpAnyDialog, Instance );
JDialogBox( Instance, "TASKCTL", hwnd, (DLGPROC)fp );
DumpDialogHwnd = 0;
FreeProcInstance( fp );
} /* DumpATask */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -