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 >
Wrap
Text File
|
1994-04-21
|
5KB
|
133 lines
#define INCL_DOSMEMMGR
#define INCL_DOSEXCEPTIONS
#include <os2.h>
#include <stdio.h>
#define NUM_PAGES 3
#define SZ_PAGE 4096
ULONG MyExceptionHandler ( PEXCEPTIONREPORTRECORD pTrap ) ;
PBYTE pbBase ; /* Base of entire memory object */
INT main ( VOID )
{
LONG lIndex ;
EXCEPTIONREGISTRATIONRECORD errRegister ;
APIRET arReturn ;
pbBase = NULL ;
/* register exception handler */
errRegister.ExceptionHandler = (_ERR *) &MyExceptionHandler ;
arReturn = DosSetExceptionHandler ( &errRegister ) ;
printf ( "DosSetExceptionHandler returns %ld\n", arReturn ) ;
/* allocate some memory */
arReturn = DosAllocMem ( (PPVOID) &pbBase,
NUM_PAGES * SZ_PAGE,
PAG_READ | PAG_WRITE ) ;
printf ( "DosAllocMem returns %ld ( pbBase = %p ) \n",
arReturn,
pbBase ) ;
//-----------------------------------------------------------
// Commit first page and set to guard page
//-----------------------------------------------------------
arReturn = DosSetMem ( pbBase,
SZ_PAGE,
PAG_COMMIT | PAG_READ |
PAG_WRITE | PAG_GUARD ) ;
printf ( "Return Code from DosSetMem, "
"%ld - pbBase = %p\n",
arReturn,
pbBase ) ;
//-----------------------------------------------------------
// Write to pages, from bottom to top
//-----------------------------------------------------------
for ( lIndex = 0L ;
lIndex < ( NUM_PAGES * SZ_PAGE ) ;
lIndex += 0x0010L ) {
printf ( "\rWriting to offset 0x%08lX", lIndex ) ;
pbBase [lIndex] = 1 ;
printf ( "\rWritten to offset 0x%08lX", lIndex ) ;
} /* endfor */
printf ( "\n" ) ;
//--------------------------------------------------------------
// Free memory area
//--------------------------------------------------------------
printf ( "Freeing pbBase = %p\n", pbBase ) ;
arReturn = DosFreeMem ( pbBase ) ;
/* BINGO - Before exiting, reset exception handler back to
system exception handler */
DosUnsetExceptionHandler( &errRegister ) ;
return 0 ;
}
ULONG MyExceptionHandler ( PEXCEPTIONREPORTRECORD perrTrap )
{
ULONG ulReturn ; /* return from exception handler */
APIRET arReturn ; /* return code from API's */
PBYTE pbTrap ; /* fault address */
ulReturn = XCPT_CONTINUE_SEARCH ;
/* this is the only exception we're interested in */
if ( perrTrap -> ExceptionNum == XCPT_GUARD_PAGE_VIOLATION ) {
printf ( "\n *** Guard exception *** \n" ) ;
pbTrap = ( PBYTE ) perrTrap -> ExceptionInfo [1] ;
//---------------------------------------------------------
// Check that the fault is within our memory zone, so that
// we won't interfer with system handling of stack growth
//---------------------------------------------------------
if (( pbTrap >= pbBase ) &&
( pbTrap < pbBase + (NUM_PAGES * SZ_PAGE) )) {
//-----------------------------------------------------
// Unguard guard page
//-----------------------------------------------------
arReturn = DosSetMem ( pbTrap,
SZ_PAGE,
PAG_READ | PAG_WRITE ) ;
printf ( "DosSetMem returns %ld "
"( pbTrap = 0x%08lX ) \n",
arReturn,
pbTrap ) ;
pbTrap += SZ_PAGE ;
//-----------------------------------------------------
// Commit and guard next page above
//-----------------------------------------------------
if (( pbTrap >= pbBase ) &&
( pbTrap < pbBase + NUM_PAGES * SZ_PAGE )) {
arReturn = DosSetMem ( pbTrap,
SZ_PAGE,
PAG_COMMIT | PAG_READ |
PAG_WRITE | PAG_GUARD ) ;
printf ( "DosSetMem returns %ld "
"( pbTrap = 0x%08lX ) \n",
arReturn,
pbTrap ) ;
} /* endif */
//-----------------------------------------------------
// We can continue execution
//-----------------------------------------------------
ulReturn = XCPT_CONTINUE_EXECUTION ;
} /* endif */
} /* endif */
return ulReturn ;
}