Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp	(revision 29927)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp	(revision 29928)
@@ -556,5 +556,5 @@
     {
         /* should be set by host */
-        Assert(pInfo->flags & VBOXVHWA_SD_PITCH);
+//        Assert(pInfo->flags & VBOXVHWA_SD_PITCH);
         pSurf->SurfDesc.cbSize = pInfo->sizeX * pInfo->sizeY;
         Assert(pSurf->SurfDesc.cbSize);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 29927)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 29928)
@@ -36,4 +36,13 @@
 {
     ExFreePool(pvMem);
+}
+
+DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromOpenData(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OPENALLOCATION pOa)
+{
+    DXGKARGCB_GETHANDLEDATA GhData;
+    GhData.hObject = pOa->hAllocation;
+    GhData.Type = DXGK_HANDLE_ALLOCATION;
+    GhData.Flags.Value = 0;
+    return (PVBOXWDDM_ALLOCATION)pDevExt->u.primary.DxgkInterface.DxgkCbGetHandleData(&GhData);
 }
 
@@ -1524,5 +1533,5 @@
                                 if (RT_SUCCESS(rc))
                                 {
-                                    pAllocInfo->SurfDesc = pAllocation->SurfDesc;
+                                    pAllocationInfo->Size = pAllocation->SurfDesc.cbSize;
                                 }
                                 else
@@ -3261,13 +3270,69 @@
 
     NTSTATUS Status = STATUS_SUCCESS;
-
-    for (UINT i = 0; i < pOpenAllocation->NumAllocations; ++i)
-    {
-        DXGK_OPENALLOCATIONINFO* pInfo = &pOpenAllocation->pOpenAllocation[i];
-        PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));
-        pOa->hAllocation = pInfo->hAllocation;
-        pInfo->hDeviceSpecificAllocation = pOa;
-    }
-
+    PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)hDevice;
+    PDEVICE_EXTENSION pDevExt = pDevice->pAdapter;
+    PVBOXWDDM_RCINFO pRcInfo = NULL;
+    if (pOpenAllocation->PrivateDriverSize)
+    {
+        Assert(pOpenAllocation->PrivateDriverSize == sizeof (VBOXWDDM_RCINFO));
+        Assert(pOpenAllocation->pPrivateDriverData);
+        if (pOpenAllocation->PrivateDriverSize >= sizeof (VBOXWDDM_RCINFO))
+        {
+            pRcInfo = (PVBOXWDDM_RCINFO)pOpenAllocation->pPrivateDriverData;
+            Assert(pRcInfo->cAllocInfos == pOpenAllocation->NumAllocations);
+        }
+        else
+            Status = STATUS_INVALID_PARAMETER;
+    }
+
+    if (Status == STATUS_SUCCESS)
+    {
+        for (UINT i = 0; i < pOpenAllocation->NumAllocations; ++i)
+        {
+            DXGK_OPENALLOCATIONINFO* pInfo = &pOpenAllocation->pOpenAllocation[i];
+            Assert(pInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO));
+            Assert(pInfo->pPrivateDriverData);
+            PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));
+            pOa->hAllocation = pInfo->hAllocation;
+            pInfo->hDeviceSpecificAllocation = pOa;
+
+            if (pRcInfo)
+            {
+#ifdef VBOX_WITH_VIDEOHWACCEL
+                if (pRcInfo->RcDesc.fFlags.Overlay)
+                {
+                    if (pInfo->PrivateDriverDataSize >= sizeof (VBOXWDDM_ALLOCINFO))
+                    {
+                        PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData;
+                        PVBOXWDDM_ALLOCATION pAllocation = vboxWddmGetAllocationFromOpenData(pDevExt, pOa);
+                        Assert(pAllocation);
+                        if (pAllocation)
+                        {
+                            /* we have queried host for some surface info, like pitch & size,
+                             * need to return it back to the UMD (User Mode Drive) */
+                            pAllocInfo->SurfDesc = pAllocation->SurfDesc;
+                            /* success, just contionue */
+                            continue;
+                        }
+                        else
+                            Status = STATUS_INVALID_PARAMETER;
+                    }
+                    else
+                        Status = STATUS_INVALID_PARAMETER;
+
+                    /* we are here in case of error */
+                    AssertBreakpoint();
+
+                    for (UINT j = 0; j < i; ++j)
+                    {
+                        DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j];
+                        PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation;
+                        vboxWddmMemFree(pOa2Free);
+                    }
+                }
+#endif
+            }
+        }
+    }
     dfprintf(("<== "__FUNCTION__ ", hDevice(0x%x)\n", hDevice));
 
@@ -3315,13 +3380,4 @@
 #define VBOXVDMACMD_DMA_PRESENT_BLT_MINSIZE() (VBOXVDMACMD_SIZE(VBOXVDMACMD_DMA_PRESENT_BLT))
 #define VBOXVDMACMD_DMA_PRESENT_BLT_SIZE(_c) (VBOXVDMACMD_BODY_FIELD_OFFSET(UINT, VBOXVDMACMD_DMA_PRESENT_BLT, aDstSubRects[_c]))
-
-DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromOpenData(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OPENALLOCATION pOa)
-{
-    DXGKARGCB_GETHANDLEDATA GhData;
-    GhData.hObject = pOa->hAllocation;
-    GhData.Type = DXGK_HANDLE_ALLOCATION;
-    GhData.Flags.Value = 0;
-    return (PVBOXWDDM_ALLOCATION)pDevExt->u.primary.DxgkInterface.DxgkCbGetHandleData(&GhData);
-}
 
 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromAllocList(PDEVICE_EXTENSION pDevExt, DXGK_ALLOCATIONLIST *pAllocList)
