Sebastian Lackner : ntdll: Only check for ATL thunk if allowed by execute option flags.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 13 11:18:10 CDT 2014


Module: wine
Branch: master
Commit: 1c957ceb96efd6dbea58460af1561effa6c7c8ed
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1c957ceb96efd6dbea58460af1561effa6c7c8ed

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Sat Oct 11 00:08:41 2014 +0200

ntdll: Only check for ATL thunk if allowed by execute option flags.

Checking for ATL thunks can be disabled by setting MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION.

---

 dlls/kernel32/tests/virtual.c | 4 ----
 dlls/ntdll/signal_i386.c      | 7 ++++---
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 4627c5a..434d880 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -1997,7 +1997,6 @@ static void test_atl_thunk_emulation( ULONG dep_flags )
     ok( ret == 43, "call returned wrong result, expected 43, got %d\n", ret );
     ok( num_guard_page_calls == 0, "expected no STATUS_GUARD_PAGE_VIOLATION exception, got %d exceptions\n", num_guard_page_calls );
     if ((dep_flags & MEM_EXECUTE_OPTION_DISABLE) && (dep_flags & MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION))
-        todo_wine
         ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
     else
         ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
@@ -2013,7 +2012,6 @@ static void test_atl_thunk_emulation( ULONG dep_flags )
     ok( ret == 43, "call returned wrong result, expected 43, got %d\n", ret );
     ok( num_guard_page_calls == 1, "expected one STATUS_GUARD_PAGE_VIOLATION exception, got %d exceptions\n", num_guard_page_calls );
     if ((dep_flags & MEM_EXECUTE_OPTION_DISABLE) && (dep_flags & MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION))
-        todo_wine
         ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
     else
         ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
@@ -2164,7 +2162,6 @@ static void test_atl_thunk_emulation( ULONG dep_flags )
     ok( ret == 43, "call returned wrong result, expected 43, got %d\n", ret );
     ok( num_guard_page_calls == 0, "expected no STATUS_GUARD_PAGE_VIOLATION exception, got %d exceptions\n", num_guard_page_calls );
     if ((dep_flags & MEM_EXECUTE_OPTION_DISABLE) && (dep_flags & MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION))
-        todo_wine
         ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
     else
         ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
@@ -2193,7 +2190,6 @@ static void test_atl_thunk_emulation( ULONG dep_flags )
     ok( ret == 43, "call returned wrong result, expected 43, got %d\n", ret );
     ok( num_guard_page_calls == 1, "expected one STATUS_GUARD_PAGE_VIOLATION exception, got %d exceptions\n", num_guard_page_calls );
     if ((dep_flags & MEM_EXECUTE_OPTION_DISABLE) && (dep_flags & MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION))
-        todo_wine
         ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
     else
         ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index b9b45a8..7f01554 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -1830,12 +1830,13 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context
                 rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT)
             {
                 ULONG flags;
-                if (check_atl_thunk( rec, context ))
+                NtQueryInformationProcess( GetCurrentProcess(), ProcessExecuteFlags,
+                                           &flags, sizeof(flags), NULL );
+
+                if (!(flags & MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION) && check_atl_thunk( rec, context ))
                     goto done;
 
                 /* send EXCEPTION_EXECUTE_FAULT only if data execution prevention is enabled */
-                NtQueryInformationProcess( GetCurrentProcess(), ProcessExecuteFlags,
-                                           &flags, sizeof(flags), NULL );
                 if (!(flags & MEM_EXECUTE_OPTION_DISABLE))
                     rec->ExceptionInformation[0] = EXCEPTION_READ_FAULT;
             }




More information about the wine-cvs mailing list