Author: tkreuzer
Date: Mon Jan 31 22:10:17 2011
New Revision: 50583
URL: 
http://svn.reactos.org/svn/reactos?rev=50583&view=rev
Log:
[CRT]
Implement call_finally_block, call_filter and call_unwind_func for MSVC
Modified:
    branches/cmake-bringup/lib/sdk/crt/except/except.c
Modified: branches/cmake-bringup/lib/sdk/crt/except/except.c
URL:
http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/sdk/crt/excep…
==============================================================================
--- branches/cmake-bringup/lib/sdk/crt/except/except.c [iso-8859-1] (original)
+++ branches/cmake-bringup/lib/sdk/crt/except/except.c [iso-8859-1] Mon Jan 31 22:10:17
2011
@@ -96,6 +96,57 @@
                           : "ecx", "edx", "memory" );
     return ret;
 }
+#elif defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4731) // Don't complain about changing ebp
+void __inline call_finally_block( void *code_block, void *base_ptr )
+{
+    __asm
+    {
+        mov eax, code_block
+        mov ebp, base_ptr
+        call [eax]
+    }
+}
+
+int __inline call_filter( int (*func)(PEXCEPTION_POINTERS), void *arg, void *_ebp )
+{
+    int _ret;
+    __asm
+    {
+        push ebp
+        mov eax, arg
+        push eax
+        mov ebp, _ebp
+        mov eax, func
+        call [eax]
+        mov _ret, eax
+        pop ebp
+        pop ebp
+    }
+    return _ret;
+}
+int __inline call_unwind_func( int (*func)(void), void *_ebp )
+{
+    int _ret;
+
+    __asm
+    {
+        push ebp
+        push ebx
+        push esi
+        push edi
+        mov ebp, _ebp
+        call dword ptr [func]
+        mov _ret, eax
+        pop edi
+        pop esi
+        pop ebx
+        pop ebp
+    }
+    return _ret;
+}
+#pragma warning(pop)
 #endif
 static DWORD MSVCRT_nested_handler(PEXCEPTION_RECORD rec,