182 lines
4.2 KiB
NASM
182 lines
4.2 KiB
NASM
title "Raise Exception"
|
||
;++
|
||
;
|
||
; Copyright (c) 1989 Microsoft Corporation
|
||
;
|
||
; Module Name:
|
||
;
|
||
; raise.asm
|
||
;
|
||
; Abstract:
|
||
;
|
||
; This module implements the function to raise a software exception.
|
||
;
|
||
; Author:
|
||
;
|
||
; Bryan Willman 11 april 90
|
||
;
|
||
; Environment:
|
||
;
|
||
; Any mode.
|
||
;
|
||
; Revision History:
|
||
;
|
||
;--
|
||
.386p
|
||
.xlist
|
||
include ks386.inc
|
||
include callconv.inc ; calling convention macros
|
||
.list
|
||
|
||
EXTRNP _ZwRaiseException,3
|
||
|
||
_TEXT SEGMENT DWORD PUBLIC 'CODE'
|
||
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
|
||
|
||
;
|
||
; Context flags definition.
|
||
;
|
||
|
||
CONTEXT_SETTING EQU CONTEXT_INTEGER OR CONTEXT_CONTROL OR CONTEXT_SEGMENTS
|
||
|
||
|
||
;
|
||
; Exception record length definition.
|
||
;
|
||
|
||
EXCEPTION_RECORD_LENGTH EQU (ErExceptionInformation + 16) AND 0fffffff0H
|
||
|
||
page
|
||
subttl "Raise Software Exception"
|
||
;++
|
||
;
|
||
; VOID
|
||
; RtlRaiseException (
|
||
; IN PEXCEPTION_RECORD ExceptionRecord
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function raises a software exception by building a context record,
|
||
; establishing the stack limits of the current processor mode, and calling
|
||
; the exception dispatcher. If the exception dispatcher finds a handler
|
||
; to process the exception, then control is returned to the caller using
|
||
; the NtContinue system service. Otherwise the NtLastChance system service
|
||
; is called to provide default handing.
|
||
;
|
||
; N.B. On the 386, floating point state is not defined for non-fp
|
||
; exceptions. Therefore, this routine does not attempt to
|
||
; capture it.
|
||
;
|
||
; This means this routine cannot be used to report fp exceptions.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; ExceptionRecord (ebp+8) - Supplies a pointer to an exception record.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; None.
|
||
;
|
||
;--
|
||
|
||
cPublicProc _RtlRaiseException ,1
|
||
|
||
push ebp
|
||
mov ebp,esp
|
||
pushfd ; save flags before sub
|
||
sub esp,ContextFrameLength ; Allocate a context record
|
||
|
||
;
|
||
; Save regs we use in context record
|
||
;
|
||
|
||
mov [(ebp-ContextFrameLength-4)+CsEax],eax
|
||
mov [(ebp-ContextFrameLength-4)+CsEcx],ecx
|
||
|
||
;
|
||
; Get pointer to exception report record, and set the exceptionaddress
|
||
; field to be our return address
|
||
;
|
||
|
||
mov eax,[ebp+8] ; (eax) -> ExceptionReportRecord
|
||
|
||
mov ecx,[ebp+4]
|
||
mov [eax.ErExceptionAddress],ecx
|
||
|
||
;
|
||
; Copy machine context into the context record
|
||
;
|
||
|
||
|
||
lea eax,[ebp-ContextFrameLength-4] ; (eax) -> Context record
|
||
|
||
mov [eax.CsEip],ecx
|
||
|
||
mov [eax.CsEbx],ebx
|
||
mov [eax.CsEdx],edx
|
||
|
||
mov [eax.CsEsi],esi
|
||
mov [eax.CsEdi],edi
|
||
|
||
;
|
||
; context record's ESP must have the argument popped off the stack
|
||
;
|
||
|
||
lea ecx,[ebp+12]
|
||
|
||
mov [eax.CsEsp],ecx
|
||
|
||
mov ecx,[ebp]
|
||
mov [eax.CsEbp],ecx
|
||
|
||
mov ecx,[ebp-4]
|
||
mov [eax.CsEflags],ecx
|
||
|
||
mov dword ptr [eax.CsSegCs],cs
|
||
mov dword ptr [eax.CsSegDs],ds
|
||
mov dword ptr [eax.CsSegEs],es
|
||
mov dword ptr [eax.CsSegFs],fs
|
||
mov dword ptr [eax.CsSegGs],gs
|
||
mov dword ptr [eax.CsSegSs],ss
|
||
|
||
;
|
||
; Set Context flags, note that FLOATING_POINT is NOT set.
|
||
;
|
||
|
||
mov dword ptr [eax.CsContextFlags],CONTEXT_SETTING
|
||
|
||
;
|
||
; _ZwRaiseException(ExceptionRecord, ContextRecord, FirstChance=TRUE)
|
||
;
|
||
|
||
; 1 - TRUE
|
||
; eax - Context Record
|
||
; [ebp+8] - Exception Report Record
|
||
|
||
stdCall _ZwRaiseException,<[ebp+8],eax,1>
|
||
|
||
;
|
||
; We came back, suggesting some sort of error in the call. Raise
|
||
; a status exception to report this, return from ZwRaiseException is type.
|
||
;
|
||
|
||
sub esp,EXCEPTION_RECORD_LENGTH ; allocate record on stack, esp is base
|
||
mov [esp.ErExceptionCode],eax ; set exception type
|
||
mov dword ptr [esp.ErExceptionFlags],EXCEPTION_NONCONTINUABLE
|
||
mov dword ptr [esp.ErNumberParameters],0 ; no parms
|
||
mov eax,[ebp+8]
|
||
mov [esp.ErExceptionRecord],eax ; point back to first exception
|
||
mov eax,esp
|
||
stdCall _RtlRaiseException,<eax>
|
||
|
||
;
|
||
; We will never come here, because RtlRaiseException will not allow
|
||
; return if exception is non-continuable.
|
||
;
|
||
|
||
stdENDP _RtlRaiseException
|
||
|
||
_TEXT ends
|
||
end
|