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... ============================================================================== --- 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,