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 {