|
|
page ,132 title except86 - Exception Handler for x86 machines - DOS MODE ;*** ; ; Microsoft OS/2 LAN Manager ; Copyright(c) Microsoft Corp., 1990 ; ;Purpose: ; ; This is OS specific part of exceptions for the x86 machines. ; This is simple because there is only 1 thread. Just get ; the current exception context through a static pointer. ; This is done in assembly so we can call the C runtime on ; unhandled exceptions. ;*******************************************************************************
.model large,PASCAL option oldstructs
ExceptionExitCode = 1000
MSG segment byte public 'MSG'
dw ExceptionExitCode db 'Unhandled Remote Procedure Call Exception',13,10,0
MSG ends
externdef syscall __amsg_exit:far
; NOTE - This is copied in except86.asm and sized in dos\rpc.h
ExceptBuff struc
savBP dw ? savDI dw ? savSI dw ? savSP dw ? savREToff dw ? savRETseg dw ? savDS dw ? pad1 dw ? pad2 dw ?
nextExceptOff dw ? ; Next exception handler nextExceptSeg dw ?
ExceptBuff ends
.data
pThreadHandlers dword 0
.code
; this routine was added to make Microsoft Exchange's MONITOR mode ; able to detect when we're in an RPC call. ; returns 0 of no exception handler registerd, or non-0 otherwise RpcExceptionRegistered proc pascal
push ds push si
; no guarantee that we've got a valid DS!
mov ax, seg pThreadHandlers mov ds,ax mov si, offset pThreadHandlers mov ax,ds:[si+2] or ax,ds:[si]
pop si pop ds
ret RpcExceptionRegistered endp
RpcSetExceptionHandler proc pascal pExceptionBuff:ptr ExceptBuff
mov ax,word ptr pThreadHandlers mov dx,word ptr pThreadHandlers+2
mov cx,word ptr pExceptionBuff mov word ptr pThreadHandlers,cx mov cx,word ptr pExceptionBuff+2 mov word ptr pThreadHandlers+2,cx
ret RpcSetExceptionHandler endp
RpcGetExceptionHandler proc pascal
mov ax,word ptr pThreadHandlers mov dx,word ptr pThreadHandlers+2
or dx,dx jnz @F
; No exception handler, exit process via the runtime.
mov ax, ExceptionExitCode jmp __amsg_exit @@: ret RpcGetExceptionHandler endp
RpcLeaveException proc pascal les bx, pThreadHandlers
mov ax, es:[bx.nextExceptOff] mov word ptr pThreadHandlers,ax mov ax, es:[bx.nextExceptSeg] mov word ptr pThreadHandlers+2,ax
ret RpcLeaveException endp
end
|