diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp index 0514643..845341e 100755 --- a/qxldod/QxlDod.cpp +++ b/qxldod/QxlDod.cpp @@ -98,7 +98,8 @@ NTSTATUS QxlDod::CheckHardware() Status = STATUS_GRAPHICS_DRIVER_MISMATCH; if (Header.VendorID == REDHAT_PCI_VENDOR_ID && Header.DeviceID == 0x0100 && - Header.RevisionID == 4) + Header.RevisionID == 4 && + m_VgaCompatible == 0) { Status = STATUS_SUCCESS; } @@ -391,16 +392,18 @@ NTSTATUS QxlDod::QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAda DXGK_DRIVERCAPS* pDriverCaps = (DXGK_DRIVERCAPS*)pQueryAdapterInfo->pOutputData; - RtlZeroMemory(pDriverCaps, pQueryAdapterInfo->OutputDataSize/*sizeof(DXGK_DRIVERCAPS)*/); + RtlZeroMemory(pDriverCaps, pQueryAdapterInfo->OutputDataSize/*sizeof(DXGK_DRIVERCAPS)*/); pDriverCaps->WDDMVersion = DXGKDDI_WDDMv1_2; pDriverCaps->HighestAcceptableAddress.QuadPart = -1; + pDriverCaps->SupportNonVGA = TRUE; - if (m_pHWDevice->EnablePointer()) { + if (m_pHWDevice->EnablePointer() && m_PointerCaps) { pDriverCaps->MaxPointerWidth = POINTER_SIZE; pDriverCaps->MaxPointerHeight = POINTER_SIZE; - pDriverCaps->PointerCaps.Monochrome = 1; - pDriverCaps->PointerCaps.Color = 1; + pDriverCaps->PointerCaps.Monochrome = m_PointerCaps & 0x00000001; + pDriverCaps->PointerCaps.Color = m_PointerCaps & 0x00000002; + pDriverCaps->PointerCaps.MaskedColor = m_PointerCaps & 0x00000004; } DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s 1\n", __FUNCTION__)); return STATUS_SUCCESS; @@ -1870,6 +1873,56 @@ NTSTATUS QxlDod::RegisterHWInfo() return Status; } +NTSTATUS QxlDod::ReadConfiguration() +{ + PAGED_CODE(); + + NTSTATUS Status; + DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__)); + + HANDLE DevInstRegKeyHandle; + Status = IoOpenDeviceRegistryKey(m_pPhysicalDevice, PLUGPLAY_REGKEY_DRIVER, KEY_SET_VALUE, &DevInstRegKeyHandle); + if (!NT_SUCCESS(Status)) + { + DbgPrint(TRACE_LEVEL_ERROR, ("IoOpenDeviceRegistryKey failed for PDO: 0x%I64x, Status: 0x%I64x", m_pPhysicalDevice, Status)); + return Status; + } + UNICODE_STRING ValueName; + UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION)+sizeof(ULONG)]; + PKEY_VALUE_PARTIAL_INFORMATION Value = (PKEY_VALUE_PARTIAL_INFORMATION)Buffer; + ULONG ValueLength = sizeof(Buffer); + ULONG ResultLength; + ULONG Length; + + RtlInitUnicodeString(&ValueName, L"VgaCompatible"); + + Status = ZwQueryValueKey(DevInstRegKeyHandle, + &ValueName, + KeyValuePartialInformation, + Value, + ValueLength, + &ResultLength); + + if (NT_SUCCESS(Status)) { + m_VgaCompatible = *(PULONG)(Value->Data); + } + + RtlInitUnicodeString(&ValueName, L"PointerCaps"); + + Status = ZwQueryValueKey(DevInstRegKeyHandle, + &ValueName, + KeyValuePartialInformation, + Value, + ValueLength, + &ResultLength); + + if (NT_SUCCESS(Status)) { + m_PointerCaps = *(PULONG)(Value->Data); + } + + DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__)); + return Status; +} // // Non-Paged Code diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h index ae0b4c0..31145c3 100755 --- a/qxldod/QxlDod.h +++ b/qxldod/QxlDod.h @@ -417,7 +417,7 @@ public: NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo); NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo); NTSTATUS HWClose(void); - BOOLEAN EnablePointer(void) { return FALSE; } + BOOLEAN EnablePointer(void) { return TRUE; } NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE* DstAddr, _In_ UINT DstBitPerPixel, _In_ BYTE* SrcAddr, @@ -561,6 +561,8 @@ private: D3DDDI_VIDEO_PRESENT_SOURCE_ID m_SystemDisplaySourceId; DXGKARG_SETPOINTERSHAPE m_PointerShape; HwDeviceIntrface* m_pHWDevice; + DWORD m_VgaCompatible; + DWORD m_PointerCaps; public: QxlDod(_In_ DEVICE_OBJECT* pPhysicalDeviceObject); ~QxlDod(void); @@ -679,6 +681,7 @@ private: NTSTATUS IsVidPnSourceModeFieldsValid(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode) const; NTSTATUS IsVidPnPathFieldsValid(CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath) const; NTSTATUS RegisterHWInfo(); + NTSTATUS ReadConfiguration(); }; NTSTATUS diff --git a/qxldod/driver.cpp b/qxldod/driver.cpp index e8f48f2..48bf346 100755 --- a/qxldod/driver.cpp +++ b/qxldod/driver.cpp @@ -28,7 +28,7 @@ DriverEntry( // Initialize DDI function pointers and dxgkrnl KMDDOD_INITIALIZATION_DATA InitialData = {0}; - InitialData.Version = DXGKDDI_INTERFACE_VERSION; + InitialData.Version = DXGKDDI_INTERFACE_VERSION; InitialData.DxgkDdiAddDevice = DodAddDevice; InitialData.DxgkDdiStartDevice = DodStartDevice; diff --git a/qxldod/qxldod.inf b/qxldod/qxldod.inf index af324ea..197d6d4 100755 Binary files a/qxldod/qxldod.inf and b/qxldod/qxldod.inf differ