NTSTATUS vboxWddmRegOpenDisplaySettingsKey(IN PVBOXMP_DEVEXT pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, OUT PHANDLE phKey) { WCHAR Buf[512]; ULONG cbBuf = sizeof(Buf); NTSTATUS Status = vboxWddmRegQueryDisplaySettingsKeyName(pDeviceExtension, VidPnSourceId, cbBuf, Buf, &cbBuf); Assert(Status == STATUS_SUCCESS); if (Status == STATUS_SUCCESS) { Status = vboxWddmRegOpenKey(phKey, Buf, GENERIC_READ); Assert(Status == STATUS_SUCCESS); if(Status == STATUS_SUCCESS) return STATUS_SUCCESS; } /* fall-back to make the subsequent VBoxVideoCmnRegXxx calls treat the fail accordingly * basically needed to make as less modifications to the current XPDM code as possible */ *phKey = NULL; return Status; }
VP_STATUS VBoxMPCmnRegInit(IN PVBOXMP_DEVEXT pExt, OUT VBOXMPCMNREGISTRY *pReg) { WCHAR Buf[512]; ULONG cbBuf = sizeof(Buf); NTSTATUS Status = vboxWddmRegQueryDrvKeyName(pExt, cbBuf, Buf, &cbBuf); Assert(Status == STATUS_SUCCESS); if (Status == STATUS_SUCCESS) { Status = vboxWddmRegOpenKey(pReg, Buf, GENERIC_READ | GENERIC_WRITE); Assert(Status == STATUS_SUCCESS); if(Status == STATUS_SUCCESS) return NO_ERROR; } /* fall-back to make the subsequent VBoxVideoCmnRegXxx calls treat the fail accordingly * basically needed to make as less modifications to the current XPDM code as possible */ *pReg = NULL; return ERROR_INVALID_PARAMETER; }
NTSTATUS vboxWddmRegQueryVideoGuidString(ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult) { HANDLE hKey; NTSTATUS Status = vboxWddmRegOpenKey(&hKey, VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY, GENERIC_READ); Assert(Status == STATUS_SUCCESS); if (Status == STATUS_SUCCESS) { struct { KEY_BASIC_INFORMATION Name; WCHAR Buf[256]; } Buf; WCHAR KeyBuf[sizeof (VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY)/2 + 256 + 64]; wcscpy(KeyBuf, VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY); ULONG ResultLength; BOOL bFound = FALSE; for (ULONG i = 0; !bFound; ++i) { RtlZeroMemory(&Buf, sizeof (Buf)); Status = ZwEnumerateKey(hKey, i, KeyBasicInformation, &Buf, sizeof (Buf), &ResultLength); Assert(Status == STATUS_SUCCESS); /* we should not encounter STATUS_NO_MORE_ENTRIES here since this would mean we did not find our entry */ if (Status != STATUS_SUCCESS) break; HANDLE hSubKey; PWCHAR pSubBuf = KeyBuf + (sizeof (VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY) - 2)/2; memcpy(pSubBuf, Buf.Name.Name, Buf.Name.NameLength); pSubBuf += Buf.Name.NameLength/2; memcpy(pSubBuf, VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY_SUBKEY, sizeof (VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY_SUBKEY)); Status = vboxWddmRegOpenKey(&hSubKey, KeyBuf, GENERIC_READ); Assert(Status == STATUS_SUCCESS); if (Status == STATUS_SUCCESS) { struct { KEY_VALUE_PARTIAL_INFORMATION Info; UCHAR Buf[sizeof (L"VBoxVideoWddm")]; /* should be enough */ } KeyData; ULONG cbResult; UNICODE_STRING RtlStr; RtlInitUnicodeString(&RtlStr, L"Service"); Status = ZwQueryValueKey(hSubKey, &RtlStr, KeyValuePartialInformation, &KeyData.Info, sizeof(KeyData), &cbResult); Assert(Status == STATUS_SUCCESS || STATUS_BUFFER_TOO_SMALL || STATUS_BUFFER_OVERFLOW); if (Status == STATUS_SUCCESS) { if (KeyData.Info.Type == REG_SZ) { if (KeyData.Info.DataLength == sizeof (L"VBoxVideoWddm")) { if (!wcscmp(L"VBoxVideoWddm", (PWCHAR)KeyData.Info.Data)) { bFound = TRUE; *pcbResult = Buf.Name.NameLength + 2; if (cbBuf >= Buf.Name.NameLength + 2) { memcpy(pBuf, Buf.Name.Name, Buf.Name.NameLength + 2); } else { Status = STATUS_BUFFER_TOO_SMALL; } } } } } NTSTATUS tmpStatus = ZwClose(hSubKey); Assert(tmpStatus == STATUS_SUCCESS); } else break; } NTSTATUS tmpStatus = ZwClose(hKey); Assert(tmpStatus == STATUS_SUCCESS); } return Status; }