From: Ryan Houdek <Sonicadvance1@gmail.com> Fixes games that toggle DEP at runtime. Like Bioshock. --- dlls/wow64/process.c | 7 ++++++- dlls/wow64/syscall.c | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index 625b0eaff75..8ec13f86822 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -33,6 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wow); +void WINAPI Wow64CpuNotifyProcessExecuteFlagsChange(ULONG); static BOOL is_process_wow64( HANDLE handle ) { @@ -927,13 +928,17 @@ NTSTATUS WINAPI wow64_NtSetInformationProcess( UINT *args ) case ProcessPriorityClass: /* PROCESS_PRIORITY_CLASS */ case ProcessBasePriority: /* ULONG */ case ProcessPriorityBoost: /* ULONG */ - case ProcessExecuteFlags: /* ULONG */ case ProcessPagePriority: /* MEMORY_PRIORITY_INFORMATION */ case ProcessPowerThrottlingState: /* PROCESS_POWER_THROTTLING_STATE */ case ProcessLeapSecondInformation: /* PROCESS_LEAP_SECOND_INFO */ case ProcessWineGrantAdminToken: /* NULL */ return NtSetInformationProcess( handle, class, ptr, len ); + case ProcessExecuteFlags: /* ULONG */ + status = NtSetInformationProcess( handle, class, ptr, len ); + if (!status) Wow64CpuNotifyProcessExecuteFlagsChange(*(ULONG *)ptr); + return status; + case ProcessAccessToken: /* PROCESS_ACCESS_TOKEN */ if (len == sizeof(PROCESS_ACCESS_TOKEN32)) { diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index d52c52fef8e..87eed7ba895 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -103,6 +103,7 @@ static NTSTATUS (WINAPI *pBTCpuSetContext)(HANDLE,HANDLE,void *,void *); static void (WINAPI *pBTCpuThreadInit)(void); static void (WINAPI *pBTCpuSimulate)(void) __attribute__((used)); static void * (WINAPI *p__wine_get_unix_opcode)(void); +static void (WINAPI *pBTCpuNotifyProcessExecuteFlagsChange)(ULONG); static void * (WINAPI *pKiRaiseUserExceptionDispatcher)(void); void (WINAPI *pBTCpuFlushInstructionCache2)( const void *, SIZE_T ) = NULL; void (WINAPI *pBTCpuFlushInstructionCacheHeavy)( const void *, SIZE_T ) = NULL; @@ -1029,6 +1030,7 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex GET_PTR( BTCpuProcessTerm ); GET_PTR( BTCpuThreadTerm ); GET_PTR( __wine_get_unix_opcode ); + GET_PTR( BTCpuNotifyProcessExecuteFlagsChange ); module = load_64bit_module( L"wow64win.dll" ); GET_PTR( sdwhwin32 ); @@ -1711,3 +1713,12 @@ NTSTATUS WINAPI Wow64RaiseException( int code, EXCEPTION_RECORD *rec ) return STATUS_SUCCESS; } + +/********************************************************************** + * Wow64CpuNotifyProcessExecuteFlagsChange (wow64.@) + */ +void WINAPI Wow64CpuNotifyProcessExecuteFlagsChange( ULONG flags ) +{ + if (pBTCpuNotifyProcessExecuteFlagsChange) + pBTCpuNotifyProcessExecuteFlagsChange( flags ); +} -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11253