wine-staging/patches/kernel32-SetProcessDEPPolicy/0001-kernel32-Implement-SetProcessDEPPolicy.patch
2019-07-01 08:26:17 +10:00

65 lines
2.0 KiB
Diff

From 71cb9b2d7c41098881516a2b8f5db2f17f84dca6 Mon Sep 17 00:00:00 2001
From: "Olivier F. R. Dierick" <o.dierick@piezo-forte.be>
Date: Tue, 19 Apr 2016 07:25:39 +0200
Subject: [PATCH 1/3] kernel32: Implement SetProcessDEPPolicy().
---
dlls/kernel32/process.c | 34 +++++++++++++++++++++++++++++++---
1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index 0d0de93eee..7a89207388 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -114,6 +114,8 @@ static WCHAR winevdm[] = {'C',':','\\','w','i','n','d','o','w','s',
static const char * const cpu_names[] = { "x86", "x86_64", "PowerPC", "ARM", "ARM64" };
+static DEP_SYSTEM_POLICY_TYPE system_DEP_policy = OptIn;
+
static void exec_process( LPCWSTR name );
extern void SHELL_LoadRegistry(void);
@@ -4376,9 +4378,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