From 63db3d2aef606a1c197dac103510479391044f84 Mon Sep 17 00:00:00 2001 From: "Olivier F. R. Dierick" Date: Tue, 19 Apr 2016 07:25:39 +0200 Subject: [PATCH] kernel32: Implement SetProcessDEPPolicy(). --- dlls/kernel32/process.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 4ec6ebc415b..70c5b33f14c 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -71,6 +71,8 @@ typedef struct DWORD dwReserved; } LOADPARMS32; +static BOOL is_wow64; + HMODULE kernel32_handle = 0; SYSTEM_BASIC_INFORMATION system_info = { 0 }; @@ -86,6 +88,7 @@ const WCHAR DIR_System[] = {'C',':','\\','w','i','n','d','o','w','s', #define PDB32_FILE_APIS_OEM 0x0040 /* File APIs are OEM */ #define PDB32_WIN32S_PROC 0x8000 /* Win32s process */ +static DEP_SYSTEM_POLICY_TYPE system_DEP_policy = OptIn; #ifdef __i386__ extern DWORD call_process_entry( PEB *peb, LPTHREAD_START_ROUTINE entry ); @@ -188,6 +191,7 @@ void * CDECL __wine_kernel_init(void) static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0}; kernel32_handle = GetModuleHandleW(kernel32W); + IsWow64Process( GetCurrentProcess(), &is_wow64 ); RtlSetUnhandledExceptionFilter( UnhandledExceptionFilter ); LOCALE_Init(); @@ -890,9 +894,35 @@ DEP_SYSTEM_POLICY_TYPE WINAPI GetSystemDEPPolicy(void) */ BOOL WINAPI SetProcessDEPPolicy(DWORD newDEP) { - FIXME("(%d): stub\n", newDEP); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + ULONG dep_flags = 0; + NTSTATUS status; + + TRACE("(%d)\n", newDEP); + + if (is_wow64 || (system_DEP_policy != OptIn && system_DEP_policy != OptOut) ) + { + SetLastError(ERROR_ACCESS_DENIED); + return FALSE; + } + + if (!newDEP) + dep_flags = MEM_EXECUTE_OPTION_ENABLE; + else if (newDEP & PROCESS_DEP_ENABLE) + dep_flags = MEM_EXECUTE_OPTION_DISABLE|MEM_EXECUTE_OPTION_PERMANENT; + else + { + SetLastError(ERROR_ACCESS_DENIED); + return FALSE; + } + + if (newDEP & PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION) + dep_flags |= MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION; + + status = NtSetInformationProcess( GetCurrentProcess(), ProcessExecuteFlags, + &dep_flags, sizeof(dep_flags) ); + + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; } /********************************************************************** -- 2.17.1