.text
-
.extern __SEH3$_except_handler
/*
* void
- * _SEH3$_RegisterFrame(
- * PSEH_REGISTRATION_FRAME RegistrationRecord<ecx>,
- * PSEH_DATA_TABLE DataTable<eax>);
+ * __attribute__((regparm(2)))
+ * __attribute__((returns_twice))
+ * _SEH3$_RegisterFrame[WithNonVolatiles](
+ * PSEH_DATA_TABLE DataTable<eax>,
+ * PSEH_REGISTRATION_FRAME RegistrationRecord<edx>);
*/
+.global __SEH3$_RegisterFrameWithNonVolatiles
+__SEH3$_RegisterFrameWithNonVolatiles:
+
+ /* Save non-volatiles in the registration frame */
+ mov [edx + SEH3_REGISTRATION_FRAME_Ebx], ebx
+ mov [edx + SEH3_REGISTRATION_FRAME_Esi], esi
+ mov [edx + SEH3_REGISTRATION_FRAME_Edi], edi
+
.global __SEH3$_RegisterFrame
__SEH3$_RegisterFrame:
/* Save the address of the static data table */
- mov [ecx + SEH3_REGISTRATION_FRAME_ScopeTable], eax
+ mov [edx + SEH3_REGISTRATION_FRAME_ScopeTable], eax
/* Set the handler address */
- mov dword ptr [ecx + SEH3_REGISTRATION_FRAME_Handler], offset __SEH3$_except_handler
+ mov dword ptr [edx + SEH3_REGISTRATION_FRAME_Handler], offset __SEH3$_except_handler
/* Set this as the end of the internal chain */
- mov dword ptr [ecx + SEH3_REGISTRATION_FRAME_EndOfChain], ecx
+ mov dword ptr [edx + SEH3_REGISTRATION_FRAME_EndOfChain], edx
/* Register the frame in the TEB */
mov eax, dword ptr fs:[0]
- mov [ecx + SEH3_REGISTRATION_FRAME_Next], eax
- mov dword ptr fs:[0], ecx
+ mov [edx + SEH3_REGISTRATION_FRAME_Next], eax
+ mov dword ptr fs:[0], edx
- /* Save the registers */
- mov [ecx + SEH3_REGISTRATION_FRAME_Esp], esp
- mov [ecx + SEH3_REGISTRATION_FRAME_Ebp], ebp
+ /* Save the stack registers */
+ mov [edx + SEH3_REGISTRATION_FRAME_Esp], esp
+ mov [edx + SEH3_REGISTRATION_FRAME_Ebp], ebp
+ /* Set eax to 0 to indicate 1st return */
+ xor eax, eax
ret
+/*
+ * void
+ * __attribute__((regparm(2)))
+ * __attribute__((returns_twice))
+ * _SEH3$_RegisterTryLevel[WithNonVolatiles](
+ * PSEH_DATA_TABLE DataTable<eax>,
+ * PSEH_REGISTRATION_FRAME RegistrationRecord<edx>);
+ */
+.global __SEH3$_RegisterTryLevelWithNonVolatiles
+__SEH3$_RegisterTryLevelWithNonVolatiles:
+
+ /* Save non-volatiles in the registration frame */
+ mov [edx + SEH3_REGISTRATION_FRAME_Ebx], ebx
+ mov [edx + SEH3_REGISTRATION_FRAME_Esi], esi
+ mov [edx + SEH3_REGISTRATION_FRAME_Edi], edi
+
.global __SEH3$_RegisterTryLevel
__SEH3$_RegisterTryLevel:
/* Save the address of the static data table */
- mov [ecx + SEH3_REGISTRATION_FRAME_ScopeTable], eax
+ mov [edx + SEH3_REGISTRATION_FRAME_ScopeTable], eax
/* Set the handler address to NULL as identification */
- and dword ptr [ecx + SEH3_REGISTRATION_FRAME_Handler], 0
+ and dword ptr [edx + SEH3_REGISTRATION_FRAME_Handler], 0
/* Get the current registered frame */
mov eax, dword ptr fs:[0]
/* Get the current end of the chain and set this as Next */
- mov edx, [eax + SEH3_REGISTRATION_FRAME_EndOfChain]
- mov [ecx + SEH3_REGISTRATION_FRAME_Next], edx
+ mov ecx, [eax + SEH3_REGISTRATION_FRAME_EndOfChain]
+ mov [edx + SEH3_REGISTRATION_FRAME_Next], ecx
/* Set this as the end of the internal chain */
- mov dword ptr [eax + SEH3_REGISTRATION_FRAME_EndOfChain], ecx
+ mov dword ptr [eax + SEH3_REGISTRATION_FRAME_EndOfChain], edx
- /* Save the registers */
- mov [ecx + SEH3_REGISTRATION_FRAME_Esp], esp
- mov [ecx + SEH3_REGISTRATION_FRAME_Ebp], ebp
+ /* Save the stack registers */
+ mov [edx + SEH3_REGISTRATION_FRAME_Esp], esp
+ mov [edx + SEH3_REGISTRATION_FRAME_Ebp], ebp
+ /* Set eax to 0 to indicate 1st return */
+ xor eax, eax
ret
-