⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dump.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

    /*
     * 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 + -