VirtualBox

Ignore:
Timestamp:
Nov 10, 2010 9:31:48 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67586
Message:

wddm: fix guest misbehave on driver update, bugfixing

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispCm.cpp

    r33540 r33929  
    137137        pContext->pDevice = pDevice;
    138138    }
     139    else
     140    {
     141        exit(1);
     142    }
     143
    139144    return hr;
    140145}
     
    190195            if (!pCmd->Hdr.cbCmdsReturned && !pCmd->Hdr.cbRemainingFirstCmd)
    191196                hr = S_FALSE;
     197        }
     198        else
     199        {
     200            exit(1);
    192201        }
    193202    }
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiKmt.cpp

    r33715 r33929  
    572572}
    573573
     574HRESULT vboxDispKmtAdpHdcCreate(HDC *phDc)
     575{
     576    HRESULT hr = E_FAIL;
     577    DISPLAY_DEVICE DDev;
     578    memset(&DDev, 0, sizeof (DDev));
     579    DDev.cb = sizeof (DDev);
     580
     581    for (int i = 0; ; ++i)
     582    {
     583        if (EnumDisplayDevices(NULL, /* LPCTSTR lpDevice */ i, /* DWORD iDevNum */
     584                &DDev, 0 /* DWORD dwFlags*/))
     585        {
     586            if (DDev.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
     587            {
     588                HDC hDc = CreateDC(NULL, DDev.DeviceName, NULL, NULL);
     589                if (hDc)
     590                {
     591                    *phDc = hDc;
     592                    return S_OK;
     593                }
     594                else
     595                {
     596                    DWORD winEr = GetLastError();
     597                    Assert(0);
     598                    hr = HRESULT_FROM_WIN32(winEr);
     599                    Assert(FAILED(hr));
     600                    break;
     601                }
     602            }
     603        }
     604        else
     605        {
     606            DWORD winEr = GetLastError();
     607            Assert(0);
     608            hr = HRESULT_FROM_WIN32(winEr);
     609            Assert(FAILED(hr));
     610            break;
     611        }
     612    }
     613
     614    return hr;
     615}
     616
    574617HRESULT vboxDispKmtOpenAdapter(PVBOXDISPKMT_CALLBACKS pCallbacks, PVBOXDISPKMT_ADAPTER pAdapter)
    575618{
    576     D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME OpenAdapterData = {0};
    577     wcsncpy(OpenAdapterData.DeviceName, L"\\\\.\\DISPLAY1", RT_ELEMENTS(OpenAdapterData.DeviceName) - 1 /* the last one is always \0 */);
    578     HRESULT hr = S_OK;
    579     NTSTATUS Status = pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName(&OpenAdapterData);
    580     Assert(!Status);
    581     if (!Status)
    582     {
    583         pAdapter->hAdapter = OpenAdapterData.hAdapter;
    584         pAdapter->pCallbacks = pCallbacks;
    585         return S_OK;
    586     }
    587     else
    588     {
    589         Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName failed, Status (0x%x)\n", Status));
    590         hr = E_FAIL;
     619    D3DKMT_OPENADAPTERFROMHDC OpenAdapterData = {0};
     620    OpenAdapterData.hDc = GetWindowDC(NULL);
     621    HRESULT hr = vboxDispKmtAdpHdcCreate(&OpenAdapterData.hDc);
     622    if (OpenAdapterData.hDc)
     623    {
     624        NTSTATUS Status = pCallbacks->pfnD3DKMTOpenAdapterFromHdc(&OpenAdapterData);
     625        Assert(!Status);
     626        if (!Status)
     627        {
     628            pAdapter->hAdapter = OpenAdapterData.hAdapter;
     629            pAdapter->hDc = OpenAdapterData.hDc;
     630            pAdapter->pCallbacks = pCallbacks;
     631            return S_OK;
     632        }
     633        else
     634        {
     635            Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName failed, Status (0x%x)\n", Status));
     636            hr = E_FAIL;
     637        }
     638
     639        ReleaseDC(NULL, OpenAdapterData.hDc);
    591640    }
    592641
    593642    return hr;
    594 
    595643}
    596644
     
    603651    if (!Status)
    604652    {
     653        ReleaseDC(NULL, pAdapter->hDc);
    605654        return S_OK;
    606655    }
    607656
    608657    Log((__FUNCTION__": pfnD3DKMTCloseAdapter failed, Status (0x%x)\n", Status));
    609     /* ignore */
    610     Status = 0;
     658
    611659    return E_FAIL;
    612660}
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiKmt.h

    r33530 r33929  
    5252{
    5353    D3DKMT_HANDLE hAdapter;
     54    HDC hDc;
    5455    PVBOXDISPKMT_CALLBACKS pCallbacks;
    5556}VBOXDISPKMT_ADAPTER, *PVBOXDISPKMT_ADAPTER;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette