Index: /trunk/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp	(revision 70211)
+++ /trunk/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp	(revision 70212)
@@ -89,4 +89,8 @@
 /** KeDeregisterProcessorChangeCallback - Introducted in Windows 7. */
 PFNKEDEREGISTERPROCESSORCHANGECALLBACK  g_pfnrtKeDeregisterProcessorChangeCallback;
+/** KeSetImportanceDpc - Introducted in NT 3.51. */
+decltype(KeSetImportanceDpc)           *g_pfnrtKeSetImportanceDpc;
+/** KeSetTargetProcessorDpc - Introducted in NT 3.51. */
+decltype(KeSetTargetProcessorDpc)      *g_pfnrtKeSetTargetProcessorDpc;
 /** Pointer to the MmProtectMdlSystemAddress kernel function if it's available.
  * This API was introduced in XP. */
@@ -100,4 +104,8 @@
 /** MmAllocateContiguousMemorySpecifyCache - Introduced in Windows 2000. */
 decltype(MmAllocateContiguousMemorySpecifyCache) *g_pfnrtMmAllocateContiguousMemorySpecifyCache;
+/** MmSecureVirtualMemory - Introduced in NT 3.51.   */
+decltype(MmSecureVirtualMemory)        *g_pfnrtMmSecureVirtualMemory;
+/** MmUnsecureVirtualMemory - Introduced in NT 3.51.   */
+decltype(MmUnsecureVirtualMemory)      *g_pfnrtMmUnsecureVirtualMemory;
 /** RtlGetVersion, introduced in ??. */
 PFNRTRTLGETVERSION                      g_pfnrtRtlGetVersion;
@@ -295,4 +303,6 @@
     GET_SYSTEM_ROUTINE(KeRegisterProcessorChangeCallback);
     GET_SYSTEM_ROUTINE(KeDeregisterProcessorChangeCallback);
+    GET_SYSTEM_ROUTINE(KeSetImportanceDpc);
+    GET_SYSTEM_ROUTINE(KeSetTargetProcessorDpc);
     GET_SYSTEM_ROUTINE(MmProtectMdlSystemAddress);
     GET_SYSTEM_ROUTINE(MmAllocatePagesForMdl);
@@ -300,4 +310,6 @@
     GET_SYSTEM_ROUTINE(MmMapLockedPagesSpecifyCache);
     GET_SYSTEM_ROUTINE(MmAllocateContiguousMemorySpecifyCache);
+    GET_SYSTEM_ROUTINE(MmSecureVirtualMemory);
+    GET_SYSTEM_ROUTINE(MmUnsecureVirtualMemory);
 
     GET_SYSTEM_ROUTINE_TYPE(RtlGetVersion, PFNRTRTLGETVERSION);
Index: /trunk/src/VBox/Runtime/r0drv/nt/internal-r0drv-nt.h
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/internal-r0drv-nt.h	(revision 70211)
+++ /trunk/src/VBox/Runtime/r0drv/nt/internal-r0drv-nt.h	(revision 70212)
@@ -82,4 +82,6 @@
 extern PFNKEREGISTERPROCESSORCHANGECALLBACK    g_pfnrtKeRegisterProcessorChangeCallback;
 extern PFNKEDEREGISTERPROCESSORCHANGECALLBACK  g_pfnrtKeDeregisterProcessorChangeCallback;
+extern decltype(KeSetImportanceDpc)           *g_pfnrtKeSetImportanceDpc;
+extern decltype(KeSetTargetProcessorDpc)      *g_pfnrtKeSetTargetProcessorDpc;
 extern decltype(MmProtectMdlSystemAddress)    *g_pfnrtMmProtectMdlSystemAddress;
 extern decltype(MmAllocatePagesForMdl)        *g_pfnrtMmAllocatePagesForMdl;
@@ -87,4 +89,7 @@
 extern decltype(MmMapLockedPagesSpecifyCache) *g_pfnrtMmMapLockedPagesSpecifyCache;
 extern decltype(MmAllocateContiguousMemorySpecifyCache) *g_pfnrtMmAllocateContiguousMemorySpecifyCache;
+extern decltype(MmSecureVirtualMemory)        *g_pfnrtMmSecureVirtualMemory;
+extern decltype(MmUnsecureVirtualMemory)      *g_pfnrtMmUnsecureVirtualMemory;
+
 extern PFNRTRTLGETVERSION                      g_pfnrtRtlGetVersion;
 #ifndef RT_ARCH_AMD64
@@ -111,4 +116,5 @@
 
 
+int __stdcall rtMpPokeCpuUsingFailureNotSupported(RTCPUID idCpu);
 int __stdcall rtMpPokeCpuUsingDpc(RTCPUID idCpu);
 int __stdcall rtMpPokeCpuUsingBroadcastIpi(RTCPUID idCpu);
Index: /trunk/src/VBox/Runtime/r0drv/nt/memobj-r0drv-nt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/memobj-r0drv-nt.cpp	(revision 70211)
+++ /trunk/src/VBox/Runtime/r0drv/nt/memobj-r0drv-nt.cpp	(revision 70212)
@@ -96,5 +96,5 @@
                 if (pMemNt->pvSecureMem)
                 {
-                    MmUnsecureVirtualMemory(pMemNt->pvSecureMem);
+                    g_pfnrtMmUnsecureVirtualMemory(pMemNt->pvSecureMem);
                     pMemNt->pvSecureMem = NULL;
                 }
@@ -159,5 +159,5 @@
             if (pMemNt->pvSecureMem)
             {
-                MmUnsecureVirtualMemory(pMemNt->pvSecureMem);
+                g_pfnrtMmUnsecureVirtualMemory(pMemNt->pvSecureMem);
                 pMemNt->pvSecureMem = NULL;
             }
@@ -602,11 +602,13 @@
         }
 
-        if (R0Process != NIL_RTR0PROCESS)
+        if (   R0Process != NIL_RTR0PROCESS
+            && g_pfnrtMmSecureVirtualMemory
+            && g_pfnrtMmUnsecureVirtualMemory)
         {
             /* Make sure the user process can't change the allocation. */
-            pMemNt->pvSecureMem = MmSecureVirtualMemory(pv, cb,
-                                                        fAccess & RTMEM_PROT_WRITE
-                                                        ? PAGE_READWRITE
-                                                        : PAGE_READONLY);
+            pMemNt->pvSecureMem = g_pfnrtMmSecureVirtualMemory(pv, cb,
+                                                               fAccess & RTMEM_PROT_WRITE
+                                                               ? PAGE_READWRITE
+                                                               : PAGE_READONLY);
             if (!pMemNt->pvSecureMem)
             {
@@ -639,5 +641,6 @@
     if (pMemNt->pvSecureMem)
     {
-        MmUnsecureVirtualMemory(pMemNt->pvSecureMem);
+        if (g_pfnrtMmUnsecureVirtualMemory)
+            g_pfnrtMmUnsecureVirtualMemory(pMemNt->pvSecureMem);
         pMemNt->pvSecureMem = NULL;
     }
Index: /trunk/src/VBox/Runtime/r0drv/nt/mp-r0drv-nt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/mp-r0drv-nt.cpp	(revision 70211)
+++ /trunk/src/VBox/Runtime/r0drv/nt/mp-r0drv-nt.cpp	(revision 70212)
@@ -593,5 +593,4 @@
         g_pfnrtHalRequestIpiW7Plus = NULL;
 
-    g_pfnrtMpPokeCpuWorker = rtMpPokeCpuUsingDpc;
     if (   g_pfnrtHalRequestIpiW7Plus
         && g_pfnrtKeInitializeAffinityEx
@@ -607,7 +606,16 @@
         g_pfnrtMpPokeCpuWorker = rtMpPokeCpuUsingBroadcastIpi;
     }
+    else if (g_pfnrtKeSetTargetProcessorDpc)
+    {
+        DbgPrint("IPRT: RTMpPoke => rtMpPokeCpuUsingDpc\n");
+        g_pfnrtMpPokeCpuWorker = rtMpPokeCpuUsingDpc;
+        /* Windows XP should send always send an IPI -> VERIFY */
+    }
     else
-        DbgPrint("IPRT: RTMpPoke => rtMpPokeCpuUsingDpc\n");
-    /* else: Windows XP should send always send an IPI -> VERIFY */
+    {
+        DbgPrint("IPRT: RTMpPoke => rtMpPokeCpuUsingFailureNotSupported\n");
+        Assert(pOsVerInfo->uMajorVer == 3 && pOsVerInfo->uMinorVer <= 50);
+        g_pfnrtMpPokeCpuWorker = rtMpPokeCpuUsingFailureNotSupported;
+    }
 
     return VINF_SUCCESS;
@@ -1338,6 +1346,8 @@
                         RTErrConvertFromNtStatus(rcNt));
     }
+    else if (g_pfnrtKeSetTargetProcessorDpc)
+        g_pfnrtKeSetTargetProcessorDpc(pDpc, RTMpCpuIdToSetIndex(idCpu));
     else
-        KeSetTargetProcessorDpc(pDpc, RTMpCpuIdToSetIndex(idCpu));
+        return VERR_NOT_SUPPORTED;
     return VINF_SUCCESS;
 }
@@ -1414,5 +1424,6 @@
     {
         KeInitializeDpc(&paExecCpuDpcs[0], rtmpNtDPCWrapper, pArgs);
-        KeSetImportanceDpc(&paExecCpuDpcs[0], HighImportance);
+        if (g_pfnrtKeSetImportanceDpc)
+            g_pfnrtKeSetImportanceDpc(&paExecCpuDpcs[0], HighImportance);
         rc = rtMpNtSetTargetProcessorDpc(&paExecCpuDpcs[0], idCpu);
         pArgs->idCpu = idCpu;
@@ -1421,10 +1432,12 @@
     {
         KeInitializeDpc(&paExecCpuDpcs[0], rtmpNtDPCWrapper, pArgs);
-        KeSetImportanceDpc(&paExecCpuDpcs[0], HighImportance);
+        if (g_pfnrtKeSetImportanceDpc)
+            g_pfnrtKeSetImportanceDpc(&paExecCpuDpcs[0], HighImportance);
         rc = rtMpNtSetTargetProcessorDpc(&paExecCpuDpcs[0], idCpu);
         pArgs->idCpu = idCpu;
 
         KeInitializeDpc(&paExecCpuDpcs[1], rtmpNtDPCWrapper, pArgs);
-        KeSetImportanceDpc(&paExecCpuDpcs[1], HighImportance);
+        if (g_pfnrtKeSetImportanceDpc)
+            g_pfnrtKeSetImportanceDpc(&paExecCpuDpcs[1], HighImportance);
         if (RT_SUCCESS(rc))
             rc = rtMpNtSetTargetProcessorDpc(&paExecCpuDpcs[1], (int)idCpu2);
@@ -1438,5 +1451,6 @@
             {
                 KeInitializeDpc(&paExecCpuDpcs[i], rtmpNtDPCWrapper, pArgs);
-                KeSetImportanceDpc(&paExecCpuDpcs[i], HighImportance);
+                if (g_pfnrtKeSetImportanceDpc)
+                    g_pfnrtKeSetImportanceDpc(&paExecCpuDpcs[i], HighImportance);
                 rc = rtMpNtSetTargetProcessorDpc(&paExecCpuDpcs[i], RTMpCpuIdFromSetIndex(i));
             }
@@ -1693,5 +1707,6 @@
     KeInitializeEvent(&pArgs->DoneEvt, SynchronizationEvent, FALSE /* not signalled */);
     KeInitializeDpc(&pArgs->Dpc, rtMpNtOnSpecificDpcWrapper, pArgs);
-    KeSetImportanceDpc(&pArgs->Dpc, HighImportance);
+    if (g_pfnrtKeSetImportanceDpc)
+        g_pfnrtKeSetImportanceDpc(&pArgs->Dpc, HighImportance);
     rc = rtMpNtSetTargetProcessorDpc(&pArgs->Dpc, idCpu);
     if (RT_FAILURE(rc))
@@ -1871,4 +1886,9 @@
 }
 
+int rtMpPokeCpuUsingFailureNotSupported(RTCPUID idCpu)
+{
+    NOREF(idCpu);
+    return VERR_NOT_SUPPORTED;
+}
 
 int rtMpPokeCpuUsingDpc(RTCPUID idCpu)
@@ -1887,5 +1907,6 @@
         {
             KeInitializeDpc(&s_aPokeDpcs[i], rtMpNtPokeCpuDummy, NULL);
-            KeSetImportanceDpc(&s_aPokeDpcs[i], HighImportance);
+            if (g_pfnrtKeSetImportanceDpc)
+                g_pfnrtKeSetImportanceDpc(&s_aPokeDpcs[i], HighImportance);
             int rc = rtMpNtSetTargetProcessorDpc(&s_aPokeDpcs[i], idCpu);
             if (RT_FAILURE(rc))
@@ -1901,6 +1922,7 @@
     KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
 
-    KeSetImportanceDpc(&s_aPokeDpcs[idCpu], HighImportance);
-    KeSetTargetProcessorDpc(&s_aPokeDpcs[idCpu], (int)idCpu);
+    if (g_pfnrtKeSetImportanceDpc)
+        g_pfnrtKeSetImportanceDpc(&s_aPokeDpcs[idCpu], HighImportance);
+    g_pfnrtKeSetTargetProcessorDpc(&s_aPokeDpcs[idCpu], (int)idCpu);
 
     /* Assuming here that high importance DPCs will be delivered immediately; or at least an IPI will be sent immediately.
Index: /trunk/src/VBox/Runtime/r0drv/nt/timer-r0drv-nt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/timer-r0drv-nt.cpp	(revision 70211)
+++ /trunk/src/VBox/Runtime/r0drv/nt/timer-r0drv-nt.cpp	(revision 70212)
@@ -533,5 +533,6 @@
             else
                 KeInitializeDpc(&pTimer->aSubTimers[iCpu].NtDpc, rtTimerNtOmniSlaveCallback, &pTimer->aSubTimers[iCpu]);
-            KeSetImportanceDpc(&pTimer->aSubTimers[iCpu].NtDpc, HighImportance);
+            if (g_pfnrtKeSetImportanceDpc)
+                g_pfnrtKeSetImportanceDpc(&pTimer->aSubTimers[iCpu].NtDpc, HighImportance);
             rc = rtMpNtSetTargetProcessorDpc(&pTimer->aSubTimers[iCpu].NtDpc, iCpu);
         }
@@ -548,5 +549,6 @@
 
         KeInitializeDpc(&pTimer->aSubTimers[0].NtDpc, rtTimerNtSimpleCallback, pTimer);
-        KeSetImportanceDpc(&pTimer->aSubTimers[0].NtDpc, HighImportance);
+        if (g_pfnrtKeSetImportanceDpc)
+            g_pfnrtKeSetImportanceDpc(&pTimer->aSubTimers[0].NtDpc, HighImportance);
         if (pTimer->fSpecificCpu)
             rc = rtMpNtSetTargetProcessorDpc(&pTimer->aSubTimers[0].NtDpc, (int)pTimer->idCpu);
