VirtualBox

Changeset 26179 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Feb 2, 2010 10:46:54 PM (15 years ago)
Author:
vboxsync
Message:

wddm: more impl

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Helper.cpp

    r23221 r26179  
    2020// enable backdoor logging
    2121//#define LOG_ENABLED
    22 
     22#ifndef VBOXWDDM
    2323extern "C"
    2424{
    25 #include <ntddk.h>
    26 }
     25# include <ntddk.h>
     26}
     27#else
     28# include "VBoxVideo.h"
     29#endif
    2730
    2831#include <VBox/err.h>
     
    3033#include <VBox/VBoxGuestLib.h>
    3134
     35#ifndef VBOXWDDM
    3236/* the video miniport headers not compatible with the NT DDK headers */
    3337typedef struct _VIDEO_POINTER_ATTRIBUTES
     
    4448#define VIDEO_MODE_COLOR_POINTER  0x04 // 1 if a color hardware pointer is
    4549                                       // supported.
     50#endif /* #ifndef VBOXWDDM */
    4651
    4752#include "Helper.h"
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk

    r26063 r26179  
    9393        VBoxVideoHGSMI.cpp \
    9494        VBoxVideo.cpp \
     95    Helper.cpp \
    9596        wddm/VBoxVideoWddm.cpp \
    9697        wddm/VBoxVideoVidPn.cpp \
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp

    r26000 r26179  
    149149}
    150150
     151VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal)
     152{
     153    return VideoPortGetRegistryParameters(Reg, pName, FALSE, VBoxRegistryCallback, pVal);
     154}
     155
     156VP_STATUS VBoxVideoCmnRegSetDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t Val)
     157{
     158    return VideoPortSetRegistryParameters(Reg, pName, &Val, sizeof(Val));
     159}
     160
     161#endif /* #ifndef VBOXWDDM */
     162
    151163/*
    152164 * Global list of supported standard video modes. It will be
     
    171183    /* custom video mode, otherwise Windows thinks there is no mode switch */
    172184    static int gInvocationCounter = 0;
     185
     186    VBOXCMNREG Reg;
     187    VBoxVideoCmnRegInit(DeviceExtension, &Reg);
    173188
    174189    /* the resolution matrix */
     
    558573        uint32_t xres, yres, bpp = 0;
    559574        swprintf(keyname, L"CustomMode%dWidth", curKeyNo);
    560         status = VideoPortGetRegistryParameters(DeviceExtension->pPrimary,
    561                                                 keyname,
    562                                                 FALSE,
    563                                                 VBoxRegistryCallback,
    564                                                 &xres);
     575        status = VBoxVideoCmnRegQueryDword(Reg, keyname, &xres);
    565576        /* upon the first error, we give up */
    566577        if (status != NO_ERROR)
    567578            break;
    568579        swprintf(keyname, L"CustomMode%dHeight", curKeyNo);
    569         status = VideoPortGetRegistryParameters(DeviceExtension->pPrimary,
    570                                                 keyname,
    571                                                 FALSE,
    572                                                 VBoxRegistryCallback,
    573                                                 &yres);
     580        status = VBoxVideoCmnRegQueryDword(Reg, keyname, &yres);
    574581        /* upon the first error, we give up */
    575582        if (status != NO_ERROR)
    576583            break;
    577584        swprintf(keyname, L"CustomMode%dBPP", curKeyNo);
    578         status = VideoPortGetRegistryParameters(DeviceExtension->pPrimary,
    579                                                 keyname,
    580                                                 FALSE,
    581                                                 VBoxRegistryCallback,
    582                                                 &bpp);
     585        status = VBoxVideoCmnRegQueryDword(Reg, keyname, &bpp);
    583586        /* upon the first error, we give up */
    584587        if (status != NO_ERROR)
     
    662665
    663666    } while(1);
    664 
    665667
    666668    /*
     
    811813
    812814                /* store this video mode as the last custom video mode */
    813                 status = VideoPortSetRegistryParameters(DeviceExtension, L"CustomXRes",
    814                                                         &xres, sizeof(ULONG));
     815                status = VBoxVideoCmnRegSetDword(Reg, L"CustomXRes", xres);
    815816                if (status != NO_ERROR)
    816817                    dprintf(("VBoxVideo: error %d writing CustomXRes\n", status));
    817                 status = VideoPortSetRegistryParameters(DeviceExtension, L"CustomYRes",
    818                                                         &yres, sizeof(ULONG));
     818                status = VBoxVideoCmnRegSetDword(Reg, L"CustomYRes", yres);
    819819                if (status != NO_ERROR)
    820820                    dprintf(("VBoxVideo: error %d writing CustomYRes\n", status));
    821                 status = VideoPortSetRegistryParameters(DeviceExtension, L"CustomBPP",
    822                                                         &bpp, sizeof(ULONG));
     821                status = VBoxVideoCmnRegSetDword(Reg, L"CustomBPP", bpp);
    823822                if (status != NO_ERROR)
    824823                    dprintf(("VBoxVideo: error %d writing CustomBPP\n", status));
     
    860859    }
    861860#endif
    862 }
    863 
    864 #endif
     861
     862    VBoxVideoCmnRegFini(Reg);
     863}
    865864
    866865/* Computes the size of a framebuffer. DualView has a few framebuffers of the computed size. */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h

    r26138 r26179  
    113113
    114114typedef PEVENT VBOXVCMNEVENT, *PVBOXVCMNEVENT;
     115
     116typedef struct _DEVICE_EXTENSION * VBOXCMNREG;
    115117#else
    116118#include <VBox/VBoxVideo.h>
     
    120122
    121123typedef KEVENT VBOXVCMNEVENT, *PVBOXVCMNEVENT;
     124
     125typedef HANDLE VBOXCMNREG;
    122126
    123127typedef enum
     
    309313
    310314#ifdef VBOXWDDM
     315   PDEVICE_OBJECT pPDO;
     316
    311317   ULONG cSources;
    312318   /* currently we define the array for the max possible size since we do not know
     
    430436    pDeviceExtension->u.primary.VideoPortProcs.pfnFreePool(pDeviceExtension, Ptr);
    431437}
     438
     439DECLINLINE(VP_STATUS) VBoxVideoCmnRegInit(IN PDEVICE_EXTENSION pDeviceExtension, OUT VBOXCMNREG *pReg)
     440{
     441    *pReg = pDeviceExtension->pPrimary;
     442    return NO_ERROR;
     443}
     444
     445DECLINLINE(VP_STATUS) VBoxVideoCmnRegFini(IN VBOXCMNREG Reg)
     446{
     447    return NO_ERROR;
     448}
     449
     450VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal);
     451
     452VP_STATUS VBoxVideoCmnRegSetDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t Val);
     453
    432454/* */
    433455
     
    577599}
    578600
     601VP_STATUS VBoxVideoCmnRegInit(IN PDEVICE_EXTENSION pDeviceExtension, OUT VBOXCMNREG *pReg);
     602
     603DECLINLINE(VP_STATUS) VBoxVideoCmnRegFini(IN VBOXCMNREG Reg)
     604{
     605    if(!Reg)
     606        return ERROR_INVALID_PARAMETER;
     607
     608    NTSTATUS Status = ZwClose(Reg);
     609    return Status == STATUS_SUCCESS ? NO_ERROR : ERROR_INVALID_PARAMETER;
     610}
     611
     612VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal);
     613
     614VP_STATUS VBoxVideoCmnRegSetDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t Val);
     615
    579616/* */
    580617
     
    612649    CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* pEnumCofuncModalityArg;
    613650}VBOXVIDPNCMCONTEXT, *PVBOXVIDPNCMCONTEXT;
     651
     652typedef struct VBOXVIDPN_NEW_SRCMODESET_CHECK
     653{
     654    VBOXVIDPNCMCONTEXT CommonInfo;
     655    CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
     656    BOOLEAN bNeedAdjustment;
     657}VBOXVIDPN_NEW_SRCMODESET_CHECK, *PVBOXVIDPN_NEW_SRCMODESET_CHECK;
     658
     659typedef struct VBOXVIDPN_NEW_SRCMODESET_POPULATION
     660{
     661    VBOXVIDPNCMCONTEXT CommonInfo;
     662    CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
     663    /* new source mode (the one being populated) */
     664    D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet;
     665    CONST DXGK_VIDPNSOURCEMODESET_INTERFACE*  pNewVidPnSourceModeSetInterface;
     666}VBOXVIDPN_NEW_SRCMODESET_POPULATION, *PVBOXVIDPN_NEW_SRCMODESET_POPULATION;
    614667
    615668/* !!!NOTE: The callback is responsible for releasing the path */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVidPn.cpp

    r26053 r26179  
    358358}
    359359
     360DECLCALLBACK(BOOLEAN) vboxVidPnCofuncModalitySourceModeCheck(PDEVICE_EXTENSION pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
     361        D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
     362        const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo, PVOID pContext)
     363{
     364    NTSTATUS Status = STATUS_SUCCESS;
     365    PVBOXVIDPN_NEW_SRCMODESET_CHECK pCbContext = (PVBOXVIDPN_NEW_SRCMODESET_CHECK)pContext;
     366    pCbContext->CommonInfo.Status = STATUS_SUCCESS;
     367
     368    pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
     369
     370    pCbContext->CommonInfo.Status = Status;
     371    return Status == STATUS_SUCCESS;
     372
     373}
     374
    360375DECLCALLBACK(BOOLEAN) vboxVidPnCofuncModalitySourceModeEnum(PDEVICE_EXTENSION pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
    361376        D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
     
    394409    const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface;
    395410    PVBOXVIDPNCMCONTEXT pCbContext = (PVBOXVIDPNCMCONTEXT)pContext;
     411    NTSTATUS Status = STATUS_SUCCESS;
    396412    pCbContext->Status = STATUS_SUCCESS;
    397     NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hDesiredVidPn,
     413
     414    /* adjust scaling */
     415    if (pCbContext->pEnumCofuncModalityArg->EnumPivotType != D3DKMDT_EPT_SCALING)
     416    {
     417        if (pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_IDENTITY
     418                && pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_CENTERED
     419                && pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_STRETCHED)
     420        {
     421            const_cast<D3DKMDT_VIDPN_PRESENT_PATH*>(pNewVidPnPresentPathInfo)->ContentTransformation.Scaling = D3DKMDT_VPPS_IDENTITY;
     422        }
     423    }
     424
     425    /* adjust rotation */
     426    if (pCbContext->pEnumCofuncModalityArg->EnumPivotType != D3DKMDT_EPT_ROTATION)
     427    {
     428        if (pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_IDENTITY
     429                && pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_ROTATE90
     430                && pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_ROTATE180
     431                && pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_ROTATE270)
     432        {
     433            const_cast<D3DKMDT_VIDPN_PRESENT_PATH*>(pNewVidPnPresentPathInfo)->ContentTransformation.Rotation = D3DKMDT_VPPR_IDENTITY;
     434        }
     435    }
     436
     437    if (pCbContext->pEnumCofuncModalityArg->EnumPivotType != D3DKMDT_EPT_VIDPNSOURCE
     438            || pNewVidPnPresentPathInfo->VidPnSourceId != pCbContext->pEnumCofuncModalityArg->EnumPivot.VidPnSourceId)
     439    {
     440
     441        Status = pVidPnInterface->pfnAcquireSourceModeSet(hDesiredVidPn,
    398442                    pNewVidPnPresentPathInfo->VidPnSourceId,
    399443                    &hNewVidPnSourceModeSet,
    400444                    &pVidPnSourceModeSetInterface);
    401     Assert(Status == STATUS_SUCCESS);
    402     if (Status == STATUS_SUCCESS)
    403     {
    404         CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
    405         Status = pVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hNewVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
    406445        Assert(Status == STATUS_SUCCESS);
    407446        if (Status == STATUS_SUCCESS)
    408447        {
    409             if (pPinnedVidPnSourceModeInfo)
    410             {
     448            CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
     449            Status = pVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hNewVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
     450            Assert(Status == STATUS_SUCCESS);
     451            if (Status == STATUS_SUCCESS)
     452            {
     453                if (!pPinnedVidPnSourceModeInfo)
     454                {
     455                    /* no pinned mode set, do adjustment */
     456                    /* first iterate to see if there is anything that should be removed/added
     457                     * if yes, create a new mode set and populate it with the necessary info */
     458
     459                    Status = vboxVidPnEnumSourceModes(pDevExt, hDesiredVidPn, pVidPnInterface,
     460                        hNewVidPnSourceModeSet, pVidPnSourceModeSetInterface,
     461                        vboxVidPnCofuncModalitySourceModeEnum, pCbContext);
     462                    Assert(Status == STATUS_SUCCESS);
     463                    if (Status == STATUS_SUCCESS)
     464                    {
     465                        Status = pCbContext->Status;
     466                        Assert(Status == STATUS_SUCCESS);
     467                        if (Status != STATUS_SUCCESS)
     468                            drprintf((__FUNCTION__": vboxVidPnCofuncModalitySourceModeEnum failed Status(0x%x)\n", Status));
     469                    }
     470                    else
     471                        drprintf((__FUNCTION__": vboxVidPnEnumSourceModes failed Status(0x%x)\n", Status));
     472                }
     473
    411474                /* nothing to be done here, just release */
    412475                pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
    413476            }
    414477            else
    415             {
    416                 /* no pinned mode set, do adjustment */
    417                 Status = vboxVidPnEnumSourceModes(pDevExt, hDesiredVidPn, pVidPnInterface,
    418                         hNewVidPnSourceModeSet, pVidPnSourceModeSetInterface,
    419                         vboxVidPnCofuncModalitySourceModeEnum, pCbContext);
    420                 Assert(Status == STATUS_SUCCESS);
    421                 if (Status == STATUS_SUCCESS)
    422                 {
    423                     Status = pCbContext->Status;
    424                     Assert(Status == STATUS_SUCCESS);
    425                     if (Status != STATUS_SUCCESS)
    426                         drprintf((__FUNCTION__": vboxVidPnCofuncModalitySourceModeEnum failed Status(0x%x)\n", Status));
    427                 }
    428                 else
    429                     drprintf((__FUNCTION__": vboxVidPnEnumSourceModes failed Status(0x%x)\n", Status));
    430             }
     478                drprintf((__FUNCTION__": pfnAcquirePinnedModeInfo failed Status(0x%x)\n", Status));
     479
     480            pVidPnInterface->pfnReleaseSourceModeSet(hDesiredVidPn, hNewVidPnSourceModeSet);
    431481        }
    432482        else
    433             drprintf((__FUNCTION__": pfnAcquirePinnedModeInfo failed Status(0x%x)\n", Status));
    434 
    435         pVidPnInterface->pfnReleaseSourceModeSet(hDesiredVidPn, hNewVidPnSourceModeSet);
    436     }
    437     else
    438         drprintf((__FUNCTION__": pfnAcquireSourceModeSet failed Status(0x%x)\n", Status));
     483            drprintf((__FUNCTION__": pfnAcquireSourceModeSet failed Status(0x%x)\n", Status));
     484    }
    439485
    440486    if (Status == STATUS_SUCCESS)
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r26145 r26179  
    3838{
    3939    ExFreePool(pvMem);
     40}
     41
     42#define VBOXWDDM_REG_DRVKEY_PREFIX L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\"
     43
     44NTSTATUS vboxWddmRegQueryDrvKeyName(PDEVICE_EXTENSION pDevExt, ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult)
     45{
     46    WCHAR fallBackBuf[2];
     47    PWCHAR pSuffix;
     48    bool bFallback = false;
     49
     50    if (cbBuf > sizeof(VBOXWDDM_REG_DRVKEY_PREFIX))
     51    {
     52        wcscpy(pBuf, VBOXWDDM_REG_DRVKEY_PREFIX);
     53        pSuffix = pBuf + (sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2);
     54        cbBuf -= sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2;
     55    }
     56    else
     57    {
     58        pSuffix = fallBackBuf;
     59        cbBuf = sizeof (fallBackBuf);
     60        bFallback = true;
     61    }
     62
     63    NTSTATUS Status = IoGetDeviceProperty (pDevExt->pPDO,
     64                                  DevicePropertyDriverKeyName,
     65                                  cbBuf,
     66                                  pSuffix,
     67                                  &cbBuf);
     68    if (Status == STATUS_SUCCESS && bFallback)
     69        Status = STATUS_BUFFER_TOO_SMALL;
     70    if (Status == STATUS_BUFFER_TOO_SMALL)
     71        *pcbResult = cbBuf + sizeof (VBOXWDDM_REG_DRVKEY_PREFIX)-2;
     72
     73    return Status;
     74}
     75
     76NTSTATUS vboxWddmRegOpenKey(OUT PHANDLE phKey, IN PWCHAR pName, IN ACCESS_MASK fAccess)
     77{
     78    OBJECT_ATTRIBUTES ObjAttr;
     79    UNICODE_STRING RtlStr;
     80    RtlStr.Buffer = pName;
     81    RtlStr.Length = USHORT(wcslen(pName) * sizeof(WCHAR));
     82    RtlStr.MaximumLength = RtlStr.Length + sizeof(WCHAR);
     83
     84    InitializeObjectAttributes(&ObjAttr, &RtlStr, OBJ_CASE_INSENSITIVE, NULL, NULL);
     85
     86    return ZwOpenKey(phKey, fAccess, &ObjAttr);
     87}
     88
     89NTSTATUS vboxWddmRegQueryValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT PDWORD pDword)
     90{
     91    UCHAR Buf[32]; /* should be enough */
     92    ULONG cbBuf;
     93    PKEY_VALUE_PARTIAL_INFORMATION pInfo = (PKEY_VALUE_PARTIAL_INFORMATION)Buf;
     94    UNICODE_STRING RtlStr;
     95    RtlStr.Buffer = pName;
     96    RtlStr.Length = USHORT(wcslen(pName) * sizeof(WCHAR));
     97    RtlStr.MaximumLength = RtlStr.Length + sizeof(WCHAR);
     98    NTSTATUS Status = ZwQueryValueKey(hKey,
     99                &RtlStr,
     100                KeyValuePartialInformation,
     101                pInfo,
     102                sizeof(Buf),
     103                &cbBuf);
     104    if (Status == STATUS_SUCCESS)
     105    {
     106        if (pInfo->Type == REG_DWORD)
     107        {
     108            Assert(pInfo->DataLength == 4);
     109            *pDword = *((PULONG)pInfo->Data);
     110            return STATUS_SUCCESS;
     111        }
     112    }
     113
     114    return STATUS_INVALID_PARAMETER;
     115}
     116
     117NTSTATUS vboxWddmRegSetValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT DWORD val)
     118{
     119    UCHAR Buf[32]; /* should be enough */
     120    PKEY_VALUE_PARTIAL_INFORMATION pInfo = (PKEY_VALUE_PARTIAL_INFORMATION)Buf;
     121    UNICODE_STRING RtlStr;
     122    RtlStr.Buffer = pName;
     123    RtlStr.Length = USHORT(wcslen(pName) * sizeof(WCHAR));
     124    RtlStr.MaximumLength = RtlStr.Length + sizeof(WCHAR);
     125    return ZwSetValueKey(hKey, &RtlStr,
     126            NULL, /* IN ULONG  TitleIndex  OPTIONAL, reserved */
     127            REG_DWORD,
     128            &val,
     129            sizeof(val));
     130}
     131
     132VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal)
     133{
     134    if(!Reg)
     135        return ERROR_INVALID_PARAMETER;
     136    NTSTATUS Status = vboxWddmRegQueryValueDword(Reg, pName, (PDWORD)pVal);
     137    return Status == STATUS_SUCCESS ? NO_ERROR : ERROR_INVALID_PARAMETER;
     138}
     139
     140VP_STATUS VBoxVideoCmnRegSetDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t Val)
     141{
     142    if(!Reg)
     143        return ERROR_INVALID_PARAMETER;
     144    NTSTATUS Status = vboxWddmRegSetValueDword(Reg, pName, Val);
     145    return Status == STATUS_SUCCESS ? NO_ERROR : ERROR_INVALID_PARAMETER;
     146}
     147
     148VP_STATUS VBoxVideoCmnRegInit(IN PDEVICE_EXTENSION pDeviceExtension, OUT VBOXCMNREG *pReg)
     149{
     150    WCHAR Buf[512];
     151    ULONG cbBuf = sizeof(Buf);
     152    NTSTATUS Status = vboxWddmRegQueryDrvKeyName(pDeviceExtension, cbBuf, Buf, &cbBuf);
     153    Assert(Status == STATUS_SUCCESS);
     154    if (Status == STATUS_SUCCESS)
     155    {
     156        Status = vboxWddmRegOpenKey(pReg, Buf, GENERIC_READ | GENERIC_WRITE);
     157        Assert(Status == STATUS_SUCCESS);
     158        if(Status == STATUS_SUCCESS)
     159            return NO_ERROR;
     160    }
     161
     162    /* fall-back to make the subsequent VBoxVideoCmnRegXxx calls treat the fail accordingly
     163     * basically needed to make as less modifications to the current XPDM code as possible */
     164    *pReg = NULL;
     165
     166    return ERROR_INVALID_PARAMETER;
    40167}
    41168
     
    174301    if (pContext)
    175302    {
     303        pContext->pPDO = PhysicalDeviceObject;
    176304        *MiniportDeviceContext = pContext;
    177305    }
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