VBoxDispIf.cpp revision 635c83753ed04cf3637e019af0e15ba40e07f2fe
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * VBoxTray - Display Settings Interface abstraction for XPDM & WDDM
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Copyright (C) 2006-2012 Oracle Corporation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * available from http://www.virtualbox.org. This file is free software;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * you can redistribute it and/or modify it under the terms of the GNU
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * General Public License (GPL) as published by the Free Software
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncDWORD EnableAndResizeDispDev(DEVMODE *paDeviceModes, DISPLAY_DEVICE *paDisplayDevices, DWORD totalDispNum, UINT Id, DWORD aWidth, DWORD aHeight,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync DWORD aBitsPerPixel, DWORD aPosX, DWORD aPosY, BOOL fEnabled, BOOL fExtDispSup);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncstatic DWORD vboxDispIfWddmResizeDisplay(PCVBOXDISPIF const pIf, UINT Id, BOOL fEnable, DISPLAY_DEVICE * paDisplayDevices, DEVMODE *paDeviceMode, UINT devModes);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncstatic DWORD vboxDispIfResizePerform(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncstatic DWORD vboxDispIfWddmEnableDisplaysTryingTopology(PCVBOXDISPIF const pIf, UINT cIds, UINT *pIds, BOOL fEnable);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncstatic DWORD vboxDispIfResizeStartedWDDMOp(VBOXDISPIF_OP *pOp);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync/* APIs specific to win7 and above WDDM architecture. Not available for Vista WDDM.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * This is the reason they have not been put in the VBOXDISPIF struct in VBoxDispIf.h
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync LONG (WINAPI * pfnSetDisplayConfig)(UINT numPathArrayElements,DISPLAYCONFIG_PATH_INFO *pathArray,UINT numModeInfoArrayElements,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync DISPLAYCONFIG_MODE_INFO *modeInfoArray, UINT Flags);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync LONG (WINAPI * pfnQueryDisplayConfig)(UINT Flags,UINT *pNumPathArrayElements, DISPLAYCONFIG_PATH_INFO *pPathInfoArray,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync UINT *pNumModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO *pModeInfoArray,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync LONG (WINAPI * pfnGetDisplayConfigBufferSizes)(UINT Flags, UINT *pNumPathArrayElements, UINT *pNumModeInfoArrayElements);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncstatic DWORD vboxDispIfWddmDcCreate(VBOXDISPIF_WDDM_DISPCFG *pCfg, UINT32 fFlags)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync DWORD winEr = gCtx.pfnGetDisplayConfigBufferSizes(fFlags, &cPathInfoArray, &cModeInfoArray);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) Failed GetDisplayConfigBufferSizes\n"));
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync pPathInfoArray = (DISPLAYCONFIG_PATH_INFO *)malloc(cPathInfoArray * sizeof(DISPLAYCONFIG_PATH_INFO));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pModeInfoArray = (DISPLAYCONFIG_MODE_INFO *)malloc(cModeInfoArray * sizeof(DISPLAYCONFIG_MODE_INFO));
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync winEr = gCtx.pfnQueryDisplayConfig(fFlags, &cPathInfoArray, pPathInfoArray, &cModeInfoArray, pModeInfoArray, NULL);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) Failed QueryDisplayConfig\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic DWORD vboxDispIfWddmDcClone(VBOXDISPIF_WDDM_DISPCFG *pCfg, VBOXDISPIF_WDDM_DISPCFG *pCfgDst)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfgDst->pPathInfoArray = (DISPLAYCONFIG_PATH_INFO *)malloc(pCfg->cPathInfoArray * sizeof (DISPLAYCONFIG_PATH_INFO));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync memcpy(pCfgDst->pPathInfoArray, pCfg->pPathInfoArray, pCfg->cPathInfoArray * sizeof (DISPLAYCONFIG_PATH_INFO));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfgDst->pModeInfoArray = (DISPLAYCONFIG_MODE_INFO *)malloc(pCfg->cModeInfoArray * sizeof (DISPLAYCONFIG_MODE_INFO));
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync memcpy(pCfgDst->pModeInfoArray, pCfg->pModeInfoArray, pCfg->cModeInfoArray * sizeof (DISPLAYCONFIG_MODE_INFO));
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsyncstatic VOID vboxDispIfWddmDcTerm(VBOXDISPIF_WDDM_DISPCFG *pCfg)
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync /* sanity */
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsyncstatic DWORD vboxDispIfWddmDcQueryNumDisplays(UINT32 *pcDisplays)
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync DWORD winEr = vboxDispIfWddmDcCreate(&DispCfg, QDC_ALL_PATHS);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync WARN(("VBoxTray:(WDDM) vboxDispIfWddmDcCreate Failed winEr %d\n", winEr));
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync for (UINT iter = 0; iter < DispCfg.cPathInfoArray; ++iter)
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync if (cDisplays < (int)(DispCfg.pPathInfoArray[iter].sourceInfo.id))
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync cDisplays = (int)(DispCfg.pPathInfoArray[iter].sourceInfo.id);
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsyncstatic int vboxDispIfWddmDcSearchPath(VBOXDISPIF_WDDM_DISPCFG *pCfg, UINT srcId, UINT trgId)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync for (UINT iter = 0; iter < pCfg->cPathInfoArray; ++iter)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if ((srcId == ~0UL || pCfg->pPathInfoArray[iter].sourceInfo.id == srcId)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync && (trgId == ~0UL || pCfg->pPathInfoArray[iter].targetInfo.id == trgId))
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return (int)iter;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsyncstatic int vboxDispIfWddmDcSearchActivePath(VBOXDISPIF_WDDM_DISPCFG *pCfg, UINT srcId, UINT trgId)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync int idx = vboxDispIfWddmDcSearchPath(pCfg, srcId, trgId);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (!(pCfg->pPathInfoArray[idx].flags & DISPLAYCONFIG_PATH_ACTIVE))
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncstatic VOID vboxDispIfWddmDcSettingsInvalidateModeIndex(VBOXDISPIF_WDDM_DISPCFG *pCfg, int idx)
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync pCfg->pPathInfoArray[idx].sourceInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pCfg->pPathInfoArray[idx].targetInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncstatic VOID vboxDispIfWddmDcSettingsInvalidateModeIndeces(VBOXDISPIF_WDDM_DISPCFG *pCfg)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync for (UINT iter = 0; iter < pCfg->cPathInfoArray; ++iter)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync vboxDispIfWddmDcSettingsInvalidateModeIndex(pCfg, (int)iter);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncstatic DWORD vboxDispIfWddmDcSettingsModeAdd(VBOXDISPIF_WDDM_DISPCFG *pCfg, UINT *pIdx)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync DISPLAYCONFIG_MODE_INFO *pModeInfoArray = (DISPLAYCONFIG_MODE_INFO *)malloc(cModeInfoArray * sizeof (DISPLAYCONFIG_MODE_INFO));
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync memcpy (pModeInfoArray, pCfg->pModeInfoArray, pCfg->cModeInfoArray * sizeof(DISPLAYCONFIG_MODE_INFO));
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync memset(&pModeInfoArray[cModeInfoArray-1], 0, sizeof (pModeInfoArray[0]));
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncstatic DWORD vboxDispIfWddmDcSettingsUpdate(VBOXDISPIF_WDDM_DISPCFG *pCfg, int idx, DEVMODE *pDeviceMode, BOOL fInvalidateSrcMode, BOOL fEnable)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pCfg->pPathInfoArray[idx].sourceInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync UINT iSrcMode = pCfg->pPathInfoArray[idx].sourceInfo.modeInfoIdx;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (iSrcMode == DISPLAYCONFIG_PATH_MODE_IDX_INVALID)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync WARN(("VBoxTray: (WDDM) no source mode index specified"));
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync DWORD winEr = vboxDispIfWddmDcSettingsModeAdd(pCfg, &iSrcMode);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync WARN(("VBoxTray:(WDDM) vboxDispIfWddmDcSettingsModeAdd Failed winEr %d\n", winEr));
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pCfg->pPathInfoArray[idx].sourceInfo.modeInfoIdx = iSrcMode;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync for (int i = 0; i < (int)pCfg->cPathInfoArray; ++i)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pCfg->pPathInfoArray[i].sourceInfo.modeInfoIdx == iSrcMode)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* this is something we're not expecting/supporting */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) multiple paths have the same mode index"));
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.width = pDeviceMode->dmPelsWidth;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.height = pDeviceMode->dmPelsHeight;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.position.x = pDeviceMode->dmPosition.x;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.position.y = pDeviceMode->dmPosition.y;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.pixelFormat = DISPLAYCONFIG_PIXELFORMAT_24BPP;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.pixelFormat = DISPLAYCONFIG_PIXELFORMAT_16BPP;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.pixelFormat = DISPLAYCONFIG_PIXELFORMAT_8BPP;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync LogRel(("VBoxTray: (WDDM) invalid bpp %d, using 32\n", pDeviceMode->dmBitsPerPel));
32e575e61406701e77c0527bfc843fdc85c4003fvboxsync pCfg->pModeInfoArray[iSrcMode].sourceMode.pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfg->pPathInfoArray[idx].targetInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pCfg->pPathInfoArray[idx].flags |= DISPLAYCONFIG_PATH_ACTIVE;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pCfg->pPathInfoArray[idx].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic DWORD vboxDispIfWddmDcSet(VBOXDISPIF_WDDM_DISPCFG *pCfg, UINT fFlags)
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync DWORD winEr = gCtx.pfnSetDisplayConfig(pCfg->cPathInfoArray, pCfg->pPathInfoArray, pCfg->cModeInfoArray, pCfg->pModeInfoArray, fFlags);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync Log(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed for Flags 0x%x\n", fFlags));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic BOOL vboxDispIfWddmDcSettingsAdjustSupportedPaths(VBOXDISPIF_WDDM_DISPCFG *pCfg)
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync for (UINT iter = 0; iter < pCfg->cPathInfoArray; ++iter)
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync if (pCfg->pPathInfoArray[iter].sourceInfo.id == pCfg->pPathInfoArray[iter].targetInfo.id)
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (!(pCfg->pPathInfoArray[iter].flags & DISPLAYCONFIG_PATH_ACTIVE))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pCfg->pPathInfoArray[iter].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic void vboxDispIfWddmDcSettingsAttachDisbledToPrimary(VBOXDISPIF_WDDM_DISPCFG *pCfg)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync for (UINT iter = 0; iter < pCfg->cPathInfoArray; ++iter)
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync if ((pCfg->pPathInfoArray[iter].flags & DISPLAYCONFIG_PATH_ACTIVE))
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pCfg->pPathInfoArray[iter].sourceInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync pCfg->pPathInfoArray[iter].targetInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic DWORD vboxDispIfWddmDcSettingsIncludeAllTargets(VBOXDISPIF_WDDM_DISPCFG *pCfg)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DWORD winEr = vboxDispIfWddmDcQueryNumDisplays(&cDisplays);
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync WARN(("VBoxTray:(WDDM) vboxDispIfWddmDcQueryNumDisplays Failed winEr %d\n", winEr));
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync DISPLAYCONFIG_PATH_INFO *pPathInfoArray = (DISPLAYCONFIG_PATH_INFO *)malloc(cDisplays * sizeof(DISPLAYCONFIG_PATH_INFO));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray:(WDDM) different source and target paare enabled, this is something we would not expect\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync winEr = vboxDispIfWddmDcCreate(&AllCfg, QDC_ALL_PATHS);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray:(WDDM) vboxDispIfWddmDcCreate Failed winEr %d\n", winEr));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync WARN(("VBoxTray:(WDDM) %d %d path not supported\n", i, i));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync WARN(("VBoxTray:(WDDM) %d %d path not supported\n", -1, i));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (pPathInfoArray[i].flags & DISPLAYCONFIG_PATH_ACTIVE)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync WARN(("VBoxTray:(WDDM) disabled path %d %d is marked active\n",
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].sourceInfo.id, pPathInfoArray[i].targetInfo.id));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].sourceInfo.modeInfoIdx == DISPLAYCONFIG_PATH_MODE_IDX_INVALID);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].sourceInfo.statusFlags == 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.modeInfoIdx == DISPLAYCONFIG_PATH_MODE_IDX_INVALID);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.outputTechnology == DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.rotation == DISPLAYCONFIG_ROTATION_IDENTITY);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.scaling == DISPLAYCONFIG_SCALING_PREFERRED);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.refreshRate.Numerator == 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.refreshRate.Denominator == 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.scanLineOrdering == DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.targetAvailable == TRUE);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Assert(pPathInfoArray[i].targetInfo.statusFlags == DISPLAYCONFIG_TARGET_FORCIBLE);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].sourceInfo.adapterId = pCfg->pPathInfoArray[0].sourceInfo.adapterId;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].sourceInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.adapterId = pPathInfoArray[i].sourceInfo.adapterId;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.modeInfoIdx = DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.outputTechnology = DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.rotation = DISPLAYCONFIG_ROTATION_IDENTITY;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.scaling = DISPLAYCONFIG_SCALING_PREFERRED;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.refreshRate.Numerator = 0;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.refreshRate.Denominator = 0;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.scanLineOrdering = DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.targetAvailable = TRUE;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pPathInfoArray[i].targetInfo.statusFlags = DISPLAYCONFIG_TARGET_FORCIBLE;
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsyncstatic DWORD vboxDispIfOpBegin(PCVBOXDISPIF pIf, VBOXDISPIF_OP *pOp)
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync HRESULT hr = vboxDispKmtOpenAdapter(&pIf->modeData.wddm.KmtCallbacks, &pOp->Adapter);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync hr = vboxDispKmtCreateDevice(&pOp->Adapter, &pOp->Device);
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync hr = vboxDispKmtCreateContext(&pOp->Device, &pOp->Context, VBOXWDDM_CONTEXT_TYPE_CUSTOM_DISPIF_RESIZE,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync WARN(("VBoxTray: vboxDispKmtCreateContext failed hr 0x%x", hr));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync WARN(("VBoxTray: vboxDispKmtCreateDevice failed hr 0x%x", hr));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync/* display driver interface abstraction for XPDM & WDDM
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * with WDDM we can not use ExtEscape to communicate with our driver
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * because we do not have XPDM display driver any more, i.e. escape requests are handled by cdd
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * that knows nothing about us */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync vboxDispKmtCallbacksTerm(&pIf->modeData.wddm.KmtCallbacks);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic DWORD vboxDispIfEscapeXPDM(PCVBOXDISPIF pIf, PVBOXDISPIFESCAPE pEscape, int cbData, int iDirection)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VOID *pvData = cbData ? VBOXDISPIFESCAPE_DATA(pEscape, VOID) : NULL;
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync else if (iRet == 0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic DWORD vboxDispIfSwitchToWDDM(PVBOXDISPIF pIf)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *(uintptr_t *)&pIf->modeData.wddm.pfnChangeDisplaySettingsEx = (uintptr_t)GetProcAddress(hUser, "ChangeDisplaySettingsExA");
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync Log((__FUNCTION__": VBoxDisplayInit: pfnChangeDisplaySettingsEx = %p\n", pIf->modeData.wddm.pfnChangeDisplaySettingsEx));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync bSupported &= !!(pIf->modeData.wddm.pfnChangeDisplaySettingsEx);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *(uintptr_t *)&pIf->modeData.wddm.pfnEnumDisplayDevices = (uintptr_t)GetProcAddress(hUser, "EnumDisplayDevicesA");
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync Log((__FUNCTION__": VBoxDisplayInit: pfnEnumDisplayDevices = %p\n", pIf->modeData.wddm.pfnEnumDisplayDevices));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync bSupported &= !!(pIf->modeData.wddm.pfnEnumDisplayDevices);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* for win 7 and above */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *(uintptr_t *)&gCtx.pfnSetDisplayConfig = (uintptr_t)GetProcAddress(hUser, "SetDisplayConfig");
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync Log((__FUNCTION__": VBoxDisplayInit: pfnSetDisplayConfig = %p\n", gCtx.pfnSetDisplayConfig));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *(uintptr_t *)&gCtx.pfnQueryDisplayConfig = (uintptr_t)GetProcAddress(hUser, "QueryDisplayConfig");
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync Log((__FUNCTION__": VBoxDisplayInit: pfnQueryDisplayConfig = %p\n", gCtx.pfnQueryDisplayConfig));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *(uintptr_t *)&gCtx.pfnGetDisplayConfigBufferSizes = (uintptr_t)GetProcAddress(hUser, "GetDisplayConfigBufferSizes");
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync Log((__FUNCTION__": VBoxDisplayInit: pfnGetDisplayConfigBufferSizes = %p\n", gCtx.pfnGetDisplayConfigBufferSizes));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync bSupported &= !!(gCtx.pfnGetDisplayConfigBufferSizes);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* this is vista and up */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync HRESULT hr = vboxDispKmtCallbacksInit(&pIf->modeData.wddm.KmtCallbacks);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: vboxDispKmtCallbacksInit failed hr 0x%x\n", hr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN((__FUNCTION__": GetModuleHandle(USER32) failed, err(%d)\n", GetLastError()));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN((__FUNCTION__": can not switch to VBOXDISPIF_MODE_WDDM, because os is not Vista or upper\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic DWORD vboxDispIfSwitchToWDDM_W7(PVBOXDISPIF pIf)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic DWORD vboxDispIfWDDMAdpHdcCreate(int iDisplay, HDC *phDc, DISPLAY_DEVICE *pDev)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync for (int i = 0; ; ++i)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (EnumDisplayDevices(NULL, /* LPCTSTR lpDevice */ i, /* DWORD iDevNum */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (i == iDisplay || (iDisplay < 0 && pDev->StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync HDC hDc = CreateDC(NULL, pDev->DeviceName, NULL, NULL);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync Log(("display data no match display(%d): i(%d), flags(%d)", iDisplay, i, pDev->StateFlags));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("vboxDispIfWDDMAdpHdcCreate failure branch %d", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic DWORD vboxDispIfEscapeWDDM(PCVBOXDISPIF pIf, PVBOXDISPIFESCAPE pEscape, int cbData, BOOL fHwAccess)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync HRESULT hr = vboxDispKmtOpenAdapter(&pIf->modeData.wddm.KmtCallbacks, &Adapter);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: vboxDispKmtOpenAdapter failed hr 0x%x\n", hr));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync //EscapeData.hDevice = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync EscapeData.PrivateDriverDataSize = VBOXDISPIFESCAPE_SIZE(cbData);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync //EscapeData.hContext = NULL;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NTSTATUS Status = pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTEscape(&EscapeData);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync WARN(("VBoxTray: pfnD3DKMTEscape failed Status 0x%x\n", Status));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncDWORD VBoxDispIfEscape(PCVBOXDISPIF pIf, PVBOXDISPIFESCAPE pEscape, int cbData)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return vboxDispIfEscapeXPDM(pIf, pEscape, cbData, 1);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return vboxDispIfEscapeWDDM(pIf, pEscape, cbData, TRUE /* BOOL fHwAccess */);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync Log((__FUNCTION__": unknown mode (%d)\n", pIf->enmMode));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncDWORD VBoxDispIfEscapeInOut(PCVBOXDISPIF const pIf, PVBOXDISPIFESCAPE pEscape, int cbData)
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return vboxDispIfEscapeXPDM(pIf, pEscape, cbData, 0);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return vboxDispIfEscapeWDDM(pIf, pEscape, cbData, TRUE /* BOOL fHwAccess */);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Log((__FUNCTION__": unknown mode (%d)\n", pIf->enmMode));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsynctypedef struct VBOXRR
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync#define VBOX_E_INSUFFICIENT_BUFFER HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync#define VBOX_E_NOT_SUPPORTED HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync//static DWORD vboxDispIfWddmValidateFixResize(PCVBOXDISPIF const pIf, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic void VBoxRrRetrySchedule(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes)
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync pMon->paDisplayDevices = (DISPLAY_DEVICE*)malloc(sizeof (*paDisplayDevices) * cDevModes);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync memcpy(pMon->paDisplayDevices, paDisplayDevices, sizeof (*paDisplayDevices) * cDevModes);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pMon->paDeviceModes = (DEVMODE*)malloc(sizeof (*paDeviceModes) * cDevModes);
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync memcpy(pMon->paDeviceModes, paDeviceModes, sizeof (*paDeviceModes) * cDevModes);
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync pMon->idTimer = SetTimer(pMon->hWnd, VBOXRR_TIMER_ID, 1000, (TIMERPROC)NULL);
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync WARN(("VBoxTray: SetTimer failed!, err %d\n", GetLastError()));
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync DWORD dwErr = vboxDispIfResizePerform(pMon->pIf, pMon->iChangedMode, pMon->fEnable, pMon->fExtDispSup, pMon->paDisplayDevices, pMon->paDeviceModes, pMon->cDevModes);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Log((__FUNCTION__": got WM_CLOSE for hwnd(0x%x)", hwnd));
9b7b32cdd4b2fcbf2796d9a09038670628c55592vboxsync Log((__FUNCTION__": got WM_DESTROY for hwnd(0x%x)", hwnd));
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Log((__FUNCTION__": got WM_NCHITTEST for hwnd(0x%x)\n", hwnd));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Register the Window Class. */
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync WARN((__FUNCTION__": RegisterClass failed, winErr(%d)\n", winErr));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_DISABLED,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN((__FUNCTION__": CreateWindowEx failed, winErr(%d)\n", winErr));
cb445170c831c6c56d2d82261e9193b66ceb98a7vboxsync WARN((__FUNCTION__": DestroyWindow failed, winErr(%d) for hWnd(0x%x)\n", winErr, hWnd));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync 0 /*HWND hWnd*/,
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync 0 /*UINT wMsgFilterMin*/,
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync 0 /*UINT wMsgFilterMax*/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* just ensure we never return success in this case */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync WARN(("VBoxTray: GetMessage returned -1, err %d\n", winEr));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync } while (1);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsyncstatic DWORD WINAPI vboxRrRunnerThread(void *pvUser)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN((__FUNCTION__": SetEvent failed, winErr = (%d)", winErr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync pMon->hEvent = CreateEvent(NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes*/
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pMon->hThread = CreateThread(NULL /* LPSECURITY_ATTRIBUTES lpThreadAttributes */,
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync 0 /* SIZE_T dwStackSize */,
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync 0 /* DWORD dwCreationFlags */,
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync DWORD dwResult = WaitForSingleObject(pMon->hEvent, INFINITE);
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync WARN((__FUNCTION__": CreateThread failed, winErr = (%d)", winErr));
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync WARN((__FUNCTION__": CreateEvent failed, winErr = (%d)", winErr));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync BOOL bResult = PostThreadMessage(pMon->idThread, WM_VBOXRR_INIT_QUIT, 0, 0);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync || (winErr = GetLastError()) == ERROR_INVALID_THREAD_ID) /* <- could be that the thread is terminated */
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync DWORD dwErr = WaitForSingleObject(pMon->hThread, INFINITE);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync WARN(("VBoxTray: VBoxRrInit failed hr 0x%x\n", hr));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsyncstatic DWORD vboxDispIfQueryDisplayConnection(VBOXDISPIF_OP *pOp, UINT32 iDisplay, BOOL *pfConnected)
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync /* @todo: do we need ti impl it? */
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync DWORD winEr = vboxDispIfWddmDcCreate(&DispCfg, QDC_ALL_PATHS);
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcCreate winEr %d\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync int idx = vboxDispIfWddmDcSearchPath(&DispCfg, iDisplay, iDisplay);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncstatic DWORD vboxDispIfWaitDisplayDataInited(VBOXDISPIF_OP *pOp)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NTSTATUS Status = pOp->pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTPollDisplayChildren(&PollData);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync Log(("VBoxTray: (WDDM) pfnD3DKMTPollDisplayChildren failed, Status (0x%x)\n", Status));
fabb3e1e51b589494ebe849b7c000e8bcc9ff473vboxsync for (UINT i = 0; i < VBOXWDDM_SCREENMASK_SIZE; ++i)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (pu8DisplayMask && !ASMBitTest(pu8DisplayMask, i))
fabb3e1e51b589494ebe849b7c000e8bcc9ff473vboxsync winEr = vboxDispIfQueryDisplayConnection(pOp, i, &fConnected);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfQueryDisplayConnection winEr %d\n", winEr));
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync WARN(("VBoxTray: (WDDM) Display %d not connected, not expected\n", i));
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync } while (1);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsyncstatic DWORD vboxDispIfUpdateModesWDDM(VBOXDISPIF_OP *pOp, uint32_t u32TargetId, const RTRECTSIZE *pSize)
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync EscData.EscapeHdr.escapeCode = VBOXESC_UPDATEMODES;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync /* win8.1 does not allow context-based escapes for display-only mode */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync EscapeData.PrivateDriverDataSize = sizeof (EscData);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync NTSTATUS Status = pOp->pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTEscape(&EscapeData);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync WARN(("VBoxTray: pfnD3DKMTEscape VBOXESC_UPDATEMODES failed Status 0x%x\n", Status));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWaitDisplayDataInited winEr %d\n", winEr));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsyncDWORD vboxDispIfCancelPendingResizeWDDM(PCVBOXDISPIF const pIf)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsyncstatic DWORD vboxDispIfWddmResizeDisplayVista(DEVMODE *paDeviceModes, DISPLAY_DEVICE *paDisplayDevices, DWORD cDevModes, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync /* Without this, Windows will not ask the miniport for its
fabb3e1e51b589494ebe849b7c000e8bcc9ff473vboxsync * mode table but uses an internal cache instead.
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync EnumDisplaySettings((LPSTR)paDisplayDevices[i].DeviceName, 0xffffff, &tempDevMode);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync Log(("VBoxTray: ResizeDisplayDevice: EnumDisplaySettings last error %d\n", GetLastError ()));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync DWORD winEr = EnableAndResizeDispDev(paDeviceModes, paDisplayDevices, cDevModes, iChangedMode, paDeviceModes[iChangedMode].dmPelsWidth, paDeviceModes[iChangedMode].dmPelsHeight,
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync paDeviceModes[iChangedMode].dmBitsPerPel, paDeviceModes[iChangedMode].dmPosition.x, paDeviceModes[iChangedMode].dmPosition.y, fEnable, fExtDispSup);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync WARN(("VBoxTray: (WDDM) Failed EnableAndResizeDispDev winEr %d\n", winEr));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncstatic DWORD vboxDispIfResizePerform(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes)
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync winEr = vboxDispIfWddmResizeDisplay(pIf, iChangedMode, fEnable, paDisplayDevices, paDeviceModes, cDevModes);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmResizeDisplay winEr %d\n", winEr));
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync winEr = vboxDispIfWddmResizeDisplayVista(paDeviceModes, paDisplayDevices, cDevModes, iChangedMode, fEnable, fExtDispSup);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmResizeDisplayVista winEr %d\n", winEr));
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsyncDWORD vboxDispIfResizeModesWDDM(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("VBoxTray: vboxDispIfOpBegin failed winEr 0x%x", winEr));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if ((i == iChangedMode) ? fEnable : (paDisplayDevices[i].StateFlags & DISPLAY_DEVICE_ACTIVE))
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync VidPnData.aSources[cElements].Size.cx = paDeviceModes[i].dmPelsWidth;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync VidPnData.aSources[cElements].Size.cy = paDeviceModes[i].dmPelsHeight;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync DdiData.PrivateDriverDataSize = sizeof (VidPnData);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync NTSTATUS Status = Op.pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTInvalidateActiveVidPn(&DdiData);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync Size.cy = paDeviceModes[iChangedMode].dmPelsHeight;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfUpdateModesWDDM(&Op, iChangedMode, &Size);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("vboxDispIfUpdateModesWDDM failed %d\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfResizePerform(pIf, iChangedMode, fEnable, fExtDispSup, paDisplayDevices, paDeviceModes, cDevModes);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync VBoxRrRetrySchedule(pIf, iChangedMode, fEnable, fExtDispSup, paDisplayDevices, paDeviceModes, cDevModes);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync /* just pretend everything is fine so far */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncstatic DWORD vboxDispIfWddmEnableDisplays(PCVBOXDISPIF const pIf, UINT cIds, UINT *pIds, BOOL fEnabled, BOOL fSetTopology, DEVMODE *pDeviceMode)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfWddmDcCreate(&DispCfg, QDC_ONLY_ACTIVE_PATHS);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcCreate winEr %d\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync UINT *pChangeIds = (UINT*)alloca(cIds * sizeof (*pChangeIds));
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync WARN(("VBoxTray: (WDDM) Failed to alloc change ids\n"));
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync bool fIsDup = false;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync iPath = vboxDispIfWddmDcSearchPath(&DispCfg, Id, Id);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync if (!((iPath >= 0) && (DispCfg.pPathInfoArray[iPath].flags & DISPLAYCONFIG_PATH_ACTIVE)) != !fEnabled)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync Log(("VBoxTray: (WDDM) vboxDispIfWddmEnableDisplay: settings are up to date\n"));
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync /* we want to set primary for every disabled for non-topoly mode only */
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync winEr = vboxDispIfWddmDcSettingsIncludeAllTargets(&DispCfg);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcSettingsIncludeAllTargets winEr %d\n", winEr));
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync vboxDispIfWddmDcSettingsInvalidateModeIndeces(&DispCfg);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync /* re-query paths */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync iPath = vboxDispIfWddmDcSearchPath(&DispCfg, -1, Id);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync WARN(("VBoxTray: (WDDM) path index not found while it should"));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfWddmDcSettingsUpdate(&DispCfg, iPath, pDeviceMode, !fEnabled || fSetTopology, fEnabled);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcSettingsUpdate winEr %d\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync vboxDispIfWddmDcSettingsAttachDisbledToPrimary(&DispCfg);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync /* ensure the zero-index (primary) screen is enabled */
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync iPath = vboxDispIfWddmDcSearchPath(&DispCfg, 0, 0);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync WARN(("VBoxTray: (WDDM) path index not found while it should"));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfWddmDcSettingsUpdate(&DispCfg, iPath, /* just re-use device node here*/ pDeviceMode, fSetTopology, TRUE);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcSettingsUpdate winEr %d\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync UINT fSetFlags = !fSetTopology ? (SDC_USE_SUPPLIED_DISPLAY_CONFIG) : (SDC_ALLOW_PATH_ORDER_CHANGES | SDC_TOPOLOGY_SUPPLIED);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_VALIDATE);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) vboxDispIfWddmDcSet validation failed winEr, trying with changes %d\n", winEr));
77db08a24f69bca943d5abc40b1930ee97f593edvboxsync Log(("VBoxTray: (WDDM) vboxDispIfWddmDcSet topology validation failed winEr %d\n", winEr));
d862f0eeb9eacdb46b9f5cc420de30a3d7c2c3f6vboxsync winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_APPLY);
d862f0eeb9eacdb46b9f5cc420de30a3d7c2c3f6vboxsync WARN(("VBoxTray: (WDDM) vboxDispIfWddmDcSet apply failed winEr %d\n", winEr));
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncstatic DWORD vboxDispIfWddmEnableDisplaysTryingTopology(PCVBOXDISPIF const pIf, UINT cIds, UINT *pIds, BOOL fEnable)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync DWORD winEr = vboxDispIfWddmEnableDisplays(pIf, cIds, pIds, fEnable, FALSE, NULL);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmEnableDisplay mode winEr %d\n", winEr));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync Log(("VBoxTray: (WDDM) Failed vboxDispIfWddmEnableDisplay mode winEr %d\n", winEr));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync winEr = vboxDispIfWddmEnableDisplays(pIf, cIds, pIds, fEnable, TRUE, NULL);
9161d9a8318db73b2848c1feaef3880980474e64vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmEnableDisplay mode winEr %d\n", winEr));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsyncstatic DWORD vboxDispIfWddmResizeDisplay(PCVBOXDISPIF const pIf, UINT Id, BOOL fEnable, DISPLAY_DEVICE * paDisplayDevices, DEVMODE *paDeviceMode, UINT devModes)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfWddmDcCreate(&DispCfg, QDC_ONLY_ACTIVE_PATHS);
9161d9a8318db73b2848c1feaef3880980474e64vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcCreate\n"));
9161d9a8318db73b2848c1feaef3880980474e64vboxsync iPath = vboxDispIfWddmDcSearchActivePath(&DispCfg, Id, Id);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* nothing to be done here, just leave */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync winEr = vboxDispIfWddmEnableDisplaysTryingTopology(pIf, 1, &Id, fEnable);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmEnableDisplaysTryingTopology winEr %d\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync winEr = vboxDispIfWddmDcCreate(&DispCfg, QDC_ONLY_ACTIVE_PATHS);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcCreate winEr %d\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync iPath = vboxDispIfWddmDcSearchPath(&DispCfg, Id, Id);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) path (%d) is still disabled, going to retry winEr %d\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* need to disable it, and we are done */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync winEr = vboxDispIfWddmEnableDisplaysTryingTopology(pIf, 1, &Id, fEnable);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmEnableDisplaysTryingTopology winEr %d\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfWddmDcSettingsUpdate(&DispCfg, iPath, &paDeviceMode[Id], FALSE, fEnable);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcSettingsUpdate\n"));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_VALIDATE);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_SAVE_TO_DATABASE | SDC_APPLY);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync#endif /* VBOX_WITH_WDDM */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncDWORD VBoxDispIfResizeModes(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return vboxDispIfResizeModesWDDM(pIf, iChangedMode, fEnable, fExtDispSup, paDisplayDevices, paDeviceModes, cDevModes);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN((__FUNCTION__": unknown mode (%d)\n", pIf->enmMode));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncDWORD VBoxDispIfCancelPendingResize(PCVBOXDISPIF const pIf)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN((__FUNCTION__": unknown mode (%d)\n", pIf->enmMode));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncstatic DWORD vboxDispIfConfigureTargetsWDDM(VBOXDISPIF_OP *pOp, uint32_t *pcConnected)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* win8.1 does not allow context-based escapes for display-only mode */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync EscapeData.PrivateDriverDataSize = sizeof (EscapeHdr);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NTSTATUS Status = pOp->pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTEscape(&EscapeData);
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync WARN(("VBoxTray: pfnD3DKMTEscape VBOXESC_CONFIGURETARGETS failed Status 0x%x\n", Status));
3faac25bf74aedb359249d6acd6d8e4988acd332vboxsyncstatic DWORD vboxDispIfResizeStartedWDDMOp(VBOXDISPIF_OP *pOp)
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: Zero devices found\n"));
3faac25bf74aedb359249d6acd6d8e4988acd332vboxsync DISPLAY_DEVICE *paDisplayDevices = (DISPLAY_DEVICE *)alloca (sizeof (DISPLAY_DEVICE) * NumDevices);
3faac25bf74aedb359249d6acd6d8e4988acd332vboxsync DEVMODE *paDeviceModes = (DEVMODE *)alloca (sizeof (DEVMODE) * NumDevices);
3faac25bf74aedb359249d6acd6d8e4988acd332vboxsync DWORD winEr = VBoxGetDisplayConfig(NumDevices, &DevPrimaryNum, &DevNum, paDisplayDevices, paDeviceModes);
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: VBoxGetDisplayConfig failed, %d\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: NumDevices(%d) != DevNum(%d)\n", NumDevices, DevNum));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync winEr = vboxDispIfConfigureTargetsWDDM(pOp, &cConnected);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("VBoxTray: vboxDispIfConfigureTargetsWDDM failed winEr 0x%x\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync Log(("VBoxTray: all targets already connected, nothing to do\n"));
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: vboxDispIfWaitDisplayDataInited failed winEr 0x%x\n", winEr));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: Zero devices found\n"));
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: NumDevices(%d) != NewNumDevices(%d)\n", NumDevices, NewNumDevices));
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync DISPLAY_DEVICE *paNewDisplayDevices = (DISPLAY_DEVICE *)alloca (sizeof (DISPLAY_DEVICE) * NewNumDevices);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync DEVMODE *paNewDeviceModes = (DEVMODE *)alloca (sizeof (DEVMODE) * NewNumDevices);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync winEr = VBoxGetDisplayConfig(NewNumDevices, &NewDevPrimaryNum, &NewDevNum, paNewDisplayDevices, paNewDeviceModes);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: VBoxGetDisplayConfig failed for new devices, %d\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: NewNumDevices(%d) != NewDevNum(%d)\n", NewNumDevices, NewDevNum));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync UINT *pIds = (UINT*)alloca (sizeof (UINT) * minDevNum);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ((paNewDisplayDevices[i].StateFlags & DISPLAY_DEVICE_ACTIVE)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync && !(paDisplayDevices[i].StateFlags & DISPLAY_DEVICE_ACTIVE))
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* this is something we would not regularly expect */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: all targets already have proper config, nothing to do\n"));
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsync winEr = vboxDispIfWddmEnableDisplaysTryingTopology(pOp->pIf, cIds, pIds, FALSE);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: vboxDispIfWddmEnableDisplaysTryingTopology failed to record current settings, %d, ignoring\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync winEr = vboxDispIfWddmResizeDisplayVista(paNewDeviceModes, paNewDisplayDevices, NewDevNum, i, FALSE, TRUE);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp: vboxDispIfWddmResizeDisplayVista failed winEr 0x%x\n", winEr));
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsyncstatic DWORD vboxDispIfResizeStartedWDDM(PCVBOXDISPIF const pIf)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: vboxDispIfOpBegin failed winEr 0x%x\n", winEr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync WARN(("VBoxTray: vboxDispIfResizeStartedWDDMOp failed winEr 0x%x\n", winEr));
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsyncDWORD VBoxDispIfResizeStarted(PCVBOXDISPIF const pIf)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync WARN((__FUNCTION__": unknown mode (%d)\n", pIf->enmMode));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncstatic DWORD vboxDispIfSwitchToXPDM_NT4(PVBOXDISPIF pIf)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncstatic DWORD vboxDispIfSwitchToXPDM(PVBOXDISPIF pIf)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync *(uintptr_t *)&pIf->modeData.xpdm.pfnChangeDisplaySettingsEx = (uintptr_t)GetProcAddress(hUser, "ChangeDisplaySettingsExA");
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Log((__FUNCTION__": pfnChangeDisplaySettingsEx = %p\n", pIf->modeData.xpdm.pfnChangeDisplaySettingsEx));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync bSupported &= !!(pIf->modeData.xpdm.pfnChangeDisplaySettingsEx);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync WARN((__FUNCTION__": pfnChangeDisplaySettingsEx function pointer failed to initialize\n"));
return err;
if (penmOldMode)
return NO_ERROR;
#ifdef VBOX_WITH_WDDM
switch (enmMode)
case VBOXDISPIF_MODE_XPDM_NT4:
case VBOXDISPIF_MODE_XPDM:
#ifdef VBOX_WITH_WDDM
case VBOXDISPIF_MODE_WDDM:
case VBOXDISPIF_MODE_WDDM_W7:
return err;
static DWORD vboxDispIfSeamlesCreateWDDM(PCVBOXDISPIF const pIf, VBOXDISPIF_SEAMLESS *pSeamless, HANDLE hEvent)
HRESULT hr = vboxDispKmtOpenAdapter(&pIf->modeData.wddm.KmtCallbacks, &pSeamless->modeData.wddm.Adapter);
#ifdef VBOX_DISPIF_WITH_OPCONTEXT
hr = vboxDispKmtCreateContext(&pSeamless->modeData.wddm.Device, &pSeamless->modeData.wddm.Context, VBOXWDDM_CONTEXT_TYPE_CUSTOM_DISPIF_SEAMLESS,
return ERROR_SUCCESS;
#ifdef VBOX_DISPIF_WITH_OPCONTEXT
return hr;
#ifdef VBOX_DISPIF_WITH_OPCONTEXT
return NO_ERROR;
static DWORD vboxDispIfSeamlesSubmitWDDM(VBOXDISPIF_SEAMLESS *pSeamless, VBOXDISPIFESCAPE *pData, int cbData)
#ifdef VBOX_DISPIF_WITH_OPCONTEXT
return ERROR_SUCCESS;
return Status;
DWORD VBoxDispIfSeamlesCreate(PCVBOXDISPIF const pIf, VBOXDISPIF_SEAMLESS *pSeamless, HANDLE hEvent)
case VBOXDISPIF_MODE_XPDM_NT4:
case VBOXDISPIF_MODE_XPDM:
return NO_ERROR;
#ifdef VBOX_WITH_WDDM
case VBOXDISPIF_MODE_WDDM:
case VBOXDISPIF_MODE_WDDM_W7:
return ERROR_INVALID_PARAMETER;
case VBOXDISPIF_MODE_XPDM_NT4:
case VBOXDISPIF_MODE_XPDM:
#ifdef VBOX_WITH_WDDM
case VBOXDISPIF_MODE_WDDM:
case VBOXDISPIF_MODE_WDDM_W7:
return winEr;
return ERROR_INVALID_PARAMETER;
case VBOXDISPIF_MODE_XPDM_NT4:
case VBOXDISPIF_MODE_XPDM:
#ifdef VBOX_WITH_WDDM
case VBOXDISPIF_MODE_WDDM:
case VBOXDISPIF_MODE_WDDM_W7:
return ERROR_INVALID_PARAMETER;