From 2885958174f9a742cc351c124c17610acde7dfd8 Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Sat, 6 Dec 2014 09:20:04 +1100 Subject: [PATCH] publish qxl device id --- qxldod/QxlDod.cpp | 46 ++++++++++++++++++++++++++++++++-------------- qxldod/QxlDod.h | 4 +++- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp index 0514643..26c19c3 100755 --- a/qxldod/QxlDod.cpp +++ b/qxldod/QxlDod.cpp @@ -132,14 +132,6 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo, return Status; } - Status = RegisterHWInfo(); - if (!NT_SUCCESS(Status)) - { - QXL_LOG_ASSERTION1("RegisterHWInfo failed with status 0x%X\n", - Status); - return Status; - } - // This sample driver only uses the frame buffer of the POST device. DxgkCbAcquirePostDisplayOwnership // gives you the frame buffer address and ensures that no one else is drawing to it. Be sure to give it back! Status = m_DxgkInterface.DxgkCbAcquirePostDisplayOwnership(m_DxgkInterface.DeviceHandle, &(m_CurrentModes[0].DispInfo)); @@ -169,6 +161,14 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo, return Status; } + Status = RegisterHWInfo(m_pHWDevice->GetId()); + if (!NT_SUCCESS(Status)) + { + QXL_LOG_ASSERTION1("RegisterHWInfo failed with status 0x%X\n", + Status); + return Status; + } + *pNumberOfViews = MAX_VIEWS; *pNumberOfChildren = MAX_CHILDREN; m_Flags.DriverStarted = TRUE; @@ -1805,7 +1805,7 @@ NTSTATUS QxlDod::WriteHWInfoStr(_In_ HANDLE DevInstRegKeyHandle, _In_ PCWSTR psz return Status; } -NTSTATUS QxlDod::RegisterHWInfo() +NTSTATUS QxlDod::RegisterHWInfo(ULONG Id) { PAGED_CODE(); @@ -1866,6 +1866,21 @@ NTSTATUS QxlDod::RegisterHWInfo() return Status; } + UNICODE_STRING ValueQxlDeviceID; + RtlInitUnicodeString(&ValueQxlDeviceID, L"QxlDeviceID"); + DWORD DeviceId = Id; // BDD has no access to video memory + Status = ZwSetValueKey(DevInstRegKeyHandle, + &ValueQxlDeviceID, + 0, + REG_BINARY, + &DeviceId, + sizeof(DeviceId)); + if (!NT_SUCCESS(Status)) + { + DbgPrint(TRACE_LEVEL_ERROR, ("ZwSetValueKey for MemorySize failed with Status: 0x%X\n", Status)); + return Status; + } + DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__)); return Status; } @@ -2246,6 +2261,7 @@ VgaDevice::VgaDevice(_In_ QxlDod* pQxlDod) m_ModeCount = 0; m_ModeNumbers = NULL; m_CurrentMode = 0; + m_Id = 0; } VgaDevice::~VgaDevice(void) @@ -2256,6 +2272,7 @@ VgaDevice::~VgaDevice(void) m_ModeNumbers = NULL; m_CurrentMode = 0; m_ModeCount = 0; + m_Id = 0; } BOOL VgaDevice::SetVideoModeInfo(UINT Idx, PVBE_MODEINFO pModeInfo) @@ -3000,7 +3017,7 @@ NTSTATUS QxlDevice::SetPowerState(_In_ DEVICE_POWER_STATE DevicePowerState, DXGK switch (DevicePowerState) { case PowerDeviceUnspecified: - case PowerDeviceD0: QxlInit(pDispInfo); break; + case PowerDeviceD0: QxlInit(pDispInfo); break; case PowerDeviceD1: case PowerDeviceD2: case PowerDeviceD3: QxlClose(); break; @@ -3141,6 +3158,7 @@ NTSTATUS QxlDevice::HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* m_LogBuf = m_RamHdr->log_buf; m_LogPort = m_IoBase + QXL_IO_LOG; + m_Id = m_RomHdr->id; CreateEvents(); @@ -3152,11 +3170,11 @@ NTSTATUS QxlDevice::QxlInit(DXGK_DISPLAY_INFORMATION* pDispInfo) NTSTATUS Status = STATUS_SUCCESS; if (!InitMemSlots()) { - DestroyMemSlots(); - return STATUS_UNSUCCESSFUL; - } + DestroyMemSlots(); + return STATUS_UNSUCCESSFUL; + } - Status = GetModeList(pDispInfo); + Status = GetModeList(pDispInfo); if (!NT_SUCCESS(Status)) { DbgPrint(TRACE_LEVEL_ERROR, ("GetModeList failed with status 0x%X\n", diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h index ae0b4c0..075564b 100755 --- a/qxldod/QxlDod.h +++ b/qxldod/QxlDod.h @@ -242,6 +242,7 @@ public: virtual VOID BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod) = 0; virtual NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape) = 0; virtual NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition) = 0; + ULONG GetId(void) { return m_Id; } protected: virtual NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo) = 0; protected: @@ -250,6 +251,7 @@ protected: ULONG m_ModeCount; PUSHORT m_ModeNumbers; USHORT m_CurrentMode; + ULONG m_Id; }; class VgaDevice : @@ -678,7 +680,7 @@ private: D3DDDI_VIDEO_PRESENT_SOURCE_ID FindSourceForTarget(D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId, BOOLEAN DefaultToZero); NTSTATUS IsVidPnSourceModeFieldsValid(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode) const; NTSTATUS IsVidPnPathFieldsValid(CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath) const; - NTSTATUS RegisterHWInfo(); + NTSTATUS RegisterHWInfo(_In_ ULONG Id); }; NTSTATUS