home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sftick.zip / adv / guard / good / GP.C < prev    next >
Text File  |  1994-04-21  |  5KB  |  133 lines

  1. #define INCL_DOSMEMMGR
  2. #define INCL_DOSEXCEPTIONS
  3.  
  4. #include <os2.h>
  5. #include <stdio.h>
  6.  
  7. #define NUM_PAGES                3
  8. #define SZ_PAGE                  4096
  9.  
  10. ULONG MyExceptionHandler ( PEXCEPTIONREPORTRECORD pTrap ) ;
  11.  
  12. PBYTE pbBase ; /* Base of entire memory object */
  13.  
  14. INT main ( VOID )
  15. {
  16.    LONG     lIndex ;
  17.    EXCEPTIONREGISTRATIONRECORD      errRegister ;
  18.    APIRET      arReturn ;
  19.  
  20.    pbBase = NULL ;
  21.  
  22.    /* register exception handler */
  23.    errRegister.ExceptionHandler = (_ERR *) &MyExceptionHandler ;
  24.    arReturn = DosSetExceptionHandler ( &errRegister ) ;
  25.    printf ( "DosSetExceptionHandler returns %ld\n", arReturn ) ;
  26.  
  27.    /* allocate some memory */
  28.    arReturn = DosAllocMem ( (PPVOID) &pbBase,
  29.                              NUM_PAGES * SZ_PAGE,
  30.                              PAG_READ | PAG_WRITE ) ;
  31.  
  32.    printf ( "DosAllocMem returns %ld ( pbBase = %p ) \n",
  33.       arReturn,
  34.       pbBase ) ;
  35.  
  36.    //-----------------------------------------------------------
  37.    // Commit first page and set to guard page
  38.    //-----------------------------------------------------------
  39.    arReturn = DosSetMem ( pbBase,
  40.                           SZ_PAGE,
  41.                           PAG_COMMIT | PAG_READ |
  42.                           PAG_WRITE | PAG_GUARD ) ;
  43.    printf ( "Return Code from DosSetMem, "
  44.             "%ld - pbBase = %p\n",
  45.             arReturn,
  46.             pbBase ) ;
  47.  
  48.    //-----------------------------------------------------------
  49.    // Write to pages, from bottom to top
  50.    //-----------------------------------------------------------
  51.    for ( lIndex = 0L ;
  52.       lIndex < ( NUM_PAGES * SZ_PAGE ) ;
  53.       lIndex += 0x0010L ) {
  54.        printf ( "\rWriting to offset 0x%08lX", lIndex ) ;
  55.        pbBase [lIndex] = 1 ;
  56.        printf ( "\rWritten to offset 0x%08lX", lIndex ) ;
  57.    } /* endfor */
  58.  
  59.    printf ( "\n" ) ;
  60.  
  61.    //--------------------------------------------------------------
  62.    // Free memory area
  63.    //--------------------------------------------------------------
  64.    printf ( "Freeing pbBase = %p\n", pbBase ) ;
  65.    arReturn = DosFreeMem ( pbBase ) ;
  66.    /* BINGO - Before exiting, reset exception handler back to
  67.       system exception handler */
  68.    DosUnsetExceptionHandler( &errRegister ) ;
  69.    return 0 ;
  70. }
  71.  
  72. ULONG MyExceptionHandler ( PEXCEPTIONREPORTRECORD perrTrap )
  73. {
  74.    ULONG       ulReturn ; /* return from exception handler */
  75.    APIRET      arReturn ; /* return code from API's        */
  76.    PBYTE       pbTrap ;   /* fault address                 */
  77.  
  78.    ulReturn = XCPT_CONTINUE_SEARCH ;
  79.  
  80.    /* this is the only exception we're interested in */
  81.  
  82.    if ( perrTrap -> ExceptionNum == XCPT_GUARD_PAGE_VIOLATION ) {
  83.       printf ( "\n *** Guard exception *** \n" ) ;
  84.  
  85.       pbTrap = ( PBYTE ) perrTrap -> ExceptionInfo [1] ;
  86.  
  87.       //---------------------------------------------------------
  88.       // Check that the fault is within our memory zone, so that
  89.       // we won't interfer with system handling of stack growth
  90.       //---------------------------------------------------------
  91.       if (( pbTrap >= pbBase ) &&
  92.        ( pbTrap < pbBase + (NUM_PAGES * SZ_PAGE) )) {
  93.  
  94.          //-----------------------------------------------------
  95.          // Unguard guard page
  96.          //-----------------------------------------------------
  97.          arReturn = DosSetMem ( pbTrap,
  98.                                 SZ_PAGE,
  99.                                 PAG_READ | PAG_WRITE ) ;
  100.  
  101.          printf ( "DosSetMem returns %ld "
  102.                   "( pbTrap = 0x%08lX ) \n",
  103.                   arReturn,
  104.                   pbTrap ) ;
  105.  
  106.          pbTrap += SZ_PAGE ;
  107.  
  108.          //-----------------------------------------------------
  109.          // Commit and guard next page above
  110.          //-----------------------------------------------------
  111.          if (( pbTrap >= pbBase ) &&
  112.              ( pbTrap < pbBase + NUM_PAGES * SZ_PAGE )) {
  113.             arReturn = DosSetMem ( pbTrap,
  114.                                    SZ_PAGE,
  115.                                    PAG_COMMIT | PAG_READ |
  116.                                    PAG_WRITE | PAG_GUARD ) ;
  117.  
  118.             printf ( "DosSetMem returns %ld "
  119.                      "( pbTrap = 0x%08lX ) \n",
  120.                      arReturn,
  121.                      pbTrap ) ;
  122.          } /* endif */
  123.  
  124.          //-----------------------------------------------------
  125.          // We can continue execution
  126.          //-----------------------------------------------------
  127.          ulReturn = XCPT_CONTINUE_EXECUTION ;
  128.        } /* endif */
  129.    } /* endif */
  130.  
  131.    return ulReturn ;
  132. }
  133.