Author: tfaber
Date: Sun Nov 6 09:31:09 2016
New Revision: 73148
URL:
http://svn.reactos.org/svn/reactos?rev=73148&view=rev
Log:
[KMTESTS:RTL]
- Add a test checking stack frame correctness in a nested __finally handler
CORE-12283
Modified:
trunk/rostests/kmtests/rtl/RtlException.c
Modified: trunk/rostests/kmtests/rtl/RtlException.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/rtl/RtlException.…
==============================================================================
--- trunk/rostests/kmtests/rtl/RtlException.c [iso-8859-1] (original)
+++ trunk/rostests/kmtests/rtl/RtlException.c [iso-8859-1] Sun Nov 6 09:31:09 2016
@@ -7,6 +7,104 @@
#define KMT_EMULATE_KERNEL
#include <kmt_test.h>
+
+static
+VOID
+PossiblyRaise(
+ _In_ BOOLEAN Raise)
+{
+ if (Raise)
+ {
+ ExRaiseStatus(STATUS_ASSERTION_FAILURE);
+ }
+}
+
+static
+VOID
+InnerFunction(
+ _Inout_ PULONG State,
+ _In_ BOOLEAN Raise)
+{
+ _SEH2_VOLATILE INT Var = 123;
+ static _SEH2_VOLATILE INT *AddressOfVar;
+
+ AddressOfVar = &Var;
+ ok_eq_ulong(*State, 1);
+ _SEH2_TRY
+ {
+ *State = 2;
+ PossiblyRaise(Raise);
+ ok_eq_ulong(*State, 2);
+ *State = 3;
+ }
+ _SEH2_FINALLY
+ {
+ ok_eq_int(Var, 123);
+ ok_eq_pointer(&Var, AddressOfVar);
+ if (Raise)
+ ok_eq_ulong(*State, 2);
+ else
+ ok_eq_ulong(*State, 3);
+ *State = 4;
+ }
+ _SEH2_END;
+
+ ok_eq_int(Var, 123);
+ ok_eq_pointer(&Var, AddressOfVar);
+ ok_eq_ulong(*State, 4);
+ *State = 5;
+}
+
+static
+VOID
+OuterFunction(
+ _Inout_ PULONG State,
+ _In_ BOOLEAN Raise)
+{
+ _SEH2_VOLATILE INT Var = 456;
+ static _SEH2_VOLATILE INT *AddressOfVar;
+
+ AddressOfVar = &Var;
+ ok_eq_ulong(*State, 0);
+ _SEH2_TRY
+ {
+ *State = 1;
+ InnerFunction(State, Raise);
+ ok_eq_ulong(*State, 5);
+ *State = 6;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ ok_eq_int(Var, 456);
+ ok_eq_pointer(&Var, AddressOfVar);
+ ok_eq_ulong(*State, 4);
+ *State = 7;
+ }
+ _SEH2_END;
+
+ ok_eq_int(Var, 456);
+ ok_eq_pointer(&Var, AddressOfVar);
+ if (Raise)
+ ok_eq_ulong(*State, 7);
+ else
+ ok_eq_ulong(*State, 6);
+ *State = 8;
+}
+
+static
+VOID
+TestNestedExceptionHandler(VOID)
+{
+ ULONG State;
+
+ State = 0;
+ OuterFunction(&State, FALSE);
+ ok_eq_ulong(State, 8);
+
+ State = 0;
+ OuterFunction(&State, TRUE);
+ ok_eq_ulong(State, 8);
+}
START_TEST(RtlException)
{
@@ -56,6 +154,8 @@
ExRaiseStatus(STATUS_GUARD_PAGE_VIOLATION);
KmtEndSeh(STATUS_GUARD_PAGE_VIOLATION);
+ TestNestedExceptionHandler();
+
/* We cannot test this in kernel mode easily - the stack is just
"somewhere"
* in system space, and there's no guard page below it */
#if CORE_6640_IS_FIXED