|
|
1.1 ! root 1: /*==============================================================*\ ! 2: * Vmm_init.c - routines for initialization and exit processing * ! 3: * Created 1990, Microsoft, IBM Corp. * ! 4: *--------------------------------------------------------------* ! 5: * * ! 6: * This module contains the code for application initialization* ! 7: * as well as the code for exit list processing * ! 8: * * ! 9: *--------------------------------------------------------------* ! 10: * * ! 11: * This source file contains the following functions: * ! 12: * * ! 13: * Init() - initialization routines * ! 14: * ExitProc(usTermCode) - exit list processing procedure * ! 15: * GPFHandler(parg) - GPFault and guard page excep handler * ! 16: * * ! 17: \*==============================================================*/ ! 18: ! 19: /*--------------------------------------------------------------*\ ! 20: * Include files, macros, defined constants, and externs * ! 21: \*--------------------------------------------------------------*/ ! 22: ! 23: #define LINT_ARGS ! 24: ! 25: #define INCL_WIN ! 26: #define INCL_DOSPROCESS ! 27: #define INCL_DOSSIGNALS ! 28: #define INCL_DOSMISC ! 29: #define INCL_DOSMEMMGR ! 30: #include <os2.h> ! 31: #include <string.h> ! 32: #include "vmm_main.h" ! 33: #include "vmm_xtrn.h" ! 34: ! 35: /*--------------------------------------------------------------*\ ! 36: * Entry point declarations * ! 37: \*--------------------------------------------------------------*/ ! 38: ! 39: ULONG GPFHandler(PXCPT parg); ! 40: ! 41: /*--------------------------------------------------------------*\ ! 42: * Global variables * ! 43: \*--------------------------------------------------------------*/ ! 44: ! 45: extern HWND hwndMain; ! 46: ! 47: EHS ehs = {0, &GPFHandler}; ! 48: ! 49: /****************************************************************\ ! 50: * Initialization routine * ! 51: *--------------------------------------------------------------* ! 52: * * ! 53: * Name: Init() * ! 54: * * ! 55: * Purpose: Performs initialization functions required * ! 56: * before the main window can be created. * ! 57: * * ! 58: * Usage: Called once before the main window is created. * ! 59: * * ! 60: * Method: * ! 61: * - installs the routine ExitProc into the * ! 62: * DosExitList chain * ! 63: * - registers all window classes * ! 64: * - performs any command line processing * ! 65: * * ! 66: * Returns: * ! 67: * TRUE - initialization is successful * ! 68: * FALSE - initialization failed * ! 69: \****************************************************************/ ! 70: ! 71: BOOL Init(VOID) ! 72: { ! 73: /* Add ExitProc to the exit list to handle the exit processing */ ! 74: #ifndef VER630 ! 75: if(DosExitList(EXLST_ADD, (PFNEXITLIST)ExitProc)) ! 76: { ! 77: return FALSE; ! 78: } ! 79: #endif ! 80: ! 81: #ifdef LATER ! 82: /* initialize the print dialog structures */ ! 83: InitPrintingDialogs(); ! 84: #endif ! 85: ! 86: /* load application name from resource file */ ! 87: if(WinLoadString(hab, NULL, IDS_APPNAME, MAXAPPNAMELEN, szAppName) == 0) ! 88: { ! 89: return FALSE; ! 90: } ! 91: /* register the main client window class */ ! 92: if(WinRegisterClass(hab, ! 93: (PSZ)szAppName, ! 94: (PFNWP)MainWndProc, ! 95: CS_SIZEREDRAW | CS_SYNCPAINT | CS_CLIPCHILDREN, ! 96: 0) == 0) ! 97: { ! 98: return FALSE; ! 99: } ! 100: ! 101: if(DosSetExceptionHandler(&ehs) != 0) ! 102: { ! 103: return FALSE; ! 104: } ! 105: /*--------------------------------------------------*\ ! 106: * Add any command line processing here * ! 107: \*--------------------------------------------------*/ ! 108: ! 109: /* Turn off hard-error popup after GP-FAULT. No return codes ! 110: checked as it is cosmetic and if it doesn't work the only side ! 111: effect will be to have the default hard-error popup show up. */ ! 112: ! 113: ! 114: DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR); ! 115: ! 116: return TRUE; ! 117: ! 118: } /* Init() */ ! 119: ! 120: ! 121: ! 122: /****************************************************************\ ! 123: * Exit list processing procedure * ! 124: *--------------------------------------------------------------* ! 125: * * ! 126: * Name: ExitProc(usTermCode) * ! 127: * * ! 128: * Purpose: Cleans up certain resources when the application * ! 129: * terminates * ! 130: * * ! 131: * Usage: Routine is called by DosExitList when the * ! 132: * application exits * ! 133: * * ! 134: * Method: global resources, such as the main window and * ! 135: * message queue, are destroyed and any system * ! 136: * resources used are freed * ! 137: * * ! 138: * Returns: Returns EXLST_EXIT to the DosExitList handler * ! 139: * * ! 140: \****************************************************************/ ! 141: ! 142: VOID PASCAL FAR ExitProc(usTermCode) ! 143: USHORT usTermCode; /* code for the reason for termination */ ! 144: { ! 145: ! 146: WinDestroyWindow(hwndMainFrame); ! 147: ! 148: /*--------------------------------------------------*\ ! 149: * Any other system resources used * ! 150: * (e.g. memory or files) should be freed here * ! 151: \*--------------------------------------------------*/ ! 152: ! 153: WinDestroyMsgQueue(hmq); ! 154: ! 155: WinTerminate(hab); ! 156: ! 157: DosUnsetExceptionHandler(&ehs); ! 158: ! 159: DosExitList(EXLST_EXIT, 0L); /* termination complete */ ! 160: ! 161: /* This routine currently doesn't use the usTermCode parameter so *\ ! 162: * it is referenced here to prevent an 'Unreferenced Parameter' * ! 163: \* warning at compile time */ ! 164: ! 165: usTermCode; ! 166: ! 167: } /* ExitProc() */ ! 168: ! 169: /****************************************************************\ ! 170: * Do nothing Guard Page Exception Handler * ! 171: *--------------------------------------------------------------* ! 172: * * ! 173: * Name: GPFHandler(PXCPT) * ! 174: * * ! 175: * Purpose: To notify user when a guard page entered exception * ! 176: * occurs * ! 177: * * ! 178: * Usage: Routine is called when a guard page is accessed * ! 179: * * ! 180: * Method: Whenever a guard page is accessed, a message * ! 181: * box is put on the screen indicating this * ! 182: * * ! 183: * Returns: Returns HANDLED if guard page exception, * ! 184: * otherwise, returns NOT_HANDLED * ! 185: \****************************************************************/ ! 186: ! 187: ULONG GPFHandler(parg) ! 188: PXCPT parg; ! 189: ! 190: { ! 191: ULONG flMemAttrs; ! 192: ULONG ulMemSize; ! 193: ! 194: /* Notify the user when they have accessed a guard page, and let ! 195: the system default guard page handler handle the exception. */ ! 196: ! 197: if(parg->ExceptionNum == XCPT_GPF) ! 198: { ! 199: WinMessageBox(HWND_DESKTOP, ! 200: hwndMain, ! 201: "Guard Page Accessed.\n\n" ! 202: "Calling Default Handler.\n", ! 203: szAppName, ! 204: 13, ! 205: MB_OK | MB_ICONASTERISK); ! 206: ! 207: WinInvalidateRect(hwndMain,NULL,TRUE); ! 208: ! 209: return(NOT_HANDLED); ! 210: } ! 211: ! 212: if(parg->ExceptionNum == XCPT_GP) ! 213: { ! 214: if (parg->ExceptionInfo[0] & XCPTF_PF) ! 215: { ! 216: ! 217: ulMemSize = 1L; ! 218: DosQueryMem((PVOID)(parg->pExceptionContext->EC_cr2), ! 219: &ulMemSize,&flMemAttrs); ! 220: ! 221: /* If the exception is due to accessing a page that has ! 222: been allocated but not committed, then commit the page. ! 223: Otherwise, GP Fault. */ ! 224: ! 225: if (((flMemAttrs & PAG_FREE) || (flMemAttrs & PAG_COMMIT)) == 0) ! 226: { ! 227: ! 228: WinMessageBox(HWND_DESKTOP, ! 229: hwndMain, ! 230: "The memory to be written to has not been" ! 231: " committed. \n\rAttempting to committ memory" ! 232: " before write.", ! 233: szAppName, ! 234: 13, ! 235: MB_OK | MB_ICONASTERISK); ! 236: ! 237: if (DosSetMem((PVOID)(parg->pExceptionContext->EC_cr2), ! 238: 1L,PAG_DEFAULT | PAG_COMMIT) != 0L) ! 239: return(NOT_HANDLED); ! 240: else ! 241: return(HANDLED); ! 242: } ! 243: } ! 244: ! 245: /* At this point, we have a GP Fault. We cannot ! 246: recover, so raise the terminate process exception and ! 247: return (GP Fault) exception handled. */ ! 248: ! 249: WinMessageBox(HWND_DESKTOP, ! 250: hwndMain, ! 251: "A non-recoverable General Protection Error " ! 252: "has occured.\n\rProgram Terminating.", ! 253: szAppName, ! 254: 13, ! 255: MB_OK | MB_ICONHAND); ! 256: ! 257: return(NOT_HANDLED); ! 258: } ! 259: ! 260: /* The exception is not one that we handle, so pass it on as ! 261: NOT_HANDLED. */ ! 262: ! 263: return(NOT_HANDLED); ! 264: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.