Index: /trunk/Config.kmk
===================================================================
--- /trunk/Config.kmk	(revision 57864)
+++ /trunk/Config.kmk	(revision 57865)
@@ -742,4 +742,7 @@
  VBOX_WITH_NATIVE_DTRACE = 1
 endif
+# Makes it possible to run some of the testcases and tools on older
+# windows versions (only define when buildling win.x86).
+#VBOX_WITH_MORE_NT4_COMPAT_BINARIES = 1
 ## @}
 
@@ -3994,4 +3997,17 @@
  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.amd64)_LIB)/oldnames.lib
  TEMPLATE_VBOXR3EXE_POST_CMDS          = $(VBOX_SIGN_IMAGE_CMDS)
+ if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+  TEMPLATE_VBOXR3EXE_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out)$$(NLTAB)$(TEMPLATE_VBOXR3EXE_POST_CMDS))
+  TEMPLATE_VBOXR3EXE_LNK_DEPS.win.x86  = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION))
+  TEMPLATE_VBOXR3EXE_LDFLAGS.win.x86   = \
+  	-Include:_vcc100_kernel32_fakes_cpp \
+	-Include:_vcc100_kernel32_fakes_asm
+  TEMPLATE_VBOXR3EXE_LIBS.win.x86      = \
+  	$(PATH_STAGE_LIB)/RuntimeR3VccTricks$(VBOX_SUFF_LIB)
+  TEMPLATE_VBOXR3EXE_LIBS.x86          = \
+  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/oldnames.lib \
+  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
+ endif
 
 else # the gcc guys
@@ -4396,4 +4412,9 @@
 endif
 TEMPLATE_VBoxR3Tool_LIBS       = $(LIB_RUNTIME) $(TEMPLATE_VBOXR3EXE_LIBS)
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ TEMPLATE_VBoxR3Tool_LIBS.x86  = \
+ 	$(PATH_STAGE_LIB)/RuntimeR3VccTricks$(VBOX_SUFF_LIB) \
+ 	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/oldnames.lib
+endif
 
 #
@@ -4464,4 +4485,10 @@
  TEMPLATE_VBOXR3TSTEXE_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBOXR3EXE_LDFLAGS))
 endif
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ TEMPLATE_VBOXR3TSTEXE_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out))
+ TEMPLATE_VBOXR3TSTEXE_LIBS.x86 = \
+ 	$(PATH_STAGE_LIB)/RuntimeR3VccTricks$(VBOX_SUFF_LIB) \
+ 	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/oldnames.lib
+endif
 
 #
@@ -4552,4 +4579,31 @@
 	HC_ARCH_BITS=32 ARCH_BITS=32
 
+
+
+#
+# Template for building libraries that are linked into VBoxRT.dll
+# and it's variations, pedantic variation.
+#
+TEMPLATE_VBoxR3RuntimeDll = For libraries that are linked into VBoxRT.
+TEMPLATE_VBoxR3RuntimeDll_EXTENDS = VBoxR3Dll
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ TEMPLATE_VBoxR3RuntimeDll_CFLAGS   = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+ TEMPLATE_VBoxR3RuntimeDll_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+ TEMPLATE_VBoxR3RuntimeDll_LIBS.x86 = $(filter-out $(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/%, $(TEMPLATE_VBoxR3Dll_LIBS.x86)) \
+ 	$(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/oldnames.lib \
+ 	$(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+ 	$(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
+endif
+
+#
+# Template for building libraries that are linked into VBoxRT.dll
+# and it's variations, non-pedantic variation.
+#
+TEMPLATE_VBoxR3RuntimeDllNonPedantic = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings.
+TEMPLATE_VBoxR3RuntimeDllNonPedantic_EXTENDS = VBoxR3DllNonPedantic
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && $(KBUILD_TARGET_ARCH) == "x86"
+ TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS   = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+ TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+endif
 
 
Index: /trunk/src/VBox/Runtime/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Runtime/Makefile.kmk	(revision 57864)
+++ /trunk/src/VBox/Runtime/Makefile.kmk	(revision 57865)
@@ -1336,5 +1336,7 @@
 VBoxRT_SDKS                   += VBOX_OPENSSL
 VBoxRT_SDKS.win                = $(VBOX_WINPSDK) $(VBOX_WINDDK) VBOX_NTDLL
-if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win$(VBOX_WITH_HARDENING))
+if1of ($(KBUILD_TARGET), win)
+VBoxRT_INST                    = $(INST_DLL) $(INST_TESTCASE) $(VBOX_INST_TOOLS)
+else if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win$(VBOX_WITH_HARDENING))
 VBoxRT_INST                    = $(INST_DLL) $(INST_TESTCASE)
 endif
@@ -1452,5 +1454,7 @@
 $$(VBoxRT_0_OUTDIR)/VBoxRT.def: \
 		$(PATH_SUB_CURRENT)/r3/win/VBoxRT-$$(if-expr $$(KBUILD_TARGET_ARCH) == amd64,win64,win32).def \
-		$(PATH_SUB_CURRENT)/r3/win/$(if $(VBOX_OSE),VBoxRT-openssl-ose.def,VBoxRT-openssl.def)
+		$(PATH_SUB_CURRENT)/r3/win/$(if $(VBOX_OSE),VBoxRT-openssl-ose.def,VBoxRT-openssl.def) \
+		$(if-expr "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86" && defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES)\
+		,$(PATH_SUB_CURRENT)/r3/win/VBoxRT-msvcr100-win32.def ,) #$(PATH_SUB_CURRENT)/r3/win/VBoxRT-msvcp100-win32.def
 	$(RM) -f -- $@
 	$(REDIRECT) -wto $@ -- $(CAT_EXT) $^
@@ -1459,4 +1463,31 @@
 if1of (VBoxRT,$(DLLS))
  $(call VBOX_SET_VER_INFO_DLL,VBoxRT,VirtualBox Runtime)
+endif
+
+
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ #
+ # Hacks for running tests on NT 4.  Really ugly!
+ #
+ # We put most of the CRT in VBoxRT because we cannot even load msvcr100.dll
+ # or msvcp100.dll on NT4 because of kernel32.dll dependencies.  More hacks
+ # in RuntimeR3VccTricks.
+ #
+ TEMPLATE_VBoxR3RuntimeDllItself = xx
+ TEMPLATE_VBoxR3RuntimeDllItself_EXTENDS = VBoxR3RuntimeDll
+ TEMPLATE_VBoxR3RuntimeDllItself_LIBS.win.x86 = \
+ 	$(filter-out $(PATH_STAGE_LIB)/RuntimeR3VccTricks%, $(TEMPLATE_VBoxR3RuntimeDll_LIBS.win.x86))
+ TEMPLATE_VBoxR3RuntimeDllItself_SOURCES = \
+ 	r3/win/vcc100-kernel32-fakes.cpp \
+ 	r3/win/vcc100-kernel32-fakesA.asm \
+	r3/win/vcc100-msvcrt-fakes.cpp
+ VBoxRT_TEMPLATE         = VBoxR3RuntimeDllItself
+ VBoxRT_TEMPLATE.win.x86 = VBoxR3RuntimeDllItself
+ VBoxRT_DEFS.win.x86     = $(TEMPLATE_VBoxR3RuntimeDll_DEFS.win.x86) _CRTIMP_PURE="__declspec(dllexport)"
+ VBoxRT_LDFLAGS.win.x86  = /IGNORE:4049 /IGNORE:4217
+ VBoxRT_LIBS.win.x86 = \
+ 	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/oldnames.lib \
+ 	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/libcmt.lib \
+ 	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/libcpmt.lib
 endif
 
@@ -2493,4 +2524,28 @@
  	r3/win/vcc100-kernel32-fakesA.asm
 
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86" # Ugly hacks... :-)
+RuntimeR3VccTricks_SOURCES += $(RuntimeR3VccTricks_0_OUTDIR)/dynobjs.lib
+RuntimeR3VccTricks_CLEAN    = $(RuntimeR3VccTricks_0_OUTDIR)/dynobjs.lib
+RuntimeR3VccTricks_VBOX_LIBCMT_NEEDED = \
+
+$$(RuntimeR3VccTricks_0_OUTDIR)/dynobjs.lib: \
+		$$(PATH_TOOL_$$(TEMPLATE_VBoxR3Dll_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
+		$$(PATH_TOOL_$$(TEMPLATE_VBoxR3Dll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+		$$(LIB_RUNTIME) \
+		$(MAKEFILE) | $$(dir $$@)
+	$(RM) -f -- "$@"
+#	$(REDIRECT) -C $(dir $@) -- $(KBUILD_DEVTOOLS)/common/openwatcom/v1.9-r2/binnt/wlib \
+#               $(PATH_TOOL_$(TEMPLATE_VBoxR3Dll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+#               $(foreach file, $(RuntimeR3VccTricks_VBOX_LIBCMT_NEEDED), *$(file))
+	$(KBUILD_DEVTOOLS)/common/openwatcom/v1.9-r2/binnt/wlib -o=$@.tmp.lib $< \
+		-MSVCR100.dll \
+		$(addprefix $(RuntimeR3VccTricks_0_OUTDIR)/, $(RuntimeR3VccTricks_VBOX_LIBCMT_NEEDED)) \
+               -chandler4gs.obj
+	$(KBUILD_DEVTOOLS)/common/openwatcom/v1.9-r2/binnt/wlib -o=$@ \
+               $(LIB_RUNTIME) \
+		+$@.tmp.lib
+	$(RM) -f -- $@.tmp.lib $(addprefix $(RuntimeR3VccTricks_0_OUTDIR)/, $(RuntimeR3VccTricks_VBOX_LIBCMT_NEEDED))
+endif
+
 
 #
Index: /trunk/src/VBox/Runtime/common/path/RTPathGlob.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/path/RTPathGlob.cpp	(revision 57864)
+++ /trunk/src/VBox/Runtime/common/path/RTPathGlob.cpp	(revision 57865)
@@ -45,4 +45,5 @@
 #if defined(RT_OS_WINDOWS)
 # include <Windows.h>
+# include "../../r3/win/internal-r3-win.h"
 
 #elif defined(RT_OS_OS2)
@@ -500,6 +501,7 @@
         /* Since this is used at the start of a pattern, we assume
            we've got more than enough buffer space. */
+        AssertReturn(g_pfnGetSystemWindowsDirectoryW, VERR_SYMBOL_NOT_FOUND);
         PRTUTF16 pwszTmp = (PRTUTF16)pszBuf;
-        UINT cch = GetSystemWindowsDirectoryW(pwszTmp, (UINT)(cbBuf / sizeof(WCHAR)));
+        UINT cch = g_pfnGetSystemWindowsDirectoryW(pwszTmp, (UINT)(cbBuf / sizeof(WCHAR)));
         if (cch >= 2)
         {
@@ -547,6 +549,7 @@
     {
         Assert(pszBuf); Assert(cbBuf);
+        AssertReturn(g_pfnGetSystemWindowsDirectoryW, VERR_SYMBOL_NOT_FOUND);
         RTUTF16 wszSystemRoot[MAX_PATH];
-        UINT cchSystemRoot = GetSystemWindowsDirectoryW(wszSystemRoot, MAX_PATH);
+        UINT cchSystemRoot = g_pfnGetSystemWindowsDirectoryW(wszSystemRoot, MAX_PATH);
         if (cchSystemRoot > 0)
             return RTUtf16ToUtf8Ex(wszSystemRoot, cchSystemRoot, &pszBuf, cbBuf, pcchValue);
Index: /trunk/src/VBox/Runtime/r3/win/init-win.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/init-win.cpp	(revision 57864)
+++ /trunk/src/VBox/Runtime/r3/win/init-win.cpp	(revision 57865)
@@ -57,4 +57,6 @@
 /** The native ntdll.dll handle. */
 DECLHIDDEN(HMODULE)             g_hModNtDll = NULL;
+/** GetSystemWindowsDirectoryW or GetWindowsDirectoryW (NT4). */
+DECLHIDDEN(PFNGETWINSYSDIR)     g_pfnGetSystemWindowsDirectoryW = NULL;
 
 
@@ -293,4 +295,12 @@
         rc = rtR3InitNativeObtrusiveWorker();
 
+    /*
+     * Resolve some kernel32.dll APIs we may need but aren't necessarily
+     * present in older windows versions.
+     */
+    g_pfnGetSystemWindowsDirectoryW = (PFNGETWINSYSDIR)GetProcAddress(g_hModKernel32, "GetSystemWindowsDirectoryW");
+    if (g_pfnGetSystemWindowsDirectoryW)
+        g_pfnGetSystemWindowsDirectoryW = (PFNGETWINSYSDIR)GetProcAddress(g_hModKernel32, "GetWindowsDirectoryW");
+
     return rc;
 }
Index: /trunk/src/VBox/Runtime/r3/win/internal-r3-win.h
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/internal-r3-win.h	(revision 57864)
+++ /trunk/src/VBox/Runtime/r3/win/internal-r3-win.h	(revision 57865)
@@ -93,4 +93,6 @@
 extern DECLHIDDEN(HMODULE)          g_hModNtDll;
 extern DECLHIDDEN(OSVERSIONINFOEXW) g_WinOsInfoEx;
+typedef UINT (WINAPI *PFNGETWINSYSDIR)(LPWSTR,UINT);
+extern DECLHIDDEN(PFNGETWINSYSDIR)  g_pfnGetSystemWindowsDirectoryW;
 #endif
 
Index: /trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp	(revision 57864)
+++ /trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp	(revision 57865)
@@ -30,4 +30,5 @@
 *********************************************************************************************************************************/
 #include <iprt/cdefs.h>
+#include <iprt/types.h>
 
 #ifndef RT_ARCH_X86
@@ -140,2 +141,8 @@
 }
 
+
+extern "C" int vcc100_kernel32_fakes_cpp(void)
+{
+    return 42;
+}
+
Index: /trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm	(revision 57864)
+++ /trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm	(revision 57865)
@@ -18,4 +18,5 @@
 
 BEGINDATA
+GLOBALNAME vcc100_kernel32_fakes_asm
 
 MAKE_IMPORT_ENTRY DecodePointer, 4
Index: /trunk/src/libs/kStuff/Makefile.kmk
===================================================================
--- /trunk/src/libs/kStuff/Makefile.kmk	(revision 57864)
+++ /trunk/src/libs/kStuff/Makefile.kmk	(revision 57865)
@@ -23,5 +23,5 @@
 #
 LIBRARIES += VBox-kStuff
-VBox-kStuff_TEMPLATE = VBOXR3
+VBox-kStuff_TEMPLATE = VBoxR3RuntimeDll
 VBox-kStuff_DEFS = IN_RT_R3
 VBox-kStuff_DEFS.strict = K_STRICT KLDRMODMACHO_STRICT KLDRMODMACHO_STRICT2
Index: /trunk/src/libs/liblzf-3.4/Makefile.kmk
===================================================================
--- /trunk/src/libs/liblzf-3.4/Makefile.kmk	(revision 57864)
+++ /trunk/src/libs/liblzf-3.4/Makefile.kmk	(revision 57865)
@@ -25,5 +25,5 @@
  LIBRARIES += VBox-liblzf-static
 endif
-VBox-liblzf_TEMPLATE = VBOXR3
+VBox-liblzf_TEMPLATE = VBoxR3RuntimeDll
 VBox-liblzf_BLD_TYPE = release # WARNING! Always optimizing this lib.
 VBox-liblzf_DEFS = ULTRA_FAST=1 HLOG=12
Index: /trunk/src/libs/libxml2-2.6.31/Makefile.kmk
===================================================================
--- /trunk/src/libs/libxml2-2.6.31/Makefile.kmk	(revision 57864)
+++ /trunk/src/libs/libxml2-2.6.31/Makefile.kmk	(revision 57865)
@@ -22,5 +22,5 @@
  LIBRARIES += VBox-libxml2
 endif
-VBox-libxml2_TEMPLATE       = VBOXR3NP
+VBox-libxml2_TEMPLATE       = VBoxR3RuntimeDllNonPedantic
 VBox-libxml2_SDKS           = VBOX_ZLIB
 VBox-libxml2_DEFS           = _REENTRANT # the latter triggers thread support, see xmlversion-default.h and win32xmlversion.h.
Index: /trunk/src/libs/zlib-1.2.6/Makefile.kmk
===================================================================
--- /trunk/src/libs/zlib-1.2.6/Makefile.kmk	(revision 57864)
+++ /trunk/src/libs/zlib-1.2.6/Makefile.kmk	(revision 57865)
@@ -24,5 +24,5 @@
  LIBRARIES += VBox-zlib-static
 endif
-VBox-zlib_TEMPLATE = VBOXR3
+VBox-zlib_TEMPLATE = VBoxR3RuntimeDll
 VBox-zlib_DEFS = verbose=-1 NO_VIZ=1
 VBox-zlib_SOURCES = \
