121 lines
2.9 KiB
NASM
121 lines
2.9 KiB
NASM
|
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
|
|||
|
|