Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp	(revision 30214)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp	(revision 30215)
@@ -863,12 +863,4 @@
     }
     return NULL;
-}
-
-static void vboxWddmRectUnited(RECT *pR, const RECT *pR2Unite)
-{
-    pR->left = RT_MIN(pR->left, pR2Unite->left);
-    pR->top = RT_MIN(pR->top, pR2Unite->top);
-    pR->right = RT_MAX(pR->right, pR2Unite->right);
-    pR->bottom = RT_MAX(pR->bottom, pR2Unite->bottom);
 }
 
@@ -2382,4 +2374,6 @@
         if (hr == S_OK)
         {
+            Assert(!pAlloc->LockInfo.cLocks);
+
             uintptr_t offset;
             if (pData->Flags.AreaValid)
@@ -2400,4 +2394,16 @@
             {
                 offset = 0;
+            }
+
+            if (!pData->Flags.ReadOnly)
+            {
+                if (pData->Flags.AreaValid)
+                    vboxWddmDirtyRegionAddRect(&pAlloc->DirtyRegion, &pData->Area);
+                else
+                {
+                    Assert(!pData->Flags.RangeValid);
+                    Assert(!pData->Flags.BoxValid);
+                    vboxWddmDirtyRegionAddRect(&pAlloc->DirtyRegion, NULL); /* <- NULL means the entire surface */
+                }
             }
 
@@ -2412,4 +2418,7 @@
             pData->Pitch = pAlloc->SurfDesc.pitch;
             pData->SlicePitch = pAlloc->SurfDesc.slicePitch;
+
+            Assert(hr == S_OK);
+            ++pAlloc->LockInfo.cLocks;
         }
     }
@@ -2513,10 +2522,18 @@
         } UnlockData;
 
+        PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];
+
         UnlockData.Unlock.NumAllocations = 1;
         UnlockData.Unlock.phAllocations = &UnlockData.hAllocation;
-        UnlockData.hAllocation = pRc->aAllocations[pData->SubResourceIndex].hAllocation;
+        UnlockData.hAllocation = pAlloc->hAllocation;
 
         hr = pDevice->RtCallbacks.pfnUnlockCb(pDevice->hDevice, &UnlockData.Unlock);
         Assert(hr == S_OK);
+        if (hr == S_OK)
+        {
+            Assert(pAlloc->LockInfo.cLocks);
+            --pAlloc->LockInfo.cLocks;
+            Assert(pAlloc->LockInfo.cLocks < UINT32_MAX);
+        }
     }
 
@@ -3567,17 +3584,113 @@
     return S_OK;
 }
+
+AssertCompile(sizeof (RECT) == sizeof (D3DDDIRECT));
+AssertCompile(RT_SIZEOFMEMB(RECT, left) == RT_SIZEOFMEMB(D3DDDIRECT, left));
+AssertCompile(RT_SIZEOFMEMB(RECT, right) == RT_SIZEOFMEMB(D3DDDIRECT, right));
+AssertCompile(RT_SIZEOFMEMB(RECT, top) == RT_SIZEOFMEMB(D3DDDIRECT, top));
+AssertCompile(RT_SIZEOFMEMB(RECT, bottom) == RT_SIZEOFMEMB(D3DDDIRECT, bottom));
+AssertCompile(RT_OFFSETOF(RECT, left) == RT_OFFSETOF(D3DDDIRECT, left));
+AssertCompile(RT_OFFSETOF(RECT, right) == RT_OFFSETOF(D3DDDIRECT, right));
+AssertCompile(RT_OFFSETOF(RECT, top) == RT_OFFSETOF(D3DDDIRECT, top));
+AssertCompile(RT_OFFSETOF(RECT, bottom) == RT_OFFSETOF(D3DDDIRECT, bottom));
+
 static HRESULT APIENTRY vboxWddmDDevCreateOverlay(HANDLE hDevice, D3DDDIARG_CREATEOVERLAY* pData)
 {
-    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
-    AssertBreakpoint();
-    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
-    return E_FAIL;
+    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
+    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
+    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->OverlayInfo.hResource;
+    Assert(pRc);
+    Assert(pRc->cAllocations > pData->OverlayInfo.SubResourceIndex);
+    PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->OverlayInfo.SubResourceIndex];
+    HRESULT hr = S_OK;
+    PVBOXWDDMDISP_OVERLAY pOverlay = (PVBOXWDDMDISP_OVERLAY)RTMemAllocZ(sizeof (VBOXWDDMDISP_OVERLAY));
+    Assert(pOverlay);
+    if (pOverlay)
+    {
+        VBOXWDDM_OVERLAY_INFO OurInfo;
+        OurInfo.OverlayDesc.DstColorKeyLow = pData->OverlayInfo.DstColorKeyLow;
+        OurInfo.OverlayDesc.DstColorKeyHigh = pData->OverlayInfo.DstColorKeyHigh;
+        OurInfo.OverlayDesc.SrcColorKeyLow = pData->OverlayInfo.SrcColorKeyLow;
+        OurInfo.OverlayDesc.SrcColorKeyHigh = pData->OverlayInfo.SrcColorKeyHigh;
+        OurInfo.OverlayDesc.fFlags = pData->OverlayInfo.Flags.Value;
+        vboxWddmDirtyRegionClear(&OurInfo.DirtyRegion);
+        Assert(!pAlloc->LockInfo.cLocks);
+        vboxWddmDirtyRegionUnite(&OurInfo.DirtyRegion, &pAlloc->DirtyRegion);
+        D3DDDICB_CREATEOVERLAY OverInfo;
+        OverInfo.VidPnSourceId = pData->VidPnSourceId;
+        OverInfo.OverlayInfo.hAllocation = pAlloc->hAllocation;
+        OverInfo.OverlayInfo.DstRect = *(D3DDDIRECT*)((void*)&pData->OverlayInfo.DstRect);
+        OverInfo.OverlayInfo.SrcRect = *(D3DDDIRECT*)((void*)&pData->OverlayInfo.SrcRect);
+        OverInfo.OverlayInfo.pPrivateDriverData = &OurInfo;
+        OverInfo.OverlayInfo.PrivateDriverDataSize = sizeof (OurInfo);
+        OverInfo.hKernelOverlay = NULL; /* <-- out */
+        hr = pDevice->RtCallbacks.pfnCreateOverlayCb(pDevice->hDevice, &OverInfo);
+        Assert(hr == S_OK);
+        if (hr == S_OK)
+        {
+            Assert(OverInfo.hKernelOverlay);
+            pOverlay->hOverlay = OverInfo.hKernelOverlay;
+            pOverlay->VidPnSourceId = pData->VidPnSourceId;
+
+            Assert(!pAlloc->LockInfo.cLocks);
+            if (!pAlloc->LockInfo.cLocks)
+            {
+                /* we have reported the dirty rect, may clear it if no locks are pending currently */
+                vboxWddmDirtyRegionClear(&pAlloc->DirtyRegion);
+            }
+
+            pData->hOverlay = pOverlay;
+        }
+        else
+        {
+            RTMemFree(pOverlay);
+        }
+    }
+    else
+        hr = E_OUTOFMEMORY;
+
+    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
+    return hr;
 }
 static HRESULT APIENTRY vboxWddmDDevUpdateOverlay(HANDLE hDevice, CONST D3DDDIARG_UPDATEOVERLAY* pData)
 {
-    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
-    AssertBreakpoint();
-    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
-    return E_FAIL;
+    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
+    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
+    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->OverlayInfo.hResource;
+    Assert(pRc);
+    Assert(pRc->cAllocations > pData->OverlayInfo.SubResourceIndex);
+    PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->OverlayInfo.SubResourceIndex];
+    HRESULT hr = S_OK;
+    PVBOXWDDMDISP_OVERLAY pOverlay = (PVBOXWDDMDISP_OVERLAY)pData->hOverlay;
+    VBOXWDDM_OVERLAY_INFO OurInfo;
+    OurInfo.OverlayDesc.DstColorKeyLow = pData->OverlayInfo.DstColorKeyLow;
+    OurInfo.OverlayDesc.DstColorKeyHigh = pData->OverlayInfo.DstColorKeyHigh;
+    OurInfo.OverlayDesc.SrcColorKeyLow = pData->OverlayInfo.SrcColorKeyLow;
+    OurInfo.OverlayDesc.SrcColorKeyHigh = pData->OverlayInfo.SrcColorKeyHigh;
+    OurInfo.OverlayDesc.fFlags = pData->OverlayInfo.Flags.Value;
+    vboxWddmDirtyRegionClear(&OurInfo.DirtyRegion);
+    Assert(!pAlloc->LockInfo.cLocks);
+    vboxWddmDirtyRegionUnite(&OurInfo.DirtyRegion, &pAlloc->DirtyRegion);
+    D3DDDICB_UPDATEOVERLAY OverInfo;
+    OverInfo.hKernelOverlay = pOverlay->hOverlay;
+    OverInfo.OverlayInfo.hAllocation = pAlloc->hAllocation;
+    OverInfo.OverlayInfo.DstRect = *(D3DDDIRECT*)((void*)&pData->OverlayInfo.DstRect);
+    OverInfo.OverlayInfo.SrcRect = *(D3DDDIRECT*)((void*)&pData->OverlayInfo.SrcRect);
+    OverInfo.OverlayInfo.pPrivateDriverData = &OurInfo;
+    OverInfo.OverlayInfo.PrivateDriverDataSize = sizeof (OurInfo);
+    hr = pDevice->RtCallbacks.pfnUpdateOverlayCb(pDevice->hDevice, &OverInfo);
+    Assert(hr == S_OK);
+    if (hr == S_OK)
+    {
+        Assert(!pAlloc->LockInfo.cLocks);
+        if (!pAlloc->LockInfo.cLocks)
+        {
+            /* we have reported the dirty rect, may clear it if no locks are pending currently */
+            vboxWddmDirtyRegionClear(&pAlloc->DirtyRegion);
+        }
+    }
+
+    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
+    return hr;
 }
 static HRESULT APIENTRY vboxWddmDDevFlipOverlay(HANDLE hDevice, CONST D3DDDIARG_FLIPOVERLAY* pData)
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h	(revision 30214)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h	(revision 30215)
@@ -121,4 +121,5 @@
     IUnknown *pD3DIf;
     VBOXWDDMDISP_LOCKINFO LockInfo;
+    VBOXWDDM_DIRTYREGION DirtyRegion; /* <- dirty region to notify host about */
     VBOXWDDM_SURFACE_DESC SurfDesc;
 } VBOXWDDMDISP_ALLOCATION, *PVBOXWDDMDISP_ALLOCATION;
@@ -141,4 +142,11 @@
 } VBOXWDDMDISP_TSS_LOOKUP;
 
+typedef struct VBOXWDDMDISP_OVERLAY
+{
+    D3DKMT_HANDLE hOverlay;
+    D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
+    PVBOXWDDMDISP_RESOURCE *pResource;
+} VBOXWDDMDISP_OVERLAY, *PVBOXWDDMDISP_OVERLAY;
+
 #define VBOXDISPMODE_IS_3D(_p) (!!((_p)->pD3D9If))
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h	(revision 30214)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h	(revision 30215)
@@ -108,4 +108,44 @@
 } VBOXVHWA_INFO;
 
+#define VBOXWDDM_OVERLAY_F_CKEY_DST      0x00000001
+#define VBOXWDDM_OVERLAY_F_CKEY_DSTRANGE 0x00000002
+#define VBOXWDDM_OVERLAY_F_CKEY_SRC      0x00000004
+#define VBOXWDDM_OVERLAY_F_CKEY_SRCRANGE 0x00000008
+#define VBOXWDDM_OVERLAY_F_BOB           0x00000010
+#define VBOXWDDM_OVERLAY_F_INTERLEAVED   0x00000020
+#define VBOXWDDM_OVERLAY_F_MIRROR_LR     0x00000040
+#define VBOXWDDM_OVERLAY_F_MIRROR_UD     0x00000080
+#define VBOXWDDM_OVERLAY_F_DEINTERLACED  0x00000100
+
+typedef struct VBOXWDDM_OVERLAY_DESC
+{
+    uint32_t fFlags;
+    UINT DstColorKeyLow;
+    UINT DstColorKeyHigh;
+    UINT SrcColorKeyLow;
+    UINT SrcColorKeyHigh;
+} VBOXWDDM_OVERLAY_DESC, *PVBOXWDDM_OVERLAY_DESC;
+
+/* the dirty rect info is valid */
+#define VBOXWDDM_DIRTYREGION_F_VALID      0x00000001
+#define VBOXWDDM_DIRTYREGION_F_RECT_VALID 0x00000002
+
+typedef struct VBOXWDDM_DIRTYREGION
+{
+    uint32_t fFlags; /* <-- see VBOXWDDM_DIRTYREGION_F_xxx flags above */
+    RECT Rect;
+} VBOXWDDM_DIRTYREGION, *PVBOXWDDM_DIRTYREGION;
+
+typedef struct VBOXWDDM_OVERLAY_INFO
+{
+    VBOXWDDM_OVERLAY_DESC OverlayDesc;
+    VBOXWDDM_DIRTYREGION DirtyRegion; /* <- the dirty region of the overlay surface */
+} VBOXWDDM_OVERLAY_INFO, *PVBOXWDDM_OVERLAY_INFO;
+
+typedef struct VBOXWDDM_OVERLAYFLIP_INFO
+{
+    VBOXWDDM_DIRTYREGION DirtyRegion; /* <- the dirty region of the overlay surface */
+} VBOXWDDM_OVERLAYFLIP_INFO, *PVBOXWDDM_OVERLAYFLIP_INFO;
+
 /* query info func */
 typedef struct VBOXWDDM_QI
@@ -195,3 +235,47 @@
 }
 
+DECLINLINE(void) vboxWddmRectUnite(RECT *pR, const RECT *pR2Unite)
+{
+    pR->left = RT_MIN(pR->left, pR2Unite->left);
+    pR->top = RT_MIN(pR->top, pR2Unite->top);
+    pR->right = RT_MAX(pR->right, pR2Unite->right);
+    pR->bottom = RT_MAX(pR->bottom, pR2Unite->bottom);
+}
+
+DECLINLINE(void) vboxWddmDirtyRegionAddRect(PVBOXWDDM_DIRTYREGION pInfo, const RECT *pRect)
+{
+    if (!(pInfo->fFlags & VBOXWDDM_DIRTYREGION_F_VALID))
+    {
+        pInfo->fFlags = VBOXWDDM_DIRTYREGION_F_VALID;
+        if (pRect)
+        {
+            pInfo->fFlags |= VBOXWDDM_DIRTYREGION_F_RECT_VALID;
+            pInfo->Rect = *pRect;
+        }
+    }
+    else if (!!(pInfo->fFlags & VBOXWDDM_DIRTYREGION_F_RECT_VALID))
+    {
+        if (pRect)
+            vboxWddmRectUnite(&pInfo->Rect, pRect);
+        else
+            pInfo->fFlags &= ~VBOXWDDM_DIRTYREGION_F_RECT_VALID;
+    }
+}
+
+DECLINLINE(void) vboxWddmDirtyRegionUnite(PVBOXWDDM_DIRTYREGION pInfo, const PVBOXWDDM_DIRTYREGION pInfo2)
+{
+    if (pInfo2->fFlags & VBOXWDDM_DIRTYREGION_F_VALID)
+    {
+        if (pInfo2->fFlags & VBOXWDDM_DIRTYREGION_F_RECT_VALID)
+            vboxWddmDirtyRegionAddRect(pInfo, &pInfo2->Rect);
+        else
+            vboxWddmDirtyRegionAddRect(pInfo, NULL);
+    }
+}
+
+DECLINLINE(void) vboxWddmDirtyRegionClear(PVBOXWDDM_DIRTYREGION pInfo)
+{
+    pInfo->fFlags = 0;
+}
+
 #endif /* #ifndef ___VBoxVideoIf_h___ */
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp	(revision 30214)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp	(revision 30215)
@@ -335,5 +335,5 @@
 static void vboxVHWAInitSrc(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
 {
-    Assert(srcId < pDevExt->u.primary.cDisplays);
+    Assert(srcId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)pDevExt->u.primary.cDisplays);
     VBOXVHWA_INFO *pSettings = &pDevExt->aSources[srcId].Vhwa.Settings;
     memset (pSettings, 0, sizeof (VBOXVHWA_INFO));
@@ -408,5 +408,5 @@
     /* we do not allocate/map anything, just issue a Disable command
      * to ensure all pending commands are flushed */
-    for (uint32_t i = 0; i < pDevExt->u.primary.cDisplays; ++i)
+    for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
     {
         vboxVHWADisable(pDevExt, i);
@@ -660,5 +660,5 @@
 int vboxVhwaHlpGetSurfInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf)
 {
-    for (uint32_t i = 0; i < pDevExt->u.primary.cDisplays; ++i)
+    for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
     {
         PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i];
@@ -708,6 +708,6 @@
 int vboxVhwaHlpCheckInit(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
 {
-    Assert(VidPnSourceId < pDevExt->u.primary.cDisplays);
-    if (VidPnSourceId >= pDevExt->u.primary.cDisplays)
+    Assert(VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)pDevExt->u.primary.cDisplays);
+    if (VidPnSourceId >= (D3DDDI_VIDEO_PRESENT_SOURCE_ID)pDevExt->u.primary.cDisplays)
         return VERR_INVALID_PARAMETER;
 
@@ -748,6 +748,6 @@
 int vboxVhwaHlpCheckTerm(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
 {
-    Assert(VidPnSourceId < pDevExt->u.primary.cDisplays);
-    if (VidPnSourceId >= pDevExt->u.primary.cDisplays)
+    Assert(VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)pDevExt->u.primary.cDisplays);
+    if (VidPnSourceId >= (D3DDDI_VIDEO_PRESENT_SOURCE_ID)pDevExt->u.primary.cDisplays)
         return VERR_INVALID_PARAMETER;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 30214)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 30215)
@@ -1042,5 +1042,5 @@
     dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", MiniportDeviceContext));
     Assert(ChildRelationsSize == (pDevExt->u.primary.cDisplays + 1)*sizeof(DXGK_CHILD_DESCRIPTOR));
-    for (UINT i = 0; i < pDevExt->u.primary.cDisplays; ++i)
+    for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
     {
         ChildRelations[i].ChildDeviceType = TypeVideoOutput;
@@ -1232,5 +1232,5 @@
             pCaps->MaxOverlays = 0;
 #ifdef VBOX_WITH_VIDEOHWACCEL
-            for (uint32_t i = 0; i < pContext->u.primary.cDisplays; ++i)
+            for (int i = 0; i < pContext->u.primary.cDisplays; ++i)
             {
                 if ( pContext->aSources[i].Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED)
@@ -1323,5 +1323,5 @@
                 pQi->cInfos = pContext->u.primary.cDisplays;
 #ifdef VBOX_WITH_VIDEOHWACCEL
-                for (uint32_t i = 0; i < pContext->u.primary.cDisplays; ++i)
+                for (int i = 0; i < pContext->u.primary.cDisplays; ++i)
                 {
                     pQi->aInfos[i] = pContext->aSources[i].Vhwa.Settings;
@@ -2644,5 +2644,5 @@
             if (Status == STATUS_SUCCESS && bSupported)
             {
-                for (UINT id = 0; id < pContext->u.primary.cDisplays; ++id)
+                for (int id = 0; id < pContext->u.primary.cDisplays; ++id)
                 {
                     D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet;
@@ -2675,5 +2675,5 @@
                 if (Status == STATUS_SUCCESS && bSupported)
                 {
-                    for (UINT id = 0; id < pContext->u.primary.cDisplays; ++id)
+                    for (int id = 0; id < pContext->u.primary.cDisplays; ++id)
                     {
                         D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet;
@@ -2785,5 +2785,5 @@
     if (Status == STATUS_SUCCESS)
     {
-        for (uint32_t i = 0; i < pDevExt->u.primary.cDisplays; ++i)
+        for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
         {
             Status = vboxVidPnCheckAddMonitorModes(pDevExt, i, D3DKMDT_MCO_DRIVER, &Resolution, 1, 0);
@@ -2902,6 +2902,6 @@
     NTSTATUS Status = STATUS_SUCCESS;
     PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
-    Assert(pDevExt->u.primary.cDisplays > pSetVidPnSourceAddress->VidPnSourceId);
-    if (pDevExt->u.primary.cDisplays > pSetVidPnSourceAddress->VidPnSourceId)
+    Assert((UINT)pDevExt->u.primary.cDisplays > pSetVidPnSourceAddress->VidPnSourceId);
+    if ((UINT)pDevExt->u.primary.cDisplays > pSetVidPnSourceAddress->VidPnSourceId)
     {
         PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pSetVidPnSourceAddress->VidPnSourceId];
@@ -2970,6 +2970,6 @@
     NTSTATUS Status = STATUS_SUCCESS;
     PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
-    Assert(pDevExt->u.primary.cDisplays > pSetVidPnSourceVisibility->VidPnSourceId);
-    if (pDevExt->u.primary.cDisplays > pSetVidPnSourceVisibility->VidPnSourceId)
+    Assert((UINT)pDevExt->u.primary.cDisplays > pSetVidPnSourceVisibility->VidPnSourceId);
+    if ((UINT)pDevExt->u.primary.cDisplays > pSetVidPnSourceVisibility->VidPnSourceId)
     {
         PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pSetVidPnSourceVisibility->VidPnSourceId];
@@ -3036,5 +3036,5 @@
         {
             /* clear all current primaries */
-            for (UINT i = 0; i < pDevExt->u.primary.cDisplays; ++i)
+            for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
             {
                 vboxWddmAssignPrimary(pDevExt, &pDevExt->aSources[i], NULL, i);
@@ -3183,5 +3183,5 @@
     PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
 
-    Assert(pDevExt->u.primary.cDisplays > pGetScanLine->VidPnTargetId);
+    Assert((UINT)pDevExt->u.primary.cDisplays > pGetScanLine->VidPnTargetId);
     VBOXWDDM_TARGET *pTarget = &pDevExt->aTargets[pGetScanLine->VidPnTargetId];
     Assert(pTarget->HeightTotal);
@@ -3192,5 +3192,4 @@
     {
         uint32_t curScanLine = pTarget->ScanLineState;
-        BOOLEAN bVBlanck;
         ++pTarget->ScanLineState;
         if (pTarget->ScanLineState >= pTarget->HeightTotal)
@@ -3458,5 +3457,5 @@
 
     D3DDDI_VIDEO_PRESENT_SOURCE_ID id = pAllocation->SurfDesc.VidPnSourceId;
-    if (id >=  pDevExt->u.primary.cDisplays)
+    if (id >= (D3DDDI_VIDEO_PRESENT_SOURCE_ID)pDevExt->u.primary.cDisplays)
         return false;
 
