Changeset 26179 in vbox
- Timestamp:
- Feb 2, 2010 10:46:54 PM (15 years ago)
- 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 20 20 // enable backdoor logging 21 21 //#define LOG_ENABLED 22 22 #ifndef VBOXWDDM 23 23 extern "C" 24 24 { 25 #include <ntddk.h> 26 } 25 # include <ntddk.h> 26 } 27 #else 28 # include "VBoxVideo.h" 29 #endif 27 30 28 31 #include <VBox/err.h> … … 30 33 #include <VBox/VBoxGuestLib.h> 31 34 35 #ifndef VBOXWDDM 32 36 /* the video miniport headers not compatible with the NT DDK headers */ 33 37 typedef struct _VIDEO_POINTER_ATTRIBUTES … … 44 48 #define VIDEO_MODE_COLOR_POINTER 0x04 // 1 if a color hardware pointer is 45 49 // supported. 50 #endif /* #ifndef VBOXWDDM */ 46 51 47 52 #include "Helper.h" -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk
r26063 r26179 93 93 VBoxVideoHGSMI.cpp \ 94 94 VBoxVideo.cpp \ 95 Helper.cpp \ 95 96 wddm/VBoxVideoWddm.cpp \ 96 97 wddm/VBoxVideoVidPn.cpp \ -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp
r26000 r26179 149 149 } 150 150 151 VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal) 152 { 153 return VideoPortGetRegistryParameters(Reg, pName, FALSE, VBoxRegistryCallback, pVal); 154 } 155 156 VP_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 151 163 /* 152 164 * Global list of supported standard video modes. It will be … … 171 183 /* custom video mode, otherwise Windows thinks there is no mode switch */ 172 184 static int gInvocationCounter = 0; 185 186 VBOXCMNREG Reg; 187 VBoxVideoCmnRegInit(DeviceExtension, &Reg); 173 188 174 189 /* the resolution matrix */ … … 558 573 uint32_t xres, yres, bpp = 0; 559 574 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); 565 576 /* upon the first error, we give up */ 566 577 if (status != NO_ERROR) 567 578 break; 568 579 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); 574 581 /* upon the first error, we give up */ 575 582 if (status != NO_ERROR) 576 583 break; 577 584 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); 583 586 /* upon the first error, we give up */ 584 587 if (status != NO_ERROR) … … 662 665 663 666 } while(1); 664 665 667 666 668 /* … … 811 813 812 814 /* 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); 815 816 if (status != NO_ERROR) 816 817 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); 819 819 if (status != NO_ERROR) 820 820 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); 823 822 if (status != NO_ERROR) 824 823 dprintf(("VBoxVideo: error %d writing CustomBPP\n", status)); … … 860 859 } 861 860 #endif 862 } 863 864 #endif 861 862 VBoxVideoCmnRegFini(Reg); 863 } 865 864 866 865 /* 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 113 113 114 114 typedef PEVENT VBOXVCMNEVENT, *PVBOXVCMNEVENT; 115 116 typedef struct _DEVICE_EXTENSION * VBOXCMNREG; 115 117 #else 116 118 #include <VBox/VBoxVideo.h> … … 120 122 121 123 typedef KEVENT VBOXVCMNEVENT, *PVBOXVCMNEVENT; 124 125 typedef HANDLE VBOXCMNREG; 122 126 123 127 typedef enum … … 309 313 310 314 #ifdef VBOXWDDM 315 PDEVICE_OBJECT pPDO; 316 311 317 ULONG cSources; 312 318 /* currently we define the array for the max possible size since we do not know … … 430 436 pDeviceExtension->u.primary.VideoPortProcs.pfnFreePool(pDeviceExtension, Ptr); 431 437 } 438 439 DECLINLINE(VP_STATUS) VBoxVideoCmnRegInit(IN PDEVICE_EXTENSION pDeviceExtension, OUT VBOXCMNREG *pReg) 440 { 441 *pReg = pDeviceExtension->pPrimary; 442 return NO_ERROR; 443 } 444 445 DECLINLINE(VP_STATUS) VBoxVideoCmnRegFini(IN VBOXCMNREG Reg) 446 { 447 return NO_ERROR; 448 } 449 450 VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal); 451 452 VP_STATUS VBoxVideoCmnRegSetDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t Val); 453 432 454 /* */ 433 455 … … 577 599 } 578 600 601 VP_STATUS VBoxVideoCmnRegInit(IN PDEVICE_EXTENSION pDeviceExtension, OUT VBOXCMNREG *pReg); 602 603 DECLINLINE(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 612 VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal); 613 614 VP_STATUS VBoxVideoCmnRegSetDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t Val); 615 579 616 /* */ 580 617 … … 612 649 CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* pEnumCofuncModalityArg; 613 650 }VBOXVIDPNCMCONTEXT, *PVBOXVIDPNCMCONTEXT; 651 652 typedef 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 659 typedef 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; 614 667 615 668 /* !!!NOTE: The callback is responsible for releasing the path */ -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVidPn.cpp
r26053 r26179 358 358 } 359 359 360 DECLCALLBACK(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 360 375 DECLCALLBACK(BOOLEAN) vboxVidPnCofuncModalitySourceModeEnum(PDEVICE_EXTENSION pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, 361 376 D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface, … … 394 409 const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface; 395 410 PVBOXVIDPNCMCONTEXT pCbContext = (PVBOXVIDPNCMCONTEXT)pContext; 411 NTSTATUS Status = STATUS_SUCCESS; 396 412 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, 398 442 pNewVidPnPresentPathInfo->VidPnSourceId, 399 443 &hNewVidPnSourceModeSet, 400 444 &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);406 445 Assert(Status == STATUS_SUCCESS); 407 446 if (Status == STATUS_SUCCESS) 408 447 { 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 411 474 /* nothing to be done here, just release */ 412 475 pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pPinnedVidPnSourceModeInfo); 413 476 } 414 477 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); 431 481 } 432 482 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 } 439 485 440 486 if (Status == STATUS_SUCCESS) -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
r26145 r26179 38 38 { 39 39 ExFreePool(pvMem); 40 } 41 42 #define VBOXWDDM_REG_DRVKEY_PREFIX L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\" 43 44 NTSTATUS 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 76 NTSTATUS 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 89 NTSTATUS 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 117 NTSTATUS 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 132 VP_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 140 VP_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 148 VP_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; 40 167 } 41 168 … … 174 301 if (pContext) 175 302 { 303 pContext->pPDO = PhysicalDeviceObject; 176 304 *MiniportDeviceContext = pContext; 177 305 }
Note:
See TracChangeset
for help on using the changeset viewer.