+
+.global __SEH3$_InvokeEmbeddedFilterFromRegistration
+__SEH3$_InvokeEmbeddedFilterFromRegistration:
+
+ /* Safe the current non-volatiles */
+ push ebp
+ push ebx
+ push esi
+ push edi
+
+ /* Load the non-volatiles from the registration invocation */
+ mov ebx, [eax + SEH3_REGISTRATION_FRAME_Ebx]
+ mov esi, [eax + SEH3_REGISTRATION_FRAME_Esi]
+ mov edi, [eax + SEH3_REGISTRATION_FRAME_Edi]
+ mov ebp, [eax + SEH3_REGISTRATION_FRAME_Ebp]
+
+ /* Get the saved stack pointer */
+ mov edx, [eax + SEH3_REGISTRATION_FRAME_Esp]
+
+ xor eax, eax
+ inc eax
+ call [edx]
+
+ /* Restore the current non-volatiles */
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+
+ ret
+
+
+.global __SEH3$_InvokeEmbeddedFilter
+__SEH3$_InvokeEmbeddedFilter:
+
+ /* Safe the current non-volatiles */
+ push ebp
+ push ebx
+ push esi
+ push edi
+
+ /* Load ebp from the registration invocation */
+ mov ebp, [eax + SEH3_REGISTRATION_FRAME_Ebp]
+
+ /* Calculate the size of the temp stack frame region */
+ mov ecx, [eax + SEH3_REGISTRATION_FRAME_AllocaFrame]
+ sub ecx, [eax + SEH3_REGISTRATION_FRAME_Esp]
+
+ /* Put the return address on the stack */
+ push offset __SEH3$_InvokeEmbeddedFilterReturn
+
+ /* Save the current stack pointer in the AllocaFrame member */
+ mov [eax + SEH3_REGISTRATION_FRAME_AllocaFrame], esp
+
+ /* Allocate enough temp stack space on the stack */
+ sub esp, ecx
+
+ /* Get the scope table */
+ mov edx, [eax + SEH3_REGISTRATION_FRAME_ScopeTable]
+
+ /* Jump into the filter or finally function */
+ jmp [edx + SEH3_SCOPE_TABLE_Filter]
+
+ /* We return to this label with a cleaned up stack */
+__SEH3$_InvokeEmbeddedFilterReturn:
+
+ /* Restore the current non-volatiles */
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+
+ ret
+
+/*
+ * void
+ * __fastcall
+ * _SEH3$_CallRtlUnwind(
+ * PSEH3$_REGISTRATION_FRAME RegistrationFrame<ecx>)
+ */
+.global @_SEH3$_CallRtlUnwind@4
+@_SEH3$_CallRtlUnwind@4:
+
+ push ebp
+ mov ebp, esp
+
+ push edi
+ push esi
+ push ebx
+
+ push 0 /* ReturnValue */
+ push 0 /* ExceptionRecord */
+ push 0 /* TargetIp */
+ push ecx /* TargetFrame */
+ call _RtlUnwind@16
+
+ pop ebx
+ pop esi
+ pop edi
+ pop ebp
+ ret
+