aboutsummaryrefslogtreecommitdiff
path: root/src/lib/process/winprocess_sys.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-11-01 12:55:10 -0400
committerNick Mathewson <nickm@torproject.org>2018-11-05 09:22:02 -0500
commit178c1821b2115972ce3c3f194d1fcbd0d75ca364 (patch)
tree56da01098fd0df3ecf08bdc36165030d0287b991 /src/lib/process/winprocess_sys.c
parent175153a3290b3987faacac9d5390e87e1ad4a457 (diff)
downloadtor-178c1821b2115972ce3c3f194d1fcbd0d75ca364.tar.gz
tor-178c1821b2115972ce3c3f194d1fcbd0d75ca364.zip
Make the windows process parameter initialization a subsystem
Also, move it from "main" into lib/process
Diffstat (limited to 'src/lib/process/winprocess_sys.c')
-rw-r--r--src/lib/process/winprocess_sys.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/lib/process/winprocess_sys.c b/src/lib/process/winprocess_sys.c
new file mode 100644
index 0000000000..e00f94c915
--- /dev/null
+++ b/src/lib/process/winprocess_sys.c
@@ -0,0 +1,64 @@
+/* Copyright (c) 2018, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file winprocess_sys.c
+ * \brief Subsystem object for windows process setup.
+ **/
+
+#include "orconfig.h"
+#include "lib/subsys/subsys.h"
+#include "lib/process/winprocess_sys.h"
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef _WIN32
+#include <windows.h>
+
+#define WINPROCESS_SYS_ENABLED true
+
+static int
+init_windows_process_params(void)
+{
+#ifndef HeapEnableTerminationOnCorruption
+#define HeapEnableTerminationOnCorruption 1
+#endif
+
+ /* On heap corruption, just give up; don't try to play along. */
+ HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
+
+ /* SetProcessDEPPolicy is only supported on 32-bit Windows.
+ * (On 64-bit Windows it always fails, and some compilers don't like the
+ * PSETDEP cast.)
+ * 32-bit Windows defines _WIN32.
+ * 64-bit Windows defines _WIN32 and _WIN64. */
+#ifndef _WIN64
+ /* Call SetProcessDEPPolicy to permanently enable DEP.
+ The function will not resolve on earlier versions of Windows,
+ and failure is not dangerous. */
+ HMODULE hMod = GetModuleHandleA("Kernel32.dll");
+ if (hMod) {
+ typedef BOOL (WINAPI *PSETDEP)(DWORD);
+ PSETDEP setdeppolicy = (PSETDEP)GetProcAddress(hMod,
+ "SetProcessDEPPolicy");
+ if (setdeppolicy) {
+ /* PROCESS_DEP_ENABLE | PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION */
+ setdeppolicy(3);
+ }
+ }
+#endif /* !defined(_WIN64) */
+
+ return 0;
+}
+#else /* !defined(_WIN32) */
+#define WINPROCESS_SYS_ENABLED false
+#define init_windows_process_params NULL
+#endif /* defined(_WIN32) */
+
+const subsys_fns_t sys_winprocess = {
+ .name = "winprocess",
+ .level = -100,
+ .supported = WINPROCESS_SYS_ENABLED,
+ .initialize = init_windows_process_params,
+};