Under Wow64, disabling no-exec (done at the bottom of `alloc_module`) was failing.
Fixes crashes in games using older Steam DRM (where the EXE entry point is in a '.bind' section which is not marked executable)
-- v2: wow64: Allow setting NtSetInformationProcess(ProcessExecuteFlags). ntdll: Allow changes to DEP flags under Wow64.
From: Brendan Shanks bshanks@codeweavers.com
--- dlls/ntdll/unix/process.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index 078ad75099d..83888717a5c 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -73,9 +73,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(process);
-static ULONG execute_flags = MEM_EXECUTE_OPTION_DISABLE | (sizeof(void *) > sizeof(int) ? - MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION | - MEM_EXECUTE_OPTION_PERMANENT : 0); +static ULONG execute_flags = MEM_EXECUTE_OPTION_DISABLE;
static UINT process_error_mode;
@@ -1434,8 +1432,14 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class
case ProcessExecuteFlags: len = sizeof(ULONG); - if (size == len) *(ULONG *)info = execute_flags; - else ret = STATUS_INFO_LENGTH_MISMATCH; + if (size != len) + ret = STATUS_INFO_LENGTH_MISMATCH; + else if (is_win64 && !NtCurrentTeb()->WowTebOffset) + *(ULONG *)info = MEM_EXECUTE_OPTION_DISABLE | + MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION | + MEM_EXECUTE_OPTION_PERMANENT; + else + *(ULONG *)info = execute_flags; break;
case ProcessPriorityClass: @@ -1560,7 +1564,7 @@ NTSTATUS WINAPI NtSetInformationProcess( HANDLE handle, PROCESSINFOCLASS class, break;
case ProcessExecuteFlags: - if (is_win64 || size != sizeof(ULONG)) return STATUS_INVALID_PARAMETER; + if ((is_win64 && !NtCurrentTeb()->WowTebOffset) || size != sizeof(ULONG)) return STATUS_INVALID_PARAMETER; if (execute_flags & MEM_EXECUTE_OPTION_PERMANENT) return STATUS_ACCESS_DENIED; else {
From: Brendan Shanks bshanks@codeweavers.com
--- dlls/wow64/process.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index 0c6726b9c6e..d4e22b51c7f 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -1075,6 +1075,7 @@ NTSTATUS WINAPI wow64_NtSetInformationProcess( UINT *args ) { case ProcessDefaultHardErrorMode: /* ULONG */ case ProcessPriorityClass: /* PROCESS_PRIORITY_CLASS */ + case ProcessExecuteFlags: /* ULONG */ return NtSetInformationProcess( handle, class, ptr, len );
case ProcessAffinityMask: /* ULONG_PTR */ @@ -1085,9 +1086,6 @@ NTSTATUS WINAPI wow64_NtSetInformationProcess( UINT *args ) } else return STATUS_INVALID_PARAMETER;
- case ProcessExecuteFlags: /* ULONG */ - return STATUS_ACCESS_DENIED; - case ProcessInstrumentationCallback: /* PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION */ if (len == sizeof(PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION32)) {