[PATCH 2/2] ntdll/tests: Test DEP exceptions on x86-64.

Zebediah Figura z.figura12 at gmail.com
Mon Mar 26 18:57:33 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
Note that MSDN states:

"System DEP configuration settings apply only for 32-bit applications
and processes when running on 32-bit or 64-bit versions of Windows. On
64-bit versions of Windows, if hardware-enforced DEP is available it
is always applied to 64-bit processes and kernel memory spaces and
there are no system configuration settings to disable it."

 dlls/ntdll/tests/exception/.c | 54 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 46e2a30..b3592e6 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -2426,6 +2426,59 @@ static void test_prot_fault(void)
     }
 }
 
+static LONG CALLBACK dpe_handler(EXCEPTION_POINTERS *info)
+{
+    EXCEPTION_RECORD *rec = info->ExceptionRecord;
+    DWORD old_prot;
+
+    trace("vect. handler %08x addr:%p\n", rec->ExceptionCode, rec->ExceptionAddress);
+
+    got_exception++;
+
+    ok(rec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION,
+        "got %#x\n", rec->ExceptionCode);
+    ok(rec->NumberParameters == 2, "got %u params\n", rec->NumberParameters);
+    ok(rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT,
+        "got %#lx\n", rec->ExceptionInformation[0]);
+    ok((void *)rec->ExceptionInformation[1] == code_mem,
+        "got %p\n", (void *)rec->ExceptionInformation[1]);
+
+    VirtualProtect(code_mem, 1, PAGE_EXECUTE_READWRITE, &old_prot);
+
+    return EXCEPTION_CONTINUE_EXECUTION;
+}
+
+static void test_dpe_exceptions(void)
+{
+    static const BYTE ret[] = {0xc3};
+    DWORD (CDECL *func)(void) = code_mem;
+    DWORD old_prot;
+    void *handler;
+
+    memcpy(code_mem, ret, sizeof(ret));
+
+    handler = pRtlAddVectoredExceptionHandler(TRUE, &dpe_handler);
+    ok(!!handler, "RtlAddVectoredExceptionHandler failed\n");
+
+    VirtualProtect(code_mem, 1, PAGE_NOACCESS, &old_prot);
+
+    got_exception = 0;
+    func();
+    ok(got_exception == 1, "got %u exceptions\n", got_exception);
+
+    VirtualProtect(code_mem, 1, old_prot, &old_prot);
+
+    VirtualProtect(code_mem, 1, PAGE_READWRITE, &old_prot);
+
+    got_exception = 0;
+    func();
+    ok(got_exception == 1, "got %u exceptions\n", got_exception);
+
+    VirtualProtect(code_mem, 1, old_prot, &old_prot);
+
+    pRtlRemoveVectoredExceptionHandler(handler);
+}
+
 #endif  /* __x86_64__ */
 
 #if defined(__i386__) || defined(__x86_64__)
@@ -3021,6 +3074,7 @@ START_TEST(exception)
     test___C_specific_handler();
     test_restore_context();
     test_prot_fault();
+    test_dpe_exceptions();
 
     if (pRtlAddFunctionTable && pRtlDeleteFunctionTable && pRtlInstallFunctionTableCallback && pRtlLookupFunctionEntry)
       test_dynamic_unwind();
-- 
2.7.4




More information about the wine-devel mailing list