VirtualBox

Changeset 32766 in vbox


Ignore:
Timestamp:
Sep 24, 2010 5:40:03 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66214
Message:

wddm: multi-monitor fixes

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Miniport
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk

    r32739 r32766  
    8989  endif
    9090 endif
    91  #VBoxVideoWddm_DEFS       += LOG_ENABLED
     91 ifdef DEBUG_misha
     92  VBoxVideoWddm_DEFS       += LOG_ENABLED
     93 endif
    9294 #VBoxVideoWddm_DEFS       += VBOX_WITH_MULTIMONITOR_FIX
    9395 #VBoxVideoWddm_DEFS       += LOG_TO_BACKDOOR
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h

    r32677 r32766  
    305305#ifdef VBOX_WITH_WDDM
    306306   PDEVICE_OBJECT pPDO;
     307   UNICODE_STRING RegKeyName;
     308   UNICODE_STRING VideoGuid;
    307309
    308310   uint8_t * pvVisibleVram;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoMisc.cpp

    r32650 r32766  
    1212
    1313#include "../VBoxVideo.h"
     14#include "../Helper.h"
    1415
    1516#include <iprt/asm.h>
     17
     18#include <stdio.h>
    1619
    1720NTSTATUS vboxWddmHTableCreate(PVBOXWDDM_HTABLE pTbl, uint32_t cSize)
     
    458461    return STATUS_SUCCESS;
    459462}
     463
     464#define VBOXWDDM_REG_DRVKEY_PREFIX L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\"
     465
     466NTSTATUS vboxWddmRegQueryDrvKeyName(PDEVICE_EXTENSION pDevExt, ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult)
     467{
     468    WCHAR fallBackBuf[2];
     469    PWCHAR pSuffix;
     470    bool bFallback = false;
     471
     472    if (cbBuf > sizeof(VBOXWDDM_REG_DRVKEY_PREFIX))
     473    {
     474        memcpy(pBuf, VBOXWDDM_REG_DRVKEY_PREFIX, sizeof (VBOXWDDM_REG_DRVKEY_PREFIX));
     475        pSuffix = pBuf + (sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2)/2;
     476        cbBuf -= sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2;
     477    }
     478    else
     479    {
     480        pSuffix = fallBackBuf;
     481        cbBuf = sizeof (fallBackBuf);
     482        bFallback = true;
     483    }
     484
     485    NTSTATUS Status = IoGetDeviceProperty (pDevExt->pPDO,
     486                                  DevicePropertyDriverKeyName,
     487                                  cbBuf,
     488                                  pSuffix,
     489                                  &cbBuf);
     490    if (Status == STATUS_SUCCESS && bFallback)
     491        Status = STATUS_BUFFER_TOO_SMALL;
     492    if (Status == STATUS_BUFFER_TOO_SMALL)
     493        *pcbResult = cbBuf + sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2;
     494
     495    return Status;
     496}
     497
     498#define VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_VISTA L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Control\\VIDEO\\"
     499#define VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_WIN7 L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles\\UnitedVideo\\CONTROL\\VIDEO\\"
     500
     501#define VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_RELX L"Attach.RelativeX"
     502#define VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_RELY L"Attach.RelativeY"
     503#define VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_DESKTOP L"Attach.ToDesktop"
     504
     505NTSTATUS vboxWddmRegQueryDisplaySettingsKeyName(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
     506        ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult)
     507{
     508    NTSTATUS Status = STATUS_SUCCESS;
     509    PWCHAR pSuffix;
     510    bool bFallback = false;
     511    const WCHAR* pKeyPrefix;
     512    UINT cbKeyPrefix;
     513    winVersion_t ver = vboxQueryWinVersion();
     514    if (ver == WINVISTA)
     515    {
     516        pKeyPrefix = VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_VISTA;
     517        cbKeyPrefix = sizeof (VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_VISTA);
     518    }
     519    else
     520    {
     521        Assert(ver == WIN7);
     522        pKeyPrefix = VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_WIN7;
     523        cbKeyPrefix = sizeof (VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_WIN7);
     524    }
     525
     526    ULONG cbResult = cbKeyPrefix + pDevExt->VideoGuid.Length + 2 + 8; // L"\\" + "XXXX"
     527    if (cbBuf >= cbResult)
     528    {
     529        wcscpy(pBuf, pKeyPrefix);
     530        pSuffix = pBuf + (cbKeyPrefix-2)/2;
     531        memcpy(pSuffix, pDevExt->VideoGuid.Buffer, pDevExt->VideoGuid.Length);
     532        pSuffix += pDevExt->VideoGuid.Length/2;
     533        pSuffix[0] = L'\\';
     534        pSuffix += 1;
     535        swprintf(pSuffix, L"%04d", VidPnSourceId);
     536    }
     537    else
     538    {
     539        Status = STATUS_BUFFER_TOO_SMALL;
     540    }
     541
     542    *pcbResult = cbResult;
     543
     544    return Status;
     545}
     546
     547#define VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\"
     548#define VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY_SUBKEY L"\\Video"
     549
     550NTSTATUS vboxWddmRegQueryVideoGuidString(ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult)
     551{
     552    HANDLE hKey;
     553    NTSTATUS Status = vboxWddmRegOpenKey(&hKey, VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY, GENERIC_READ);
     554    Assert(Status == STATUS_SUCCESS);
     555    if (Status == STATUS_SUCCESS)
     556    {
     557        struct
     558        {
     559            KEY_BASIC_INFORMATION Name;
     560            WCHAR Buf[256];
     561        } Buf;
     562        WCHAR KeyBuf[sizeof (VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY)/2 + 256 + 64];
     563        wcscpy(KeyBuf, VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY);
     564        ULONG ResultLength;
     565        BOOL bFound = FALSE;
     566        for (ULONG i = 0; !bFound; ++i)
     567        {
     568            RtlZeroMemory(&Buf, sizeof (Buf));
     569            Status = ZwEnumerateKey(hKey, i, KeyBasicInformation, &Buf, sizeof (Buf), &ResultLength);
     570            Assert(Status == STATUS_SUCCESS);
     571            /* we should not encounter STATUS_NO_MORE_ENTRIES here since this would mean we did not find our entry */
     572            if (Status != STATUS_SUCCESS)
     573                break;
     574
     575            HANDLE hSubKey;
     576            PWCHAR pSubBuf = KeyBuf + (sizeof (VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY) - 2)/2;
     577            memcpy(pSubBuf, Buf.Name.Name, Buf.Name.NameLength);
     578            pSubBuf += Buf.Name.NameLength/2;
     579            memcpy(pSubBuf, VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY_SUBKEY, sizeof (VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY_SUBKEY));
     580            Status = vboxWddmRegOpenKey(&hSubKey, KeyBuf, GENERIC_READ);
     581            Assert(Status == STATUS_SUCCESS);
     582            if (Status == STATUS_SUCCESS)
     583            {
     584                struct
     585                {
     586                    KEY_VALUE_PARTIAL_INFORMATION Info;
     587                    UCHAR Buf[sizeof (L"VBoxVideoWddm")]; /* should be enough */
     588                } KeyData;
     589                ULONG cbResult;
     590                UNICODE_STRING RtlStr;
     591                RtlInitUnicodeString(&RtlStr, L"Service");
     592                Status = ZwQueryValueKey(hSubKey,
     593                            &RtlStr,
     594                            KeyValuePartialInformation,
     595                            &KeyData.Info,
     596                            sizeof(KeyData),
     597                            &cbResult);
     598                Assert(Status == STATUS_SUCCESS || STATUS_BUFFER_TOO_SMALL || STATUS_BUFFER_OVERFLOW);
     599                if (Status == STATUS_SUCCESS)
     600                {
     601                    if (KeyData.Info.Type == REG_SZ)
     602                    {
     603                        if (KeyData.Info.DataLength == sizeof (L"VBoxVideoWddm"))
     604                        {
     605                            if (!wcscmp(L"VBoxVideoWddm", (PWCHAR)KeyData.Info.Data))
     606                            {
     607                                bFound = TRUE;
     608                                *pcbResult = Buf.Name.NameLength + 2;
     609                                if (cbBuf >= Buf.Name.NameLength + 2)
     610                                {
     611                                    memcpy(pBuf, Buf.Name.Name, Buf.Name.NameLength + 2);
     612                                }
     613                                else
     614                                {
     615                                    Status = STATUS_BUFFER_TOO_SMALL;
     616                                }
     617                            }
     618                        }
     619                    }
     620                }
     621
     622                NTSTATUS tmpStatus = ZwClose(hSubKey);
     623                Assert(tmpStatus == STATUS_SUCCESS);
     624            }
     625            else
     626                break;
     627        }
     628        NTSTATUS tmpStatus = ZwClose(hKey);
     629        Assert(tmpStatus == STATUS_SUCCESS);
     630    }
     631
     632    return Status;
     633}
     634
     635NTSTATUS vboxWddmRegOpenKey(OUT PHANDLE phKey, IN PWCHAR pName, IN ACCESS_MASK fAccess)
     636{
     637    OBJECT_ATTRIBUTES ObjAttr;
     638    UNICODE_STRING RtlStr;
     639
     640    RtlInitUnicodeString(&RtlStr, pName);
     641    InitializeObjectAttributes(&ObjAttr, &RtlStr, OBJ_CASE_INSENSITIVE, NULL, NULL);
     642
     643    return ZwOpenKey(phKey, fAccess, &ObjAttr);
     644}
     645
     646NTSTATUS vboxWddmRegOpenDisplaySettingsKey(IN PDEVICE_EXTENSION pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, OUT PHANDLE phKey)
     647{
     648    WCHAR Buf[512];
     649    ULONG cbBuf = sizeof(Buf);
     650    NTSTATUS Status = vboxWddmRegQueryDisplaySettingsKeyName(pDeviceExtension, VidPnSourceId, cbBuf, Buf, &cbBuf);
     651    Assert(Status == STATUS_SUCCESS);
     652    if (Status == STATUS_SUCCESS)
     653    {
     654        Status = vboxWddmRegOpenKey(phKey, Buf, GENERIC_READ);
     655        Assert(Status == STATUS_SUCCESS);
     656        if(Status == STATUS_SUCCESS)
     657            return STATUS_SUCCESS;
     658    }
     659
     660    /* fall-back to make the subsequent VBoxVideoCmnRegXxx calls treat the fail accordingly
     661     * basically needed to make as less modifications to the current XPDM code as possible */
     662    *phKey = NULL;
     663
     664    return Status;
     665}
     666
     667NTSTATUS vboxWddmRegDisplaySettingsQueryRelX(HANDLE hKey, int * pResult)
     668{
     669    DWORD dwVal;
     670    NTSTATUS Status = vboxWddmRegQueryValueDword(hKey, VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_RELX, &dwVal);
     671    Assert(Status == STATUS_SUCCESS);
     672    if (Status == STATUS_SUCCESS)
     673    {
     674        *pResult = (int)dwVal;
     675    }
     676
     677    return Status;
     678}
     679
     680NTSTATUS vboxWddmRegDisplaySettingsQueryRelY(HANDLE hKey, int * pResult)
     681{
     682    DWORD dwVal;
     683    NTSTATUS Status = vboxWddmRegQueryValueDword(hKey, VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_RELY, &dwVal);
     684    Assert(Status == STATUS_SUCCESS);
     685    if (Status == STATUS_SUCCESS)
     686    {
     687        *pResult = (int)dwVal;
     688    }
     689
     690    return Status;
     691}
     692
     693NTSTATUS vboxWddmDisplaySettingsQueryPos(IN PDEVICE_EXTENSION pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, POINT * pPos)
     694{
     695    HANDLE hKey;
     696    NTSTATUS Status = vboxWddmRegOpenDisplaySettingsKey(pDeviceExtension, VidPnSourceId, &hKey);
     697    Assert(Status == STATUS_SUCCESS);
     698    if (Status == STATUS_SUCCESS)
     699    {
     700        int x, y;
     701        Status = vboxWddmRegDisplaySettingsQueryRelX(hKey, &x);
     702        Assert(Status == STATUS_SUCCESS);
     703        if (Status == STATUS_SUCCESS)
     704        {
     705            Status = vboxWddmRegDisplaySettingsQueryRelY(hKey, &y);
     706            Assert(Status == STATUS_SUCCESS);
     707            if (Status == STATUS_SUCCESS)
     708            {
     709                pPos->x = x;
     710                pPos->y = y;
     711            }
     712        }
     713        NTSTATUS tmpStatus = ZwClose(hKey);
     714        Assert(tmpStatus == STATUS_SUCCESS);
     715    }
     716    return Status;
     717}
     718
     719NTSTATUS vboxWddmRegQueryValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT PDWORD pDword)
     720{
     721    struct
     722    {
     723        KEY_VALUE_PARTIAL_INFORMATION Info;
     724        UCHAR Buf[32]; /* should be enough */
     725    } Buf;
     726    ULONG cbBuf;
     727    UNICODE_STRING RtlStr;
     728    RtlInitUnicodeString(&RtlStr, pName);
     729    NTSTATUS Status = ZwQueryValueKey(hKey,
     730                &RtlStr,
     731                KeyValuePartialInformation,
     732                &Buf.Info,
     733                sizeof(Buf),
     734                &cbBuf);
     735    if (Status == STATUS_SUCCESS)
     736    {
     737        if (Buf.Info.Type == REG_DWORD)
     738        {
     739            Assert(Buf.Info.DataLength == 4);
     740            *pDword = *((PULONG)Buf.Info.Data);
     741            return STATUS_SUCCESS;
     742        }
     743    }
     744
     745    return STATUS_INVALID_PARAMETER;
     746}
     747
     748NTSTATUS vboxWddmRegSetValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT DWORD val)
     749{
     750    UNICODE_STRING RtlStr;
     751    RtlInitUnicodeString(&RtlStr, pName);
     752    return ZwSetValueKey(hKey, &RtlStr,
     753            NULL, /* IN ULONG  TitleIndex  OPTIONAL, reserved */
     754            REG_DWORD,
     755            &val,
     756            sizeof(val));
     757}
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoMisc.h

    r32496 r32766  
    6060NTSTATUS vboxWddmSwapchainCtxEscape(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXDISPIFESCAPE_SWAPCHAININFO pSwapchainInfo, UINT cbSize);
    6161
     62
     63NTSTATUS vboxWddmRegQueryDisplaySettingsKeyName(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
     64        ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult);
     65NTSTATUS vboxWddmRegOpenDisplaySettingsKey(IN PDEVICE_EXTENSION pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, OUT PHANDLE phKey);
     66NTSTATUS vboxWddmRegDisplaySettingsQueryRelX(HANDLE hKey, int * pResult);
     67NTSTATUS vboxWddmRegDisplaySettingsQueryRelY(HANDLE hKey, int * pResult);
     68NTSTATUS vboxWddmDisplaySettingsQueryPos(IN PDEVICE_EXTENSION pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, POINT * pPos);
     69NTSTATUS vboxWddmRegQueryVideoGuidString(ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult);
     70
     71NTSTATUS vboxWddmRegQueryDrvKeyName(PDEVICE_EXTENSION pDevExt, ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult);
     72
     73NTSTATUS vboxWddmRegOpenKey(OUT PHANDLE phKey, IN PWCHAR pName, IN ACCESS_MASK fAccess);
     74NTSTATUS vboxWddmRegQueryValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT PDWORD pDword);
     75NTSTATUS vboxWddmRegSetValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT DWORD val);
    6276#endif /* #ifndef ___VBoxVideoMisc_h__ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r32697 r32766  
    185185}
    186186
    187 NTSTATUS vboxWddmGhDisplaySetInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource)
     187NTSTATUS vboxWddmGhDisplaySetInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
    188188{
    189189    PVBOXWDDM_ALLOCATION pAllocation = VBOXWDDM_FB_ALLOCATION(pSource);
     
    196196     * Set the current mode into the hardware.
    197197     */
    198     NTSTATUS Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocation);
     198    NTSTATUS Status= vboxWddmDisplaySettingsQueryPos(pDevExt, VidPnSourceId, &pSource->VScreenPos);
     199    Assert(Status == STATUS_SUCCESS);
     200    Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocation);
    199201    Assert(Status == STATUS_SUCCESS);
    200202    if (Status == STATUS_SUCCESS)
     
    219221
    220222#ifdef VBOXWDDM_RENDER_FROM_SHADOW
    221 bool vboxWddmCheckUpdateShadowAddress(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, UINT SegmentId, VBOXVIDEOOFFSET offVram)
     223bool vboxWddmCheckUpdateShadowAddress(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource,
     224        D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, UINT SegmentId, VBOXVIDEOOFFSET offVram)
    222225{
    223226    if (pSource->pPrimaryAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC)
     
    232235    pSource->pShadowAllocation->offVram = offVram;
    233236
    234     NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource);
     237    NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, VidPnSourceId);
    235238    Assert(Status == STATUS_SUCCESS);
    236239    if (Status != STATUS_SUCCESS)
     
    272275}
    273276
    274 
    275 #define VBOXWDDM_REG_DRVKEY_PREFIX L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\"
    276 
    277 NTSTATUS vboxWddmRegQueryDrvKeyName(PDEVICE_EXTENSION pDevExt, ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult)
    278 {
    279     WCHAR fallBackBuf[2];
    280     PWCHAR pSuffix;
    281     bool bFallback = false;
    282 
    283     if (cbBuf > sizeof(VBOXWDDM_REG_DRVKEY_PREFIX))
    284     {
    285         wcscpy(pBuf, VBOXWDDM_REG_DRVKEY_PREFIX);
    286         pSuffix = pBuf + (sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2);
    287         cbBuf -= sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2;
    288     }
    289     else
    290     {
    291         pSuffix = fallBackBuf;
    292         cbBuf = sizeof (fallBackBuf);
    293         bFallback = true;
    294     }
    295 
    296     NTSTATUS Status = IoGetDeviceProperty (pDevExt->pPDO,
    297                                   DevicePropertyDriverKeyName,
    298                                   cbBuf,
    299                                   pSuffix,
    300                                   &cbBuf);
    301     if (Status == STATUS_SUCCESS && bFallback)
    302         Status = STATUS_BUFFER_TOO_SMALL;
    303     if (Status == STATUS_BUFFER_TOO_SMALL)
    304         *pcbResult = cbBuf + sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2;
    305 
    306     return Status;
    307 }
    308 
    309 NTSTATUS vboxWddmRegOpenKey(OUT PHANDLE phKey, IN PWCHAR pName, IN ACCESS_MASK fAccess)
    310 {
    311     OBJECT_ATTRIBUTES ObjAttr;
    312     UNICODE_STRING RtlStr;
    313     RtlStr.Buffer = pName;
    314     RtlStr.Length = USHORT(wcslen(pName) * sizeof(WCHAR));
    315     RtlStr.MaximumLength = RtlStr.Length + sizeof(WCHAR);
    316 
    317     InitializeObjectAttributes(&ObjAttr, &RtlStr, OBJ_CASE_INSENSITIVE, NULL, NULL);
    318 
    319     return ZwOpenKey(phKey, fAccess, &ObjAttr);
    320 }
    321 
    322 NTSTATUS vboxWddmRegQueryValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT PDWORD pDword)
    323 {
    324     UCHAR Buf[32]; /* should be enough */
    325     ULONG cbBuf;
    326     PKEY_VALUE_PARTIAL_INFORMATION pInfo = (PKEY_VALUE_PARTIAL_INFORMATION)Buf;
    327     UNICODE_STRING RtlStr;
    328     RtlStr.Buffer = pName;
    329     RtlStr.Length = USHORT(wcslen(pName) * sizeof(WCHAR));
    330     RtlStr.MaximumLength = RtlStr.Length + sizeof(WCHAR);
    331     NTSTATUS Status = ZwQueryValueKey(hKey,
    332                 &RtlStr,
    333                 KeyValuePartialInformation,
    334                 pInfo,
    335                 sizeof(Buf),
    336                 &cbBuf);
    337     if (Status == STATUS_SUCCESS)
    338     {
    339         if (pInfo->Type == REG_DWORD)
    340         {
    341             Assert(pInfo->DataLength == 4);
    342             *pDword = *((PULONG)pInfo->Data);
    343             return STATUS_SUCCESS;
    344         }
    345     }
    346 
    347     return STATUS_INVALID_PARAMETER;
    348 }
    349 
    350 NTSTATUS vboxWddmRegSetValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT DWORD val)
    351 {
    352     UCHAR Buf[32]; /* should be enough */
    353     PKEY_VALUE_PARTIAL_INFORMATION pInfo = (PKEY_VALUE_PARTIAL_INFORMATION)Buf;
    354     UNICODE_STRING RtlStr;
    355     RtlStr.Buffer = pName;
    356     RtlStr.Length = USHORT(wcslen(pName) * sizeof(WCHAR));
    357     RtlStr.MaximumLength = RtlStr.Length + sizeof(WCHAR);
    358     return ZwSetValueKey(hKey, &RtlStr,
    359             NULL, /* IN ULONG  TitleIndex  OPTIONAL, reserved */
    360             REG_DWORD,
    361             &val,
    362             sizeof(val));
    363 }
    364277
    365278VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal)
     
    542455    memset(pDevExt, 0, sizeof (DEVICE_EXTENSION));
    543456    pDevExt->pPDO = pPDO;
     457    PWCHAR pName = (PWCHAR)(((uint8_t*)pDevExt) + VBOXWDDM_ROUNDBOUND(sizeof (DEVICE_EXTENSION), 8));
     458    RtlInitUnicodeString(&pDevExt->RegKeyName, pName);
     459    pName += (pDevExt->RegKeyName.Length + 2)/2;
     460    RtlInitUnicodeString(&pDevExt->VideoGuid, pName);
    544461#ifdef VBOXWDDM_RENDER_FROM_SHADOW
    545462    for (int i = 0; i < RT_ELEMENTS(pDevExt->aSources); ++i)
     
    564481
    565482    NTSTATUS Status = STATUS_SUCCESS;
    566 
    567     PDEVICE_EXTENSION pContext = (PDEVICE_EXTENSION)vboxWddmMemAllocZero(sizeof (DEVICE_EXTENSION));
    568     if (pContext)
    569     {
    570         vboxWddmDevExtZeroinit(pContext, PhysicalDeviceObject);
    571         *MiniportDeviceContext = pContext;
    572     }
    573     else
    574     {
    575         Status  = STATUS_NO_MEMORY;
    576         drprintf(("VBoxVideoWddm: ERROR, failed to create context\n"));
    577     }
    578 
    579     dfprintf(("<== "__FUNCTION__ ", status(0x%x), pContext(0x%x)\n", Status, pContext));
     483    PDEVICE_EXTENSION pDevExt;
     484
     485    WCHAR RegKeyBuf[512];
     486    ULONG cbRegKeyBuf = sizeof (RegKeyBuf);
     487
     488    Status = IoGetDeviceProperty (PhysicalDeviceObject,
     489                                  DevicePropertyDriverKeyName,
     490                                  cbRegKeyBuf,
     491                                  RegKeyBuf,
     492                                  &cbRegKeyBuf);
     493    Assert(Status == STATUS_SUCCESS);
     494    if (Status == STATUS_SUCCESS)
     495    {
     496        WCHAR VideoGuidBuf[512];
     497        ULONG cbVideoGuidBuf = sizeof (VideoGuidBuf);
     498
     499        Status = vboxWddmRegQueryVideoGuidString(cbVideoGuidBuf, VideoGuidBuf, &cbVideoGuidBuf);
     500        Assert(Status == STATUS_SUCCESS);
     501        if (Status == STATUS_SUCCESS)
     502        {
     503            pDevExt = (PDEVICE_EXTENSION)vboxWddmMemAllocZero(VBOXWDDM_ROUNDBOUND(sizeof (DEVICE_EXTENSION), 8) + cbRegKeyBuf + cbVideoGuidBuf);
     504            if (pDevExt)
     505            {
     506                PWCHAR pName = (PWCHAR)(((uint8_t*)pDevExt) + VBOXWDDM_ROUNDBOUND(sizeof (DEVICE_EXTENSION), 8));
     507                memcpy(pName, RegKeyBuf, cbRegKeyBuf);
     508                pName += cbRegKeyBuf/2;
     509                memcpy(pName, VideoGuidBuf, cbVideoGuidBuf);
     510                vboxWddmDevExtZeroinit(pDevExt, PhysicalDeviceObject);
     511                *MiniportDeviceContext = pDevExt;
     512            }
     513            else
     514            {
     515                Status  = STATUS_NO_MEMORY;
     516                drprintf(("VBoxVideoWddm: ERROR, failed to create context\n"));
     517            }
     518        }
     519    }
     520
     521    dfprintf(("<== "__FUNCTION__ ", Status(0x%x), pDevExt(0x%x)\n", Status, pDevExt));
    580522
    581523    return Status;
     
    21812123            PVBOXWDDM_ALLOCATION pSrcAlloc = pPrivateData->SrcAllocInfo.pAlloc;
    21822124            vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->SurfDesc.VidPnSourceId);
    2183             vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
     2125            vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pDstAlloc->SurfDesc.VidPnSourceId,
     2126                    pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
    21842127            PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW pRFS = (PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW)pPrivateData;
    21852128            uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
     
    22242167                                Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM);
    22252168                                vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->SurfDesc.VidPnSourceId);
    2226                                 vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
     2169                                vboxWddmCheckUpdateShadowAddress(pDevExt, pSource,
     2170                                        pDstAlloc->SurfDesc.VidPnSourceId, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
    22272171                                if (pBlt->DstRects.UpdateRects.cRects)
    22282172                                {
     
    33823326#endif
    33833327                /* should not generally happen, but still inform host*/
    3384                 Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource);
     3328                Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, pSetVidPnSourceAddress->VidPnSourceId);
    33853329                Assert(Status == STATUS_SUCCESS);
    33863330                if (Status != STATUS_SUCCESS)
     
    34473391                        pSource->offVram = VBOXVIDEOOFFSET_VOID;
    34483392#endif
    3449                         Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource);
     3393                        Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, pSetVidPnSourceVisibility->VidPnSourceId);
    34503394                        Assert(Status == STATUS_SUCCESS);
    34513395                        if (Status != STATUS_SUCCESS)
     
    45314475            Assert(pCreateContext->Flags.Value <= 2); /* 2 is a GDI context in Win7 */
    45324476            pContext->enmType = VBOXWDDM_CONTEXT_TYPE_SYSTEM;
     4477            for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
     4478            {
     4479                pDevExt->aSources[i].offVram = VBOXVIDEOOFFSET_VOID;
     4480            }
    45334481        }
    45344482        else
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