From 4efff322911b224e727dc6df932c357d0e6a279a Mon Sep 17 00:00:00 2001 From: Rob Shearman Date: Tue, 15 Apr 2008 21:50:14 +0100 Subject: [PATCH] rpcrt4: Test and fix I_RpcExceptionFilter. --- dlls/rpcrt4/rpcrt4_main.c | 10 ++++++++-- dlls/rpcrt4/tests/rpc.c | 41 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/dlls/rpcrt4/rpcrt4_main.c b/dlls/rpcrt4/rpcrt4_main.c index 02e1dcd5600..0fddc287c2b 100644 --- a/dlls/rpcrt4/rpcrt4_main.c +++ b/dlls/rpcrt4/rpcrt4_main.c @@ -944,8 +944,14 @@ int WINAPI I_RpcExceptionFilter(ULONG ExceptionCode) TRACE("0x%x\n", ExceptionCode); switch (ExceptionCode) { - case EXCEPTION_ACCESS_VIOLATION: - case EXCEPTION_ILLEGAL_INSTRUCTION: + case STATUS_DATATYPE_MISALIGNMENT: + case STATUS_BREAKPOINT: + case STATUS_ACCESS_VIOLATION: + case STATUS_ILLEGAL_INSTRUCTION: + case STATUS_PRIVILEGED_INSTRUCTION: + case STATUS_INSTRUCTION_MISALIGNMENT: + case STATUS_STACK_OVERFLOW: + case STATUS_POSSIBLE_DEADLOCK: return EXCEPTION_CONTINUE_SEARCH; default: return EXCEPTION_EXECUTE_HANDLER; diff --git a/dlls/rpcrt4/tests/rpc.c b/dlls/rpcrt4/tests/rpc.c index ace8aff4050..9fd99938da7 100644 --- a/dlls/rpcrt4/tests/rpc.c +++ b/dlls/rpcrt4/tests/rpc.c @@ -610,6 +610,46 @@ static void test_RpcStringBindingParseA(void) ok(options == NULL, "options was %p instead of NULL\n", options); } +static void test_I_RpcExceptionFilter(void) +{ + ULONG exception; + int retval; + int (WINAPI *pI_RpcExceptionFilter)(ULONG) = (void *)GetProcAddress(GetModuleHandle("rpcrt4.dll"), "I_RpcExceptionFilter"); + + if (!pI_RpcExceptionFilter) + { + skip("I_RpcExceptionFilter not exported\n"); + return; + } + + for (exception = 0; exception < STATUS_REG_NAT_CONSUMPTION; exception++) + { + /* skip over uninteresting bits of the number space */ + if (exception == 2000) exception = 0x40000000; + if (exception == 0x40000005) exception = 0x80000000; + if (exception == 0x80000005) exception = 0xc0000000; + + retval = pI_RpcExceptionFilter(exception); + switch (exception) + { + case STATUS_DATATYPE_MISALIGNMENT: + case STATUS_BREAKPOINT: + case STATUS_ACCESS_VIOLATION: + case STATUS_ILLEGAL_INSTRUCTION: + case STATUS_PRIVILEGED_INSTRUCTION: + case 0xc00000aa /* STATUS_INSTRUCTION_MISALIGNMENT */: + case STATUS_STACK_OVERFLOW: + case 0xc0000194 /* STATUS_POSSIBLE_DEADLOCK */: + ok(retval == EXCEPTION_CONTINUE_SEARCH, "I_RpcExceptionFilter(0x%x) should have returned %d instead of %d\n", + exception, EXCEPTION_CONTINUE_SEARCH, retval); + break; + default: + ok(retval == EXCEPTION_EXECUTE_HANDLER, "I_RpcExceptionFilter(0x%x) should have returned %d instead of %d\n", + exception, EXCEPTION_EXECUTE_HANDLER, retval); + } + } +} + START_TEST( rpc ) { trace ( " ** Uuid Conversion and Comparison Tests **\n" ); @@ -620,4 +660,5 @@ START_TEST( rpc ) test_towers(); test_I_RpcMapWin32Status(); test_RpcStringBindingParseA(); + test_I_RpcExceptionFilter(); }