Author: tfaber
Date: Sat Nov 5 18:33:50 2016
New Revision: 73145
URL:
http://svn.reactos.org/svn/reactos?rev=73145&view=rev
Log:
[PSEH]
- Make _except_handler3 human-readable
CORE-12283
Modified:
trunk/reactos/sdk/lib/pseh/i386/seh.s
Modified: trunk/reactos/sdk/lib/pseh/i386/seh.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/sdk/lib/pseh/i386/seh.s?re…
==============================================================================
--- trunk/reactos/sdk/lib/pseh/i386/seh.s [iso-8859-1] (original)
+++ trunk/reactos/sdk/lib/pseh/i386/seh.s [iso-8859-1] Sat Nov 5 18:33:50 2016
@@ -9,6 +9,7 @@
/* INCLUDES ******************************************************************/
#include <asm.inc>
+#include <ks386.inc>
#define DISPOSITION_DISMISS 0
#define DISPOSITION_CONTINUE_SEARCH 1
@@ -16,6 +17,16 @@
#define EXCEPTION_EXIT_UNWIND 4
#define EXCEPTION_UNWINDING 2
+
+/* See seh_prolog.s */
+SEH_FRAME_NewEsp = 0 /* 0x00 */
+SEH_FRAME_unused = 4 /* 0x04 */
+SEH_FRAME_PreviousRecord = 8 /* 0x08 */
+SEH_FRAME_Handler = 12 /* 0x0c */
+SEH_FRAME_SEHTable = 16 /* 0x10 */
+SEH_FRAME_Disable = 20 /* 0x14 */
+SEH_FRAME_OriginalEbp = 24 /* 0x18 */
+SEH_FRAME_Size = 28 /* 0x1c */
EXTERN _RtlUnwind@16:PROC
@@ -301,7 +312,9 @@
__except_handler3:
-
+PARAM_ExceptionRecord = 8
+PARAM_RegistrationFrame = 12
+PARAM_Context = 16
/* Setup stack and save volatiles */
push ebp
mov ebp, esp
@@ -315,23 +328,23 @@
cld
/* Get exception registration and record */
- mov ebx, [ebp+12]
- mov eax, [ebp+8]
+ mov ebx, [ebp+PARAM_RegistrationFrame]
+ mov eax, [ebp+PARAM_ExceptionRecord]
/* Check if this is an unwind */
- test dword ptr [eax+4], EXCEPTION_EXIT_UNWIND + EXCEPTION_UNWINDING
+ test dword ptr [eax+EXCEPTION_RECORD_EXCEPTION_FLAGS], EXCEPTION_EXIT_UNWIND +
EXCEPTION_UNWINDING
jnz except_unwind3
/* Save exception pointers structure */
- mov [ebp-8], eax
- mov eax, [ebp+16]
- mov [ebp-4], eax
+ mov [ebp-8+EXCEPTION_POINTERS_EXCEPTION_RECORD], eax
+ mov eax, [ebp+PARAM_Context]
+ mov [ebp-8+EXCEPTION_POINTERS_CONTEXT_RECORD], eax
lea eax, [ebp-8]
- mov [ebx-4], eax
+ mov [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_unused], eax
/* Get the try level and scope table */
- mov esi, [ebx+12]
- mov edi, [ebx+8]
+ mov esi, [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_Disable]
+ mov edi, [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_SEHTable]
/* FIXME: Validate the SEH exception */
@@ -343,13 +356,13 @@
/* Check if this is the termination handler */
lea ecx, [esi+esi*2]
mov eax, [edi+ecx*4+4]
- or eax, eax
+ test eax, eax
jz except_continue3
/* Save registers clear them all */
push esi
push ebp
- lea ebp, [ebx+16]
+ lea ebp, [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_OriginalEbp]
xor ebx, ebx
xor ecx, ecx
xor edx, edx
@@ -362,19 +375,19 @@
pop esi
/* Restore ebx and check the result */
- mov ebx, [ebp+12]
- or eax, eax
+ mov ebx, [ebp+PARAM_RegistrationFrame]
+ test eax, eax
jz except_continue3
js except_dismiss3
/* So this is an accept, call the termination handlers */
- mov edi, [ebx+8]
+ mov edi, [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_SEHTable]
push ebx
call __global_unwind2
add esp, 4
/* Restore ebp */
- lea ebp, [ebx+16]
+ lea ebp, [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_OriginalEbp]
/* Do local unwind */
push esi
@@ -387,7 +400,7 @@
/* Set new try level */
lea ecx, [esi+esi*2]
mov eax, [edi+ecx*4]
- mov [ebx+12], eax
+ mov [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_Disable], eax
/* Clear registers and call except handler */
mov eax, [edi+ecx*4+8]
@@ -400,7 +413,7 @@
except_continue3:
/* Reload try level and except again */
- mov edi, [ebx+8]
+ mov edi, [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_SEHTable]
lea ecx, [esi+esi*2]
mov esi, [edi+ecx*4]
jmp except_loop3
@@ -410,23 +423,21 @@
mov eax, DISPOSITION_DISMISS
jmp except_return3
+ /* Do local unwind */
+except_unwind3:
+ push ebp
+ mov ebp, [ebx-SEH_FRAME_PreviousRecord+SEH_FRAME_OriginalEbp]
+ push -1
+ push ebx
+ call __local_unwind2
+ add esp, 8
+
+ /* Restore EBP */
+ pop ebp
+
except_search3:
/* Continue searching */
mov eax, DISPOSITION_CONTINUE_SEARCH
- jmp except_return3
-
- /* Do local unwind */
-except_unwind3:
- push ebp
- mov ebp, [ebx+16]
- push -1
- push ebx
- call __local_unwind2
- add esp, 8
-
- /* Retore EBP and set return disposition */
- pop ebp
- mov eax, DISPOSITION_CONTINUE_SEARCH
except_return3:
/* Restore registers and stack */