Changeset 32766 in vbox
- Timestamp:
- Sep 24, 2010 5:40:03 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 66214
- 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 89 89 endif 90 90 endif 91 #VBoxVideoWddm_DEFS += LOG_ENABLED 91 ifdef DEBUG_misha 92 VBoxVideoWddm_DEFS += LOG_ENABLED 93 endif 92 94 #VBoxVideoWddm_DEFS += VBOX_WITH_MULTIMONITOR_FIX 93 95 #VBoxVideoWddm_DEFS += LOG_TO_BACKDOOR -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
r32677 r32766 305 305 #ifdef VBOX_WITH_WDDM 306 306 PDEVICE_OBJECT pPDO; 307 UNICODE_STRING RegKeyName; 308 UNICODE_STRING VideoGuid; 307 309 308 310 uint8_t * pvVisibleVram; -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoMisc.cpp
r32650 r32766 12 12 13 13 #include "../VBoxVideo.h" 14 #include "../Helper.h" 14 15 15 16 #include <iprt/asm.h> 17 18 #include <stdio.h> 16 19 17 20 NTSTATUS vboxWddmHTableCreate(PVBOXWDDM_HTABLE pTbl, uint32_t cSize) … … 458 461 return STATUS_SUCCESS; 459 462 } 463 464 #define VBOXWDDM_REG_DRVKEY_PREFIX L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\" 465 466 NTSTATUS 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 505 NTSTATUS 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 550 NTSTATUS 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 635 NTSTATUS 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 646 NTSTATUS 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 667 NTSTATUS 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 680 NTSTATUS 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 693 NTSTATUS 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 719 NTSTATUS 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 748 NTSTATUS 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 60 60 NTSTATUS vboxWddmSwapchainCtxEscape(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXDISPIFESCAPE_SWAPCHAININFO pSwapchainInfo, UINT cbSize); 61 61 62 63 NTSTATUS vboxWddmRegQueryDisplaySettingsKeyName(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, 64 ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult); 65 NTSTATUS vboxWddmRegOpenDisplaySettingsKey(IN PDEVICE_EXTENSION pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, OUT PHANDLE phKey); 66 NTSTATUS vboxWddmRegDisplaySettingsQueryRelX(HANDLE hKey, int * pResult); 67 NTSTATUS vboxWddmRegDisplaySettingsQueryRelY(HANDLE hKey, int * pResult); 68 NTSTATUS vboxWddmDisplaySettingsQueryPos(IN PDEVICE_EXTENSION pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, POINT * pPos); 69 NTSTATUS vboxWddmRegQueryVideoGuidString(ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult); 70 71 NTSTATUS vboxWddmRegQueryDrvKeyName(PDEVICE_EXTENSION pDevExt, ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult); 72 73 NTSTATUS vboxWddmRegOpenKey(OUT PHANDLE phKey, IN PWCHAR pName, IN ACCESS_MASK fAccess); 74 NTSTATUS vboxWddmRegQueryValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT PDWORD pDword); 75 NTSTATUS vboxWddmRegSetValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT DWORD val); 62 76 #endif /* #ifndef ___VBoxVideoMisc_h__ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
r32697 r32766 185 185 } 186 186 187 NTSTATUS vboxWddmGhDisplaySetInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource )187 NTSTATUS vboxWddmGhDisplaySetInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId) 188 188 { 189 189 PVBOXWDDM_ALLOCATION pAllocation = VBOXWDDM_FB_ALLOCATION(pSource); … … 196 196 * Set the current mode into the hardware. 197 197 */ 198 NTSTATUS Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocation); 198 NTSTATUS Status= vboxWddmDisplaySettingsQueryPos(pDevExt, VidPnSourceId, &pSource->VScreenPos); 199 Assert(Status == STATUS_SUCCESS); 200 Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocation); 199 201 Assert(Status == STATUS_SUCCESS); 200 202 if (Status == STATUS_SUCCESS) … … 219 221 220 222 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 221 bool vboxWddmCheckUpdateShadowAddress(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, UINT SegmentId, VBOXVIDEOOFFSET offVram) 223 bool vboxWddmCheckUpdateShadowAddress(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, 224 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, UINT SegmentId, VBOXVIDEOOFFSET offVram) 222 225 { 223 226 if (pSource->pPrimaryAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC) … … 232 235 pSource->pShadowAllocation->offVram = offVram; 233 236 234 NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource );237 NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, VidPnSourceId); 235 238 Assert(Status == STATUS_SUCCESS); 236 239 if (Status != STATUS_SUCCESS) … … 272 275 } 273 276 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 else290 {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 }364 277 365 278 VP_STATUS VBoxVideoCmnRegQueryDword(IN VBOXCMNREG Reg, PWSTR pName, uint32_t *pVal) … … 542 455 memset(pDevExt, 0, sizeof (DEVICE_EXTENSION)); 543 456 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); 544 461 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 545 462 for (int i = 0; i < RT_ELEMENTS(pDevExt->aSources); ++i) … … 564 481 565 482 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)); 580 522 581 523 return Status; … … 2181 2123 PVBOXWDDM_ALLOCATION pSrcAlloc = pPrivateData->SrcAllocInfo.pAlloc; 2182 2124 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); 2184 2127 PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW pRFS = (PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW)pPrivateData; 2185 2128 uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding); … … 2224 2167 Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM); 2225 2168 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); 2227 2171 if (pBlt->DstRects.UpdateRects.cRects) 2228 2172 { … … 3382 3326 #endif 3383 3327 /* should not generally happen, but still inform host*/ 3384 Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource );3328 Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, pSetVidPnSourceAddress->VidPnSourceId); 3385 3329 Assert(Status == STATUS_SUCCESS); 3386 3330 if (Status != STATUS_SUCCESS) … … 3447 3391 pSource->offVram = VBOXVIDEOOFFSET_VOID; 3448 3392 #endif 3449 Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource );3393 Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, pSetVidPnSourceVisibility->VidPnSourceId); 3450 3394 Assert(Status == STATUS_SUCCESS); 3451 3395 if (Status != STATUS_SUCCESS) … … 4531 4475 Assert(pCreateContext->Flags.Value <= 2); /* 2 is a GDI context in Win7 */ 4532 4476 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 } 4533 4481 } 4534 4482 else
Note:
See TracChangeset
for help on using the changeset viewer.