home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1992 November
/
CICA_MS_Windows_CD-ROM_Walnut_Creek_November_1992.iso
/
zipped
/
programr
/
faultw.zoo
/
HANDLER.ASM
< prev
Wrap
Assembly Source File
|
1992-03-30
|
5KB
|
165 lines
;
; HANDLER.ASM
;
; ExceptionHandler function used as the callback for the GP Fault Handler.
;
; Copyright(c) Microsoft Corp. 1992 All Rights Reserved
;
.xlist
?PLM=1
?WIN=1
include cmacros.inc
include toolhelp.inc
include fault.inc
.list
createSeg HANDLER_TEXT, HANDLER_TEXT, BYTE, PUBLIC, CODE
sBegin HANDLER_TEXT
assumes CS,HANDLER_TEXT
assumes DS,_DATA
;
; ExceptionHandler
;
; Purpose:
; Exception handling function called from ToolHelp when it detects
; an exception. If the error was caused by our application AND we
; want to trap it, then we use Throw to return control to the function
; that faulted at a point BEFORE the erroneous code. If we do not
; want the fault, then we just pass it to the next interrupt handler.
;
; If the fault was caused by our application, we use Throw to return to
; whatever function caused it. Otherwise we just let the fault pass.
;
; Parameters:
; None; however, the stack contains values of interest. We use AX to
; simply set the DS register properly.
;
; | . |
; | . |
; | . |
; |-----------------------|
; | SS (fault) | SP + 12h
; |-----------------------|
; | SP (fault) | SP + 10h
; |-----------------------|
; | Flags (fault) | SP + 0Eh
; |-----------------------|
; | CS (fault) | SP + 0Ch
; |-----------------------|
; | IP (fault) | SP + 0Ah
; |-----------------------|
; | handle (internal) | SP + 08h
; |-----------------------|
; | interrupt number | SP + 06h
; |-----------------------|
; | AX (NOT the DS) | SP + 04h
; |-----------------------|
; | CS (toolhelp.dll) | SP + 02h
; |-----------------------|
; | IP (toolhelp.dll) | SP + 00h
; +-----------------------+
;
; Note that the interrupt number may have the high bit set to
; indicate a low-stack fault (above and beyond a normal Int 12 stack)
; fault. We trap this condition if we're trapping a stack fault or a
; GP fault.
;
cProc ExceptionHandler, <PUBLIC,FAR>
cBegin nogen
mov ds,ax ;Make sure we can reference our data.
mov ax,bp
mov bp,sp
mov bx,[bp+06]
mov bp,ax
;
; Cycle through the possible faults we are looking for.
; If BX contains that fault, then we use Throw to return
; the error to the application. Otherwise we pass the
; fault down the chain.
;
; First, the high bit might be set in the interrupt meaning
; that we have a low-stack fault. Since we do not handle
; these, we exit this handler.
;
test bx,08000h ;Check high bit
jnz EHExit ;Leave it it's set--we can't handle it.
mov ax,_wException ;Get the exceptions we want to trap.
or ax,ax ;Do we want any?
jz EHExit
EHDivideByZero:
;
; Check for divide by zero.
;
test ax,EXCEPTION_DIVIDEBYZERO
jz EHGPFault
or bx,bx
jz EHThrow
EHGPFault:
;
; Check for a GP fault.
;
test ax,EXCEPTION_GPFAULT
jz EHExit
cmp bx,13
je EHThrow
EHThrow:
ccall Throw,<_pcbEx, 1> ;Return the exception to the faulting
;function.
EHExit:
retf
EHRestart:
;
; This code illustrates what we need to do if we wanted to
; clean up the problem and restart the instruction that faulted.
; This exception handler does not use this code.
;
add sp,10 ;Clear the return data on the stack.
iret ;Return to the faulting instruction.
EHTerminate:
;
; This code illustrates what we need to do if we wanted to
; terminate the applciation on this exception. This exception
; handler does not use this code.
;
add sp,10 ;Clear the return data on the stack.
;
; With TerminateApp you have the choice to display the standard
; UAE box or not. This sample does since it otherwise would give
; no indication of the problem.
;
cCall TerminateApp, <0, UAE_BOX>
cEnd nogen
sEnd HANDLER_TEXT
END