Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPCommon.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPCommon.h	(revision 44148)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPCommon.h	(revision 44149)
@@ -33,7 +33,7 @@
 void VBoxMPCmnInitCustomVideoModes(PVBOXMP_DEVEXT pExt);
 VIDEO_MODE_INFORMATION* VBoxMPCmnGetCustomVideoModeInfo(ULONG ulIndex);
-VIDEO_MODE_INFORMATION* VBoxMPCmnGetVideoModeInfo(ULONG ulIndex);
 
 #ifdef VBOX_XPDM_MINIPORT
+VIDEO_MODE_INFORMATION* VBoxMPCmnGetVideoModeInfo(ULONG ulIndex);
 VIDEO_MODE_INFORMATION* VBoxMPXpdmCurrentVideoMode(PVBOXMP_DEVEXT pExt);
 ULONG VBoxMPXpdmGetVideoModesCount();
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp	(revision 44148)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp	(revision 44149)
@@ -24,4 +24,5 @@
 #endif
 #include <wchar.h>
+#include <VBox/Hardware/VBoxVideoVBE.h>
 
 #ifdef VBOX_WITH_WDDM
@@ -30,14 +31,16 @@
 
 /* Custom video modes which are being read from registry at driver startup. */
-static VIDEO_MODE_INFORMATION g_CustomVideoModes[64] = { 0 };
-
+static VIDEO_MODE_INFORMATION g_CustomVideoModes[VBOX_VIDEO_MAX_SCREENS] = { 0 };
+
+#ifdef VBOX_XPDM_MINIPORT
 /* Standart video modes list.
- * Additional space is reserved for custom video modes for 64 guest monitors.
+ * Additional space is reserved for custom video modes for VBOX_VIDEO_MAX_SCREENS guest monitors.
  * The custom video mode index is alternating and 2 indexes are reserved for the last custom mode.
  */
-static VIDEO_MODE_INFORMATION g_VideoModes[VBOXMP_MAX_VIDEO_MODES + 64 + 2] = { 0 };
+static VIDEO_MODE_INFORMATION g_VideoModes[VBOXMP_MAX_VIDEO_MODES + VBOX_VIDEO_MAX_SCREENS + 2] = { 0 };
 
 /* Number of available video modes, set by VBoxMPCmnBuildVideoModesTable. */
 static uint32_t g_NumVideoModes = 0;
+#endif
 
 static BOOLEAN
@@ -210,8 +213,10 @@
 }
 
+#ifdef VBOX_XPDM_MINIPORT
 VIDEO_MODE_INFORMATION* VBoxMPCmnGetVideoModeInfo(ULONG ulIndex)
 {
     return (ulIndex<RT_ELEMENTS(g_VideoModes)) ? &g_VideoModes[ulIndex] : NULL;
 }
+#endif
 
 static bool VBoxMPVideoModesMatch(const PVIDEO_MODE_INFORMATION pMode1, const PVIDEO_MODE_INFORMATION pMode2)
@@ -963,4 +968,62 @@
     Assert(pModes->cModes<=RT_ELEMENTS(pModes->aModes));
 
+    if (!VBoxMPIsStartingUp(pExt, VidPnTargetId))
+    {
+        /* make sure we keep the current mode to avoid mode flickering */
+        PVBOXWDDM_ALLOC_DATA pAllocData = pExt->aSources[VidPnTargetId].pPrimaryAllocation ?
+                  &pExt->aSources[VidPnTargetId].pPrimaryAllocation->AllocData
+                : &pExt->aSources[VidPnTargetId].AllocData;
+        if (pModes->cModes < RT_ELEMENTS(pModes->aModes))
+        {
+            int foundIdx;
+            VBoxFillVidModeInfo(&pModes->aModes[pModes->cModes], pAllocData->SurfDesc.width, pAllocData->SurfDesc.height, pAllocData->SurfDesc.bpp, 1/*index*/, 0);
+            if ((foundIdx=VBoxMPFindVideoMode(pModes->aModes, pModes->cModes, &pModes->aModes[pModes->cModes]))>=0)
+            {
+                pModes->iPreferredMode = foundIdx;
+            }
+            else
+            {
+                pModes->iPreferredMode = pModes->cModes;
+                ++pModes->cModes;
+            }
+
+#ifdef VBOX_WITH_8BPP_MODES
+            int bytesPerPixel=1;
+#else
+            int bytesPerPixel=2;
+#endif
+            for (; bytesPerPixel<=4; bytesPerPixel++)
+            {
+                int bpp = 8*bytesPerPixel;
+
+                if (bpp == pAllocData->SurfDesc.bpp)
+                    continue;
+
+                if (!VBoxMPValidateVideoModeParamsGuest(pExt, VidPnTargetId,
+                        pAllocData->SurfDesc.width, pAllocData->SurfDesc.height,
+                        bpp))
+                    continue;
+
+                if (pModes->cModes >= RT_ELEMENTS(pModes->aModes))
+                {
+                    WARN(("ran out of video modes 2"));
+                    break;
+                }
+
+                VBoxFillVidModeInfo(&pModes->aModes[pModes->cModes],
+                                        pAllocData->SurfDesc.width, pAllocData->SurfDesc.height,
+                                        bpp, pModes->cModes, 0);
+                if (VBoxMPFindVideoMode(pModes->aModes, pModes->cModes, &pModes->aModes[pModes->cModes]) < 0)
+                {
+                    ++pModes->cModes;
+                }
+            }
+        }
+        else
+        {
+            WARN(("ran out of video modes 1"));
+        }
+    }
+
     /* Check if there's a pending display change request for this adapter */
     VIDEO_MODE_INFORMATION specialMode;
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp	(revision 44148)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp	(revision 44149)
@@ -120,4 +120,8 @@
                 bSupported &= !!(pIf->modeData.wddm.pfnD3DKMTInvalidateActiveVidPn);
 
+                pIf->modeData.wddm.pfnD3DKMTPollDisplayChildren = (PFND3DKMT_POLLDISPLAYCHILDREN)GetProcAddress(hGdi32, "D3DKMTPollDisplayChildren");
+                Log((__FUNCTION__": pfnD3DKMTPollDisplayChildren = %p\n", pIf->modeData.wddm.pfnD3DKMTPollDisplayChildren));
+                bSupported &= !!(pIf->modeData.wddm.pfnD3DKMTPollDisplayChildren);
+
                 if (!bSupported)
                 {
@@ -953,21 +957,54 @@
 }
 
+typedef struct VBOXDISPIF_REINITMODES_OP
+{
+    VBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK EscData;
+} VBOXDISPIF_REINITMODES_OP, *PVBOXDISPIF_REINITMODES_OP;
+
+static DECLCALLBACK(BOOLEAN) vboxDispIfReninitModesWDDMOp(PCVBOXDISPIF pIf, D3DKMT_HANDLE hAdapter, DISPLAY_DEVICE *pDev, PVOID pContext)
+{
+    PVBOXDISPIF_REINITMODES_OP pData = (PVBOXDISPIF_REINITMODES_OP)pContext;
+    VBOXDISPIFWDDM_ESCAPEOP_CONTEXT Ctx = {0};
+    Ctx.pEscape = &pData->EscData.EscapeHdr;
+    Ctx.cbData = sizeof (pData->EscData) - sizeof (pData->EscData.EscapeHdr);
+//    Ctx.EscapeFlags.HardwareAccess = 0;
+    DWORD err = vboxDispIfWDDMAdapterOp(pIf, -1 /* iDisplay, -1 means primary */, vboxDispIfEscapeWDDMOp, &Ctx);
+    if (err == NO_ERROR)
+    {
+        if (!Ctx.Status)
+            err = NO_ERROR;
+        else
+        {
+            if (Ctx.Status == 0xC00000BBL) /* not supported */
+                err = ERROR_NOT_SUPPORTED;
+            else
+                err = ERROR_GEN_FAILURE;
+            Log((__FUNCTION__": pfnD3DKMTEscape failed, Status (0x%x)\n", Ctx.Status));
+        }
+    }
+    else
+        Log((__FUNCTION__": vboxDispIfWDDMAdapterOp failed, err (%d)\n", err));
+
+    D3DKMT_POLLDISPLAYCHILDREN PollData = {0};
+    PollData.hAdapter = hAdapter;
+    PollData.NonDestructiveOnly = 1;
+    NTSTATUS Status = pIf->modeData.wddm.pfnD3DKMTPollDisplayChildren(&PollData);
+    if (Status != 0)
+    {
+        Log((__FUNCTION__": pfnD3DKMTPollDisplayChildren failed, Status (0x%x)\n", Status));
+    }
+    return TRUE;
+}
+
 static DWORD vboxDispIfReninitModesWDDM(PCVBOXDISPIF const pIf, uint8_t *pScreenIdMask, BOOL fReconnectDisplaysOnChange)
 {
-    VBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK Data = {0};
-    Data.EscapeHdr.escapeCode = VBOXESC_REINITVIDEOMODESBYMASK;
+    VBOXDISPIF_REINITMODES_OP OpData = {0};
+    OpData.EscData.EscapeHdr.escapeCode = VBOXESC_REINITVIDEOMODESBYMASK;
     if (fReconnectDisplaysOnChange)
-        Data.EscapeHdr.u32CmdSpecific = VBOXWDDM_REINITVIDEOMODESBYMASK_F_RECONNECT_DISPLAYS_ON_CHANGE;
-
-    memcpy(Data.ScreenMask, pScreenIdMask, sizeof (Data.ScreenMask));
-
-    DWORD err = vboxDispIfEscapeWDDM(pIf, &Data.EscapeHdr, sizeof (Data) - sizeof (Data.EscapeHdr), fReconnectDisplaysOnChange ? FALSE /* hw access must be false here,
-                                                             * otherwise the miniport driver would fail
-                                                             * request to prevent a deadlock */
-                                                        : TRUE);
-    if (err != NO_ERROR)
-    {
-        Log((__FUNCTION__": VBoxDispIfEscape failed with err (%d)\n", err));
-    }
+        OpData.EscData.EscapeHdr.u32CmdSpecific = VBOXWDDM_REINITVIDEOMODESBYMASK_F_RECONNECT_DISPLAYS_ON_CHANGE;
+
+    memcpy(OpData.EscData.ScreenMask, pScreenIdMask, sizeof (OpData.EscData.ScreenMask));
+
+    DWORD err = vboxDispIfWDDMAdapterOp(pIf, -1 /* iDisplay, -1 means primary */, vboxDispIfReninitModesWDDMOp, &OpData);
     return err;
 }
@@ -1152,11 +1189,13 @@
         vboxDispIfReninitModesWDDM(pIf, ScreenMask, TRUE);
 
-        for (UINT i = 0; i < 4; ++i)
-        {
-            WaitForSingleObject(g_VBoxDispIfWddm.hResizeEvent, 500);
-            winEr = vboxDispIfWddmValidateFixResize(pIf, paDisplayDevices, paDeviceModes, cDevModes);
-            if (winEr == NO_ERROR)
-                break;
-        }
+        winEr = vboxDispIfWddmValidateFixResize(pIf, paDisplayDevices, paDeviceModes, cDevModes);
+
+//        for (UINT i = 0; i < 4; ++i)
+//        {
+//            WaitForSingleObject(g_VBoxDispIfWddm.hResizeEvent, 500);
+//            winEr = vboxDispIfWddmValidateFixResize(pIf, paDisplayDevices, paDeviceModes, cDevModes);
+//            if (winEr == NO_ERROR)
+//                break;
+//        }
 
         Assert(winEr == NO_ERROR);
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.h	(revision 44148)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.h	(revision 44149)
@@ -68,4 +68,5 @@
             /* auto resize support */
             PFND3DKMT_INVALIDATEACTIVEVIDPN pfnD3DKMTInvalidateActiveVidPn;
+            PFND3DKMT_POLLDISPLAYCHILDREN pfnD3DKMTPollDisplayChildren;
         } wddm;
 #endif
