mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Fix bugs on optimized build, fix RtlpDispatchException gobbling up ebx (thx ge), remove obsolete files
svn path=/trunk/; revision=13264
This commit is contained in:
parent
e19650d041
commit
05ea4c4aa5
5 changed files with 6 additions and 584 deletions
|
@ -7254,9 +7254,11 @@ static INT WINAPI LISTVIEW_CallBackCompare(LPVOID first, LPVOID second, LPARAM l
|
||||||
LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)lParam;
|
LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)lParam;
|
||||||
ITEM_INFO* lv_first = (ITEM_INFO*) DPA_GetPtr( (HDPA)first, 0 );
|
ITEM_INFO* lv_first = (ITEM_INFO*) DPA_GetPtr( (HDPA)first, 0 );
|
||||||
ITEM_INFO* lv_second = (ITEM_INFO*) DPA_GetPtr( (HDPA)second, 0 );
|
ITEM_INFO* lv_second = (ITEM_INFO*) DPA_GetPtr( (HDPA)second, 0 );
|
||||||
|
PFNLVCOMPARE CompareFunction = infoPtr->pfnCompare;
|
||||||
|
|
||||||
/* Forward the call to the client defined callback */
|
/* Forward the call to the client defined callback */
|
||||||
return (infoPtr->pfnCompare)( lv_first->lParam , lv_second->lParam, infoPtr->lParamSort );
|
|
||||||
|
return (CompareFunction)( lv_first->lParam , lv_second->lParam, infoPtr->lParamSort );
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
|
|
|
@ -1,291 +0,0 @@
|
||||||
/* $Id$
|
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* PURPOSE: User-mode exception support for IA-32
|
|
||||||
* FILE: lib/ntdll/rtl/i386/except.s
|
|
||||||
* PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
||||||
* NOTES: This file is shared with ntoskrnl/rtl/i386/except.s.
|
|
||||||
* Please keep them in sync.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define EXCEPTION_UNWINDING 0x02
|
|
||||||
|
|
||||||
#define EREC_FLAGS 0x04
|
|
||||||
|
|
||||||
#define ExceptionContinueExecution 0
|
|
||||||
#define ExceptionContinueSearch 1
|
|
||||||
#define ExceptionNestedException 2
|
|
||||||
#define ExceptionCollidedUnwind 3
|
|
||||||
|
|
||||||
.globl _RtlpExecuteHandlerForException
|
|
||||||
.globl _RtlpExecuteHandlerForUnwind
|
|
||||||
|
|
||||||
#define CONTEXT_FLAGS 0x00
|
|
||||||
#define CONTEXT_SEGGS 0x8C
|
|
||||||
#define CONTEXT_SEGFS 0x90
|
|
||||||
#define CONTEXT_SEGES 0x94
|
|
||||||
#define CONTEXT_SEGDS 0x98
|
|
||||||
#define CONTEXT_EDI 0x9C
|
|
||||||
#define CONTEXT_ESI 0xA0
|
|
||||||
#define CONTEXT_EBX 0xA4
|
|
||||||
#define CONTEXT_EDX 0xA8
|
|
||||||
#define CONTEXT_ECX 0xAC
|
|
||||||
#define CONTEXT_EAX 0xB0
|
|
||||||
#define CONTEXT_EBP 0xB4
|
|
||||||
#define CONTEXT_EIP 0xB8
|
|
||||||
#define CONTEXT_SEGCS 0xBC
|
|
||||||
#define CONTEXT_EFLAGS 0xC0
|
|
||||||
#define CONTEXT_ESP 0xC4
|
|
||||||
#define CONTEXT_SEGSS 0xC8
|
|
||||||
|
|
||||||
|
|
||||||
#define RCC_CONTEXT 0x08
|
|
||||||
|
|
||||||
// EAX = value to print
|
|
||||||
_do_debug:
|
|
||||||
pushal
|
|
||||||
pushl %eax
|
|
||||||
call _AsmDebug@4
|
|
||||||
popal
|
|
||||||
ret
|
|
||||||
|
|
||||||
#ifndef __NTOSKRNL__
|
|
||||||
|
|
||||||
//
|
|
||||||
// VOID
|
|
||||||
// RtlpCaptureContext(PCONTEXT pContext);
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+08h] - PCONTEXT_X86 pContext
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// Nothing
|
|
||||||
// Notes:
|
|
||||||
// Grabs the current CPU context.
|
|
||||||
.globl _RtlpCaptureContext
|
|
||||||
_RtlpCaptureContext:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp, %ebp
|
|
||||||
movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure
|
|
||||||
|
|
||||||
cld
|
|
||||||
pushf
|
|
||||||
pop %eax
|
|
||||||
movl %eax, CONTEXT_EFLAGS(%edx)
|
|
||||||
xorl %eax, %eax
|
|
||||||
movl %eax, CONTEXT_EAX(%edx)
|
|
||||||
movl %eax, CONTEXT_EBX(%edx)
|
|
||||||
movl %eax, CONTEXT_ECX(%edx)
|
|
||||||
movl %eax, CONTEXT_EDX(%edx)
|
|
||||||
movl %eax, CONTEXT_ESI(%edx)
|
|
||||||
movl %eax, CONTEXT_EDI(%edx)
|
|
||||||
movl %cs, %eax
|
|
||||||
movl %eax, CONTEXT_SEGCS(%edx)
|
|
||||||
movl %ds, %eax
|
|
||||||
movl %eax, CONTEXT_SEGDS(%edx)
|
|
||||||
movl %es, %eax
|
|
||||||
movl %eax, CONTEXT_SEGES(%edx)
|
|
||||||
movl %fs, %eax
|
|
||||||
movl %eax, CONTEXT_SEGFS(%edx)
|
|
||||||
movl %gs, %eax
|
|
||||||
movl %eax, CONTEXT_SEGGS(%edx)
|
|
||||||
movl %ss, %eax
|
|
||||||
movl %eax, CONTEXT_SEGSS(%edx)
|
|
||||||
|
|
||||||
//
|
|
||||||
// STACK LAYOUT: - (ESP to put in context structure)
|
|
||||||
// - RETURN ADDRESS OF CALLER OF CALLER
|
|
||||||
// - EBP OF CALLER OF CALLER
|
|
||||||
// ...
|
|
||||||
// - RETURN ADDRESS OF CALLER
|
|
||||||
// - EBP OF CALLER
|
|
||||||
// ...
|
|
||||||
//
|
|
||||||
|
|
||||||
// Get return address of the caller of the caller of this function
|
|
||||||
movl %ebp, %ebx
|
|
||||||
//movl 4(%ebx), %eax // EAX = return address of caller
|
|
||||||
movl (%ebx), %ebx // EBX = EBP of caller
|
|
||||||
|
|
||||||
movl 4(%ebx), %eax // EAX = return address of caller of caller
|
|
||||||
movl (%ebx), %ebx // EBX = EBP of caller of caller
|
|
||||||
|
|
||||||
movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller
|
|
||||||
movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller
|
|
||||||
addl $8, %ebx
|
|
||||||
movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8
|
|
||||||
|
|
||||||
movl %ebp, %esp
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
#endif /* !__NTOSKRNL__ */
|
|
||||||
|
|
||||||
#define REH_ERECORD 0x08
|
|
||||||
#define REH_RFRAME 0x0C
|
|
||||||
#define REH_CONTEXT 0x10
|
|
||||||
#define REH_DCONTEXT 0x14
|
|
||||||
#define REH_EROUTINE 0x18
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// None
|
|
||||||
// Registers:
|
|
||||||
// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [EBP+10h] - PVOID Context
|
|
||||||
// [EBP+14h] - PVOID DispatcherContext
|
|
||||||
// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine
|
|
||||||
// EDX - Address of protecting exception handler
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// Setup the protecting exception handler and call the exception
|
|
||||||
// handler in the right context.
|
|
||||||
_RtlpExecuteHandler:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp, %ebp
|
|
||||||
pushl REH_RFRAME(%ebp)
|
|
||||||
|
|
||||||
pushl %edx
|
|
||||||
pushl %fs:0x0
|
|
||||||
movl %esp, %fs:0x0
|
|
||||||
|
|
||||||
// Prepare to call the exception handler
|
|
||||||
pushl REH_DCONTEXT(%ebp)
|
|
||||||
pushl REH_CONTEXT(%ebp)
|
|
||||||
pushl REH_RFRAME(%ebp)
|
|
||||||
pushl REH_ERECORD(%ebp)
|
|
||||||
|
|
||||||
// Now call the exception handler
|
|
||||||
movl REH_EROUTINE(%ebp), %eax
|
|
||||||
call *%eax
|
|
||||||
|
|
||||||
cmpl $-1, %fs:0x0
|
|
||||||
jne .reh_stack_looks_ok
|
|
||||||
|
|
||||||
// This should not happen
|
|
||||||
pushl 0
|
|
||||||
pushl 0
|
|
||||||
pushl 0
|
|
||||||
pushl 0
|
|
||||||
call _RtlAssert@16
|
|
||||||
|
|
||||||
.reh_loop:
|
|
||||||
jmp .reh_loop
|
|
||||||
|
|
||||||
.reh_stack_looks_ok:
|
|
||||||
movl %fs:0x0, %esp
|
|
||||||
|
|
||||||
// Return to the 'front-end' for this function
|
|
||||||
popl %fs:0x0
|
|
||||||
movl %ebp, %esp
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
#define REP_ERECORD 0x04
|
|
||||||
#define REP_RFRAME 0x08
|
|
||||||
#define REP_CONTEXT 0x0C
|
|
||||||
#define REP_DCONTEXT 0x10
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// This exception handler protects the exception handling
|
|
||||||
// mechanism by detecting nested exceptions.
|
|
||||||
_RtlpExceptionProtector:
|
|
||||||
movl $ExceptionContinueSearch, %eax
|
|
||||||
movl REP_ERECORD(%esp), %ecx
|
|
||||||
testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
|
|
||||||
jnz .rep_end
|
|
||||||
|
|
||||||
// Unwinding is not taking place, so return ExceptionNestedException
|
|
||||||
|
|
||||||
// Set DispatcherContext field to the exception registration for the
|
|
||||||
// exception handler that executed when a nested exception occurred
|
|
||||||
movl REP_DCONTEXT(%esp), %ecx
|
|
||||||
movl REP_RFRAME(%esp), %eax
|
|
||||||
movl %eax, (%ecx)
|
|
||||||
movl $ExceptionNestedException, %eax
|
|
||||||
|
|
||||||
.rep_end:
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// Front-end
|
|
||||||
_RtlpExecuteHandlerForException:
|
|
||||||
movl $_RtlpExceptionProtector, %edx
|
|
||||||
jmp _RtlpExecuteHandler
|
|
||||||
|
|
||||||
|
|
||||||
#define RUP_ERECORD 0x04
|
|
||||||
#define RUP_RFRAME 0x08
|
|
||||||
#define RUP_CONTEXT 0x0C
|
|
||||||
#define RUP_DCONTEXT 0x10
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// This exception handler protects the exception handling
|
|
||||||
// mechanism by detecting collided unwinds.
|
|
||||||
_RtlpUnwindProtector:
|
|
||||||
movl $ExceptionContinueSearch, %eax
|
|
||||||
movl %ecx, RUP_ERECORD(%esp)
|
|
||||||
testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
|
|
||||||
jz .rup_end
|
|
||||||
|
|
||||||
// Unwinding is taking place, so return ExceptionCollidedUnwind
|
|
||||||
|
|
||||||
movl RUP_RFRAME(%esp), %ecx
|
|
||||||
movl RUP_DCONTEXT(%esp), %edx
|
|
||||||
|
|
||||||
// Set DispatcherContext field to the exception registration for the
|
|
||||||
// exception handler that executed when a collision occurred
|
|
||||||
movl RUP_RFRAME(%ecx), %eax
|
|
||||||
movl %eax, (%edx)
|
|
||||||
movl $ExceptionCollidedUnwind, %eax
|
|
||||||
|
|
||||||
.rup_end:
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
_RtlpExecuteHandlerForUnwind:
|
|
||||||
movl $_RtlpUnwindProtector, %edx
|
|
||||||
jmp _RtlpExecuteHandler
|
|
|
@ -68,6 +68,7 @@ _do_debug:
|
||||||
_RtlpCaptureContext:
|
_RtlpCaptureContext:
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
movl %esp, %ebp
|
movl %esp, %ebp
|
||||||
|
pushl %ebx
|
||||||
movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure
|
movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure
|
||||||
|
|
||||||
cld
|
cld
|
||||||
|
@ -117,6 +118,7 @@ _RtlpCaptureContext:
|
||||||
addl $8, %ebx
|
addl $8, %ebx
|
||||||
movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8
|
movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8
|
||||||
|
|
||||||
|
popl %ebx
|
||||||
movl %ebp, %esp
|
movl %ebp, %esp
|
||||||
popl %ebp
|
popl %ebp
|
||||||
ret
|
ret
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define NDEBUG
|
//#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
|
@ -1,291 +0,0 @@
|
||||||
/* $Id$
|
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* PURPOSE: Kernel-mode exception support for IA-32
|
|
||||||
* FILE: ntoskrnl/rtl/i386/except.s
|
|
||||||
* PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
||||||
* NOTES: This file is shared with lib/ntdll/rtl/i386/except.s.
|
|
||||||
* Please keep them in sync.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define EXCEPTION_UNWINDING 0x02
|
|
||||||
|
|
||||||
#define EREC_FLAGS 0x04
|
|
||||||
|
|
||||||
#define ExceptionContinueExecution 0
|
|
||||||
#define ExceptionContinueSearch 1
|
|
||||||
#define ExceptionNestedException 2
|
|
||||||
#define ExceptionCollidedUnwind 3
|
|
||||||
|
|
||||||
.globl _RtlpExecuteHandlerForException
|
|
||||||
.globl _RtlpExecuteHandlerForUnwind
|
|
||||||
|
|
||||||
#define CONTEXT_FLAGS 0x00
|
|
||||||
#define CONTEXT_SEGGS 0x8C
|
|
||||||
#define CONTEXT_SEGFS 0x90
|
|
||||||
#define CONTEXT_SEGES 0x94
|
|
||||||
#define CONTEXT_SEGDS 0x98
|
|
||||||
#define CONTEXT_EDI 0x9C
|
|
||||||
#define CONTEXT_ESI 0xA0
|
|
||||||
#define CONTEXT_EBX 0xA4
|
|
||||||
#define CONTEXT_EDX 0xA8
|
|
||||||
#define CONTEXT_ECX 0xAC
|
|
||||||
#define CONTEXT_EAX 0xB0
|
|
||||||
#define CONTEXT_EBP 0xB4
|
|
||||||
#define CONTEXT_EIP 0xB8
|
|
||||||
#define CONTEXT_SEGCS 0xBC
|
|
||||||
#define CONTEXT_EFLAGS 0xC0
|
|
||||||
#define CONTEXT_ESP 0xC4
|
|
||||||
#define CONTEXT_SEGSS 0xC8
|
|
||||||
|
|
||||||
|
|
||||||
#define RCC_CONTEXT 0x08
|
|
||||||
|
|
||||||
// EAX = value to print
|
|
||||||
_do_debug:
|
|
||||||
pushal
|
|
||||||
pushl %eax
|
|
||||||
call _AsmDebug@4
|
|
||||||
popal
|
|
||||||
ret
|
|
||||||
|
|
||||||
#ifndef __NTOSKRNL__
|
|
||||||
|
|
||||||
//
|
|
||||||
// VOID
|
|
||||||
// RtlpCaptureContext(PCONTEXT pContext);
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+08h] - PCONTEXT_X86 pContext
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// Nothing
|
|
||||||
// Notes:
|
|
||||||
// Grabs the current CPU context.
|
|
||||||
.globl _RtlpCaptureContext
|
|
||||||
_RtlpCaptureContext:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp, %ebp
|
|
||||||
movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure
|
|
||||||
|
|
||||||
cld
|
|
||||||
pushf
|
|
||||||
pop %eax
|
|
||||||
movl %eax, CONTEXT_EFLAGS(%edx)
|
|
||||||
xorl %eax, %eax
|
|
||||||
movl %eax, CONTEXT_EAX(%edx)
|
|
||||||
movl %eax, CONTEXT_EBX(%edx)
|
|
||||||
movl %eax, CONTEXT_ECX(%edx)
|
|
||||||
movl %eax, CONTEXT_EDX(%edx)
|
|
||||||
movl %eax, CONTEXT_ESI(%edx)
|
|
||||||
movl %eax, CONTEXT_EDI(%edx)
|
|
||||||
movl %cs, %eax
|
|
||||||
movl %eax, CONTEXT_SEGCS(%edx)
|
|
||||||
movl %ds, %eax
|
|
||||||
movl %eax, CONTEXT_SEGDS(%edx)
|
|
||||||
movl %es, %eax
|
|
||||||
movl %eax, CONTEXT_SEGES(%edx)
|
|
||||||
movl %fs, %eax
|
|
||||||
movl %eax, CONTEXT_SEGFS(%edx)
|
|
||||||
movl %gs, %eax
|
|
||||||
movl %eax, CONTEXT_SEGGS(%edx)
|
|
||||||
movl %ss, %eax
|
|
||||||
movl %eax, CONTEXT_SEGSS(%edx)
|
|
||||||
|
|
||||||
//
|
|
||||||
// STACK LAYOUT: - (ESP to put in context structure)
|
|
||||||
// - RETURN ADDRESS OF CALLER OF CALLER
|
|
||||||
// - EBP OF CALLER OF CALLER
|
|
||||||
// ...
|
|
||||||
// - RETURN ADDRESS OF CALLER
|
|
||||||
// - EBP OF CALLER
|
|
||||||
// ...
|
|
||||||
//
|
|
||||||
|
|
||||||
// Get return address of the caller of the caller of this function
|
|
||||||
movl %ebp, %ebx
|
|
||||||
//movl 4(%ebx), %eax // EAX = return address of caller
|
|
||||||
movl (%ebx), %ebx // EBX = EBP of caller
|
|
||||||
|
|
||||||
movl 4(%ebx), %eax // EAX = return address of caller of caller
|
|
||||||
movl (%ebx), %ebx // EBX = EBP of caller of caller
|
|
||||||
|
|
||||||
movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller
|
|
||||||
movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller
|
|
||||||
addl $8, %ebx
|
|
||||||
movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8
|
|
||||||
|
|
||||||
movl %ebp, %esp
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
#endif /* !__NTOSKRNL__ */
|
|
||||||
|
|
||||||
#define REH_ERECORD 0x08
|
|
||||||
#define REH_RFRAME 0x0C
|
|
||||||
#define REH_CONTEXT 0x10
|
|
||||||
#define REH_DCONTEXT 0x14
|
|
||||||
#define REH_EROUTINE 0x18
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// None
|
|
||||||
// Registers:
|
|
||||||
// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [EBP+10h] - PVOID Context
|
|
||||||
// [EBP+14h] - PVOID DispatcherContext
|
|
||||||
// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine
|
|
||||||
// EDX - Address of protecting exception handler
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// Setup the protecting exception handler and call the exception
|
|
||||||
// handler in the right context.
|
|
||||||
_RtlpExecuteHandler:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp, %ebp
|
|
||||||
pushl REH_RFRAME(%ebp)
|
|
||||||
|
|
||||||
pushl %edx
|
|
||||||
pushl %fs:0x0
|
|
||||||
movl %esp, %fs:0x0
|
|
||||||
|
|
||||||
// Prepare to call the exception handler
|
|
||||||
pushl REH_DCONTEXT(%ebp)
|
|
||||||
pushl REH_CONTEXT(%ebp)
|
|
||||||
pushl REH_RFRAME(%ebp)
|
|
||||||
pushl REH_ERECORD(%ebp)
|
|
||||||
|
|
||||||
// Now call the exception handler
|
|
||||||
movl REH_EROUTINE(%ebp), %eax
|
|
||||||
call *%eax
|
|
||||||
|
|
||||||
cmpl $-1, %fs:0x0
|
|
||||||
jne .reh_stack_looks_ok
|
|
||||||
|
|
||||||
// This should not happen
|
|
||||||
pushl 0
|
|
||||||
pushl 0
|
|
||||||
pushl 0
|
|
||||||
pushl 0
|
|
||||||
call _RtlAssert@16
|
|
||||||
|
|
||||||
.reh_loop:
|
|
||||||
jmp .reh_loop
|
|
||||||
|
|
||||||
.reh_stack_looks_ok:
|
|
||||||
movl %fs:0x0, %esp
|
|
||||||
|
|
||||||
// Return to the 'front-end' for this function
|
|
||||||
popl %fs:0x0
|
|
||||||
movl %ebp, %esp
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
#define REP_ERECORD 0x04
|
|
||||||
#define REP_RFRAME 0x08
|
|
||||||
#define REP_CONTEXT 0x0C
|
|
||||||
#define REP_DCONTEXT 0x10
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// This exception handler protects the exception handling
|
|
||||||
// mechanism by detecting nested exceptions.
|
|
||||||
_RtlpExceptionProtector:
|
|
||||||
movl $ExceptionContinueSearch, %eax
|
|
||||||
movl REP_ERECORD(%esp), %ecx
|
|
||||||
testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
|
|
||||||
jnz .rep_end
|
|
||||||
|
|
||||||
// Unwinding is not taking place, so return ExceptionNestedException
|
|
||||||
|
|
||||||
// Set DispatcherContext field to the exception registration for the
|
|
||||||
// exception handler that executed when a nested exception occurred
|
|
||||||
movl REP_DCONTEXT(%esp), %ecx
|
|
||||||
movl REP_RFRAME(%esp), %eax
|
|
||||||
movl %eax, (%ecx)
|
|
||||||
movl $ExceptionNestedException, %eax
|
|
||||||
|
|
||||||
.rep_end:
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// Front-end
|
|
||||||
_RtlpExecuteHandlerForException:
|
|
||||||
movl $_RtlpExceptionProtector, %edx
|
|
||||||
jmp _RtlpExecuteHandler
|
|
||||||
|
|
||||||
|
|
||||||
#define RUP_ERECORD 0x04
|
|
||||||
#define RUP_RFRAME 0x08
|
|
||||||
#define RUP_CONTEXT 0x0C
|
|
||||||
#define RUP_DCONTEXT 0x10
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
// Notes:
|
|
||||||
// This exception handler protects the exception handling
|
|
||||||
// mechanism by detecting collided unwinds.
|
|
||||||
_RtlpUnwindProtector:
|
|
||||||
movl $ExceptionContinueSearch, %eax
|
|
||||||
movl %ecx, RUP_ERECORD(%esp)
|
|
||||||
testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
|
|
||||||
jz .rup_end
|
|
||||||
|
|
||||||
// Unwinding is taking place, so return ExceptionCollidedUnwind
|
|
||||||
|
|
||||||
movl RUP_RFRAME(%esp), %ecx
|
|
||||||
movl RUP_DCONTEXT(%esp), %edx
|
|
||||||
|
|
||||||
// Set DispatcherContext field to the exception registration for the
|
|
||||||
// exception handler that executed when a collision occurred
|
|
||||||
movl RUP_RFRAME(%ecx), %eax
|
|
||||||
movl %eax, (%edx)
|
|
||||||
movl $ExceptionCollidedUnwind, %eax
|
|
||||||
|
|
||||||
.rup_end:
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
// Parameters:
|
|
||||||
// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
|
|
||||||
// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
|
|
||||||
// [ESP+0Ch] - PCONTEXT Context
|
|
||||||
// [ESP+10h] - PVOID DispatcherContext
|
|
||||||
// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
|
|
||||||
// Registers:
|
|
||||||
// None
|
|
||||||
// Returns:
|
|
||||||
// EXCEPTION_DISPOSITION
|
|
||||||
_RtlpExecuteHandlerForUnwind:
|
|
||||||
movl $_RtlpUnwindProtector, %edx
|
|
||||||
jmp _RtlpExecuteHandler
|
|
Loading…
Reference in a new issue