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.
This commit is contained in:
parent
e16996bb3d
commit
1c957ceb96
|
@ -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( 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 );
|
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))
|
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 );
|
ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
||||||
else
|
else
|
||||||
ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
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( 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 );
|
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))
|
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 );
|
ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
||||||
else
|
else
|
||||||
ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
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( 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 );
|
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))
|
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 );
|
ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
||||||
else
|
else
|
||||||
ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
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( 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 );
|
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))
|
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 );
|
ok( num_execute_fault_calls == 1, "expected one STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
||||||
else
|
else
|
||||||
ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
ok( num_execute_fault_calls == 0, "expected no STATUS_ACCESS_VIOLATION exception, got %d exceptions\n", num_execute_fault_calls );
|
||||||
|
|
|
@ -1830,12 +1830,13 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context
|
||||||
rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT)
|
rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT)
|
||||||
{
|
{
|
||||||
ULONG flags;
|
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;
|
goto done;
|
||||||
|
|
||||||
/* send EXCEPTION_EXECUTE_FAULT only if data execution prevention is enabled */
|
/* send EXCEPTION_EXECUTE_FAULT only if data execution prevention is enabled */
|
||||||
NtQueryInformationProcess( GetCurrentProcess(), ProcessExecuteFlags,
|
|
||||||
&flags, sizeof(flags), NULL );
|
|
||||||
if (!(flags & MEM_EXECUTE_OPTION_DISABLE))
|
if (!(flags & MEM_EXECUTE_OPTION_DISABLE))
|
||||||
rec->ExceptionInformation[0] = EXCEPTION_READ_FAULT;
|
rec->ExceptionInformation[0] = EXCEPTION_READ_FAULT;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue