Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

316 lines
8.1 KiB

title "Raise Exception"
;++
;
; Copyright (c) 1990 Microsoft Corporation
;
; Module Name:
;
; raisests.asm
;
; Abstract:
;
; This module implements the function to raise a software exception.
;
; Author:
;
; Bryan Willman 11 Nov 90
;
; Environment:
;
; Any mode.
;
; Revision History:
;
;--
.386p
.xlist
include ks386.inc
include callconv.inc ; calling convention macros
.list
EXTRNP _RtlDispatchException,2
EXTRNP _ZwContinue,2
EXTRNP _ZwRaiseException,3
_TEXT$01 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
; ExRaiseException (
; 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 _ExRaiseException , 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
lea ecx,[ebp+8]
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
;
; _RtlDispatchException(ExceptionRecord, ContextRecord)
;
stdCall _RtlDispatchException, <[ebp+8],eax>
;
; If the exception is successfully dispatched, then continue execution.
; Otherwise, give the kernel debugger a chance to handle the exception.
;
lea ecx,[ebp-ContextFrameLength-4] ; (eax) -> Context record
or eax, eax
jz short ere10
stdCall _ZwContinue, <ecx,0>
jmp short ere20
ere10:
stdCall _ZwRaiseException, <[ebp+8],ecx,0>
ere20:
;
; Either the attempt to continue execution or the attempt to give
; the kernel debugger a chance to handle the exception failed. Raise
; a noncontinuable exception.
;
stdCall _ExRaiseStatus, <eax>
stdENDP _ExRaiseException
page
subttl "Raise Software Exception"
;++
;
; VOID
; ExRaiseStatus (
; IN NTSTATUS Status
; )
;
; Routine Description:
;
; This function raises a software exception with the specified status value
; 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:
;
; Status - Supplies the status value to be used as the exception code
; for the exception that is to be raised.
;
; Return Value:
;
; None.
; Arguments:
;
;--
cPublicProc _ExRaiseStatus,1
push ebp
mov ebp,esp
pushfd ; save flags before sub
sub esp,ContextFrameLength+ExceptionRecordLength
;
; Save regs we use in context record
;
mov [(ebp-ContextFrameLength-4)+CsEax],eax
mov [(ebp-ContextFrameLength-4)+CsEcx],ecx
;
; Copy machine context into the context record
;
lea eax,[ebp-ContextFrameLength-4] ; (eax) -> Context record
mov ecx,[ebp+4] ; [ecx] = returned address
mov [eax.CsEip],ecx
mov [eax.CsEbx],ebx
mov [eax.CsEdx],edx
mov [eax.CsEsi],esi
mov [eax.CsEdi],edi
lea ecx,[ebp+8]
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
;
; Get pointer to exception report record, and set the exceptionaddress
; field to be our return address
;
lea eax,[ebp-ContextFrameLength-ExceptionRecordLength-4]
; (eax) -> ExceptionRecord
mov ecx,[ebp+4]
mov dword ptr [eax.ErExceptionAddress],ecx
mov ecx,[ebp+8]
mov dword ptr [eax.ErExceptionCode],ecx
mov dword ptr [eax.ErNumberParameters], 0
mov dword ptr [eax.ErExceptionRecord], 0
mov dword ptr [eax.ErExceptionFlags], EXCEPTION_NONCONTINUABLE
;
; _RtlDispatchException(ExceptionRecord, ContextRecord)
;
lea ecx,[ebp-ContextFrameLength-4] ; (eax) -> Context record
; ecx - Context record
; eax - Exception record
stdCall _RtlDispatchException, <eax, ecx>
;
; An unwind was not initiated during the dispatching of a noncontinuable
; exception. Give the kernel debugger a chance to handle the exception.
;
;
; _ZwRaiseException(ExceptionRecord, ContextRecord, FirstChance=TRUE)
;
lea ecx,[ebp-ContextFrameLength-4] ; (eax) -> Context record
lea eax,[ebp-ContextFrameLength-ExceptionRecordLength-4]
; 1 - TRUE
; ecx - Context Record
; eax - Exception Report Record
stdCall _ZwRaiseException, <eax, ecx, 1>
;
; We came back, suggesting some sort of error in the call. Raise
; a status exception to report this, return from ZwRaiseException is type.
;
stdCall _ExRaiseStatus, <eax>
stdENDP _ExRaiseStatus
_TEXT$01 ends
end