Zebediah Figura : ntdll/tests: Test DEP exceptions on x86-64.

Alexandre Julliard julliard at winehq.org
Tue Mar 27 16:08:49 CDT 2018


Module: wine
Branch: master
Commit: f63474b6d582113db838f73d406b4a90e2526088
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f63474b6d582113db838f73d406b4a90e2526088

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Mar 26 18:57:33 2018 -0500

ntdll/tests: Test DEP exceptions on x86-64.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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();




More information about the wine-cvs mailing list