Index: /trunk/include/iprt/thread.h
===================================================================
--- /trunk/include/iprt/thread.h	(revision 52631)
+++ /trunk/include/iprt/thread.h	(revision 52632)
@@ -276,4 +276,8 @@
 RTDECL(int) RTThreadCreate(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,
                            RTTHREADTYPE enmType, unsigned fFlags, const char *pszName);
+/** @copydoc RTThreadCreate */
+typedef DECLCALLBACKPTR(int, PFNRTTHREADCREATE)(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,
+                                                RTTHREADTYPE enmType, unsigned fFlags, const char *pszName);
+
 
 /**
Index: /trunk/src/VBox/HostDrivers/Support/SUPLibInternal.h
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPLibInternal.h	(revision 52631)
+++ /trunk/src/VBox/HostDrivers/Support/SUPLibInternal.h	(revision 52632)
@@ -443,4 +443,7 @@
 DECLHIDDEN(bool)    supR3HardenedWinIsReSpawnNeeded(int iWhich, int cArgs, char **papszArgs);
 DECLHIDDEN(int)     supR3HardenedWinReSpawn(int iWhich);
+# ifdef _WINDEF_
+DECLHIDDEN(void)    supR3HardenedWinCreateParentWatcherThread(HMODULE hVBoxRT);
+# endif
 DECLHIDDEN(void *)  supR3HardenedWinLoadLibrary(const char *pszName, bool fSystem32Only);
 extern RTUTF16      g_wszSupLibHardenedExePath[1024];
Index: /trunk/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp	(revision 52631)
+++ /trunk/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp	(revision 52632)
@@ -1524,4 +1524,13 @@
         supR3HardenedFatalMsg("supR3HardenedMainInitRuntime", kSupInitOp_IPRT, rc,
                               "RTR3InitEx failed with rc=%d", rc);
+
+#if defined(RT_OS_WINDOWS)
+    /*
+     * Windows: Create thread that terminates the process when the parent stub
+     *          process terminates (VBoxNetDHCP, Ctrl-C, etc).
+     */
+    if (!(fFlags & SUPSECMAIN_FLAGS_DONT_OPEN_DEV))
+        supR3HardenedWinCreateParentWatcherThread(hMod);
+#endif
 }
 
Index: /trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp	(revision 52631)
+++ /trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp	(revision 52632)
@@ -47,4 +47,5 @@
 #include <iprt/param.h>
 #include <iprt/path.h>
+#include <iprt/thread.h>
 #include <iprt/zero.h>
 
@@ -75,5 +76,5 @@
     do { \
         if (!(a_Expr)) \
-            supR3HardenedFatal("%s: %s", __FUNCTION__, #a_Expr); \
+            supR3HardenedFatal("%s: %s\n", __FUNCTION__, #a_Expr); \
     } while (0)
 
@@ -83,5 +84,5 @@
         NTSTATUS rcNtAssert = (a_Expr); \
         if (!NT_SUCCESS(rcNtAssert)) \
-            supR3HardenedFatal("%s: %s -> %#x", __FUNCTION__, #a_Expr, rcNtAssert); \
+            supR3HardenedFatal("%s: %s -> %#x\n", __FUNCTION__, #a_Expr, rcNtAssert); \
     } while (0)
 
@@ -91,5 +92,5 @@
         BOOL fRcAssert = (a_Expr); \
         if (fRcAssert == FALSE) \
-            supR3HardenedFatal("%s: %s -> %#x", __FUNCTION__, #a_Expr, GetLastError()); \
+            supR3HardenedFatal("%s: %s -> %#x\n", __FUNCTION__, #a_Expr, GetLastError()); \
     } while (0)
 
@@ -820,5 +821,5 @@
                     UniStrStatic.Buffer = &wszPath[cwcName + 1];
                     UniStrStatic.Length = 0;
-                    UniStrStatic.MaximumLength = (USHORT)sizeof(wszPath) - UniStrStatic.MaximumLength - sizeof(WCHAR);
+                    UniStrStatic.MaximumLength = (USHORT)(sizeof(wszPath) - cwcName * sizeof(WCHAR) - sizeof(WCHAR));
 
                     static UNICODE_STRING const s_DefaultSuffix = RTNT_CONSTANT_UNISTR(L".dll");
@@ -1953,4 +1954,105 @@
 
 /**
+ * IPRT thread that waits for the parent process to terminate and reacts by
+ * exiting the current process.
+ *
+ * @returns VINF_SUCCESS
+ * @param   hSelf               The current thread.  Ignored.
+ * @param   pvUser              The handle of the parent process.
+ */
+static DECLCALLBACK(int) supR3HardenedWinParentWatcherThread(RTTHREAD hSelf, void *pvUser)
+{
+    HANDLE hProcWait = (HANDLE)pvUser;
+    NOREF(hSelf);
+
+    /*
+     * Wait for the parent to terminate.
+     */
+    NTSTATUS rcNt;
+    for (;;)
+    {
+        rcNt = NtWaitForSingleObject(hProcWait, TRUE /*Alertable*/, NULL /*pTimeout*/);
+        if (   rcNt == STATUS_WAIT_0
+            || rcNt == STATUS_ABANDONED_WAIT_0)
+            break;
+        if (   rcNt != STATUS_TIMEOUT
+            && rcNt != STATUS_USER_APC
+            && rcNt != STATUS_ALERTED)
+            supR3HardenedFatal("NtWaitForSingleObject returned %#x\n", rcNt);
+    }
+
+    /*
+     * Proxy the termination code of the child, if it exited already.
+     */
+    PROCESS_BASIC_INFORMATION BasicInfo;
+    NTSTATUS rcNt2 = NtQueryInformationProcess(hProcWait, ProcessBasicInformation, &BasicInfo, sizeof(BasicInfo), NULL);
+    if (   !NT_SUCCESS(rcNt2)
+        || BasicInfo.ExitStatus == STATUS_PENDING)
+        BasicInfo.ExitStatus = RTEXITCODE_FAILURE;
+
+    NtClose(hProcWait);
+    SUP_DPRINTF(("supR3HardenedWinParentWatcherThread: Quitting: ExitCode=%#x rcNt=%#x\n", BasicInfo.ExitStatus, rcNt));
+    suplibHardenedExit((RTEXITCODE)BasicInfo.ExitStatus);
+
+    return VINF_SUCCESS; /* won't be reached. */
+}
+
+
+/**
+ * Creates the parent watcher thread that will make sure this process exits when
+ * the parent does.
+ *
+ * This is a necessary evil to make VBoxNetDhcp and VBoxNetNat termination from
+ * Main work without too much new magic.  It also makes Ctrl-C or similar work
+ * in on the hardened processes in the windows console.
+ *
+ * @param   hVBoxRT             The VBoxRT.dll handle.  We use RTThreadCreate to
+ *                              spawn the thread to avoid duplicating thread
+ *                              creation and thread naming code from IPRT.
+ */
+DECLHIDDEN(void) supR3HardenedWinCreateParentWatcherThread(HMODULE hVBoxRT)
+{
+    /*
+     * Resolve runtime methods that we need.
+     */
+    PFNRTTHREADCREATE pfnRTThreadCreate = (PFNRTTHREADCREATE)GetProcAddress(hVBoxRT, "RTThreadCreate");
+    SUPR3HARDENED_ASSERT(pfnRTThreadCreate != NULL);
+
+    /*
+     * Find the parent process ID.
+     */
+    PROCESS_BASIC_INFORMATION BasicInfo;
+    NTSTATUS rcNt = NtQueryInformationProcess(NtCurrentProcess(), ProcessBasicInformation, &BasicInfo, sizeof(BasicInfo), NULL);
+    if (!NT_SUCCESS(rcNt))
+        supR3HardenedFatal("supR3HardenedWinCreateParentWatcherThread: NtQueryInformationProcess failed: %#x\n", rcNt);
+
+    /*
+     * Open the parent process for waiting and exitcode query.
+     */
+    OBJECT_ATTRIBUTES ObjAttr;
+    InitializeObjectAttributes(&ObjAttr, NULL, 0, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+    CLIENT_ID ClientId;
+    ClientId.UniqueProcess = (HANDLE)BasicInfo.InheritedFromUniqueProcessId;
+    ClientId.UniqueThread  = NULL;
+#if 0 /** @todo fix me later. */
+    HANDLE hParent;
+    rcNt = NtOpenProcess(&hParent, SYNCHRONIZE | PROCESS_QUERY_INFORMATION, &ObjAttr, &ClientId);
+    if (!NT_SUCCESS(rcNt))
+        supR3HardenedFatalMsg("supR3HardenedWinCreateParentWatcherThread", kSupInitOp_Misc, VERR_GENERAL_FAILUREps,
+                              "NtOpenProcess(%p.0) failed: %#x\n", ClientId.UniqueProcess, rcNt);
+
+    /*
+     * Create the thread that should do the waiting.
+     */
+    int rc = pfnRTThreadCreate(NULL, supR3HardenedWinParentWatcherThread, hParent, _64K /* stack */,
+                               RTTHREADTYPE_DEFAULT, 0 /*fFlags*/, "ParentWatcher");
+    if (RT_FAILURE(rc))
+        supR3HardenedFatal("supR3HardenedWinCreateParentWatcherThread: RTThreadCreate failed: %Rrc\n", rc);
+#endif
+}
+
+
+/**
  * Install hooks for intercepting calls dealing with mapping shared libraries
  * into the process.
