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/except/except.c?rev=50583&r1=50582&r2=50583&view=diff
==============================================================================
--- 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,


Reply via email to