windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/iisrtl/i386/xcptmisc.asm

121 lines
2.9 KiB
NASM
Raw Normal View History

2020-09-26 03:20:57 -05:00
title "Miscellaneous Exception Handling"
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; xcptmisc.asm
;
; Abstract:
;
; This module implements miscellaneous routines that are required to
; support exception handling. Functions are provided to call an exception
; handler for an exception, call an exception handler for unwinding, get
; the caller's stack pointer, get the caller's frame pointer, get the
; caller's floating status, get the caller's processor state, get the
; caller's extended processor status, and get the current stack limits.
;
; Author:
;
; David N. Cutler (davec) 14-Aug-1989
;
; Environment:
;
; Any mode.
;
; Revision History:
;
; Keith Moore (keithmo) 12-Sep-1997
;
; Stolen from ntdll for use in IIS.
;
;--
.386p
.xlist
include ks386.inc
include callconv.inc ; calling convention macros
.list
_TEXT$01 SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
page
subttl "Capture Context"
;++
;
; VOID
; PuDbgCaptureContext (PCONTEXT ContextRecord)
;
; Routine Description:
;
; This fucntion fills in the specified context record with the
; current state of the machine, except that the values of EBP
; and ESP are computed to be those of the caller's caller.
;
; N.B. This function assumes it is called from a 'C' procedure with
; the old ebp at [ebp], the return address at [ebp+4], and
; old esp = ebp + 8.
;
; Certain 'C' optimizations may cause this to not be true.
;
; N.B. This function does NOT adjust ESP to pop the arguments off
; the caller's stack. In other words, it provides a __cdecl ESP,
; NOT a __stdcall ESP. This is mainly because we can't figure
; out how many arguments the caller takes.
;
; N.B. Floating point state is NOT captured.
;
; Arguments:
;
; ContextRecord (esp+4) - Address of context record to fill in.
;
; Return Value:
;
; The caller's return address.
;
;--
cPublicProc _PuDbgCaptureContext ,1
push ebx
mov ebx,[esp+8] ; (ebx) -> ContextRecord
mov dword ptr [ebx.CsEax],eax
mov dword ptr [ebx.CsEcx],ecx
mov dword ptr [ebx.CsEdx],edx
mov eax, [esp]
mov dword ptr [ebx.CsEbx],eax
mov dword ptr [ebx.CsEsi],esi
mov dword ptr [ebx.CsEdi],edi
mov [ebx.CsSegCs],cs
mov [ebx.CsSegDs],ds
mov [ebx.CsSegEs],es
mov [ebx.CsSegFs],fs
mov [ebx.CsSegGs],gs
mov [ebx.CsSegSs],ss
pushfd
pop [ebx.CsEflags]
mov eax,[ebp+4]
mov [ebx.CsEip],eax
mov eax,[ebp]
mov [ebx.CsEbp],eax
lea eax,[ebp+8]
mov [ebx.CsEsp],eax
pop ebx
stdRET _PuDbgCaptureContext
stdENDP _PuDbgCaptureContext
_TEXT$01 ends
end