40 WCHAR awcDeviceKey[256], awcServiceName[100];
50 ERR(
"Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key: 0x%08lx\n",
Status);
55 cbValue =
sizeof(awcDeviceKey);
60 ERR(
"Could not read '%S' registry value: 0x%08lx\n",
Status);
65 lastBkSlash =
wcsrchr(awcDeviceKey,
L'\\');
68 ERR(
"Invalid registry key '%S'\n", lastBkSlash);
72 ARRAYSIZE(awcDeviceKey) - (lastBkSlash + 1 - awcDeviceKey),
75 ERR(
"Failed to add 'Video' to registry key '%S'\n", awcDeviceKey);
83 ERR(
"Could not open %S registry key: 0x%08lx\n", awcDeviceKey,
Status);
88 cbValue =
sizeof(awcServiceName);
93 ERR(
"Could not read Service registry value in %S: 0x%08lx\n", awcDeviceKey,
Status);
98 return (
_wcsicmp(awcServiceName,
L"VGASave") == 0);
107EngpLinkGraphicsDevice(
112 TRACE(
"EngLinkGraphicsDevice(%p)\n", pToAdd);
119 if (pGraphicsDevice == pToAdd)
123 pToAdd->pNextGraphicsDevice =
NULL;
137EngpUnlinkGraphicsDevice(
143 TRACE(
"EngpUnlinkGraphicsDevice('%S')\n", pToDelete->szNtDeviceName);
145 while (pGraphicsDevice)
147 if (pGraphicsDevice != pToDelete)
150 pPrevGraphicsDevice = pGraphicsDevice;
157 EngpLinkGraphicsDevice(pGraphicsDevice->
pVgaDevice);
163 if (!pPrevGraphicsDevice)
176 ULONG iDevNum, iVGACompatible = -1, ulMaxObjectNumber = 0;
177 WCHAR awcDeviceName[20], awcWinDeviceName[20];
179 WCHAR awcBuffer[256];
190 ERR(
"Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key:0x%lx\n",
Status);
195 cbValue =
sizeof(awcDeviceName);
199 iVGACompatible =
_wtoi(&awcDeviceName[
sizeof(
"\\Device\\Video")-1]);
200 ERR(
"VGA adapter = %lu\n", iVGACompatible);
204 if (!
RegReadDWORD(hkey,
L"MaxObjectNumber", &ulMaxObjectNumber))
206 ERR(
"Could not read MaxObjectNumber, defaulting to 0.\n");
209 TRACE(
"Found %lu devices\n", ulMaxObjectNumber + 1);
212 for (iDevNum = 0; iDevNum <= ulMaxObjectNumber; iDevNum++)
215 swprintf(awcDeviceName,
L"\\Device\\Video%lu", iDevNum);
218 swprintf(awcWinDeviceName,
L"\\\\.\\DISPLAY%lu", iDevNum + 1);
223 if (pGraphicsDevice !=
NULL)
229 cbValue =
sizeof(awcBuffer);
233 ERR(
"failed to query the registry path:0x%lx\n",
Status);
239 if (!pGraphicsDevice)
continue;
251 bFoundNewDevice =
TRUE;
285 while (pGraphicsDevice)
290 pToDelete = pGraphicsDevice;
293 EngpUnlinkGraphicsDevice(pGraphicsDevice);
319 static const PWCHAR KEY_VIDEO =
L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP\\VIDEO";
321 WCHAR szDeviceKey[256];
329 ERR(
"Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key: status 0x%08x\n",
Status);
334 cbSize =
sizeof(szDeviceKey);
336 pGraphicsDevice->szNtDeviceName,
346 ERR(
"Could not open registry key '%S': status 0x%08x\n", szDeviceKey,
Status);
362#define READ(field, str) \
365 RTL_QUERY_REGISTRY_DIRECT, \
370 READ(dmBitsPerPel,
"DefaultSettings.BitsPerPel")
371 READ(dmPelsWidth,
"DefaultSettings.XResolution")
372 READ(dmPelsHeight,
"DefaultSettings.YResolution")
373 READ(dmDisplayFlags,
"DefaultSettings.Flags")
374 READ(dmDisplayFrequency,
"DefaultSettings.VRefresh")
375 READ(dmPanningWidth,
"DefaultSettings.XPanning")
376 READ(dmPanningHeight,
"DefaultSettings.YPanning")
377 READ(dmDisplayOrientation,
"DefaultSettings.Orientation")
378 READ(dmDisplayFixedOutput,
"DefaultSettings.FixedOutput")
379 READ(dmPosition.x,
"Attach.RelativeX")
380 READ(dmPosition.y,
"Attach.RelativeY")
391 DisplaySettingsTable,
404 DWORD dwAccelerationLevel = 0;
410 L"Acceleration.Level",
411 &dwAccelerationLevel,
423 DisplaySettingsTable,
428 return dwAccelerationLevel;
448 TRACE(
"VideoPortCallout(0x%p, 0x%x)\n",
449 CallbackParams, CallbackParams ? CallbackParams->
CalloutType : -1);
458 TRACE(
"VideoPortCallout: VideoFindAdapterCallout called - Param = %s\n",
459 CallbackParams->
Param ?
"TRUE" :
"FALSE");
484 ERR(
"VideoPortCallout: CalloutType 0x%x is UNIMPLEMENTED!\n", CallbackParams->
CalloutType);
489 ERR(
"VideoPortCallout: Unknown CalloutType 0x%x\n", CallbackParams->
CalloutType);
511 TRACE(
"EngpRegisterGraphicsDevice(%wZ)\n", pustrDeviceName);
517 if (!pGraphicsDevice)
519 ERR(
"ExAllocatePoolWithTag failed\n");
530 ERR(
"Could not open device %wZ, 0x%lx\n", pustrDeviceName,
Status);
540 Win32kCallbacks.
PhysDisp = pGraphicsDevice;
549 sizeof(Win32kCallbacks),
551 sizeof(Win32kCallbacks),
555 ERR(
"EngDeviceIoControl(0x%p, IOCTL_VIDEO_INIT_WIN32K_CALLBACKS) failed, Status 0x%lx\n",
579 pustrDeviceName->Buffer,
580 pustrDeviceName->Length);
589 cj = pustrDiplayDrivers->Length + pustrDescription->Length +
sizeof(
WCHAR);
593 ERR(
"Could not allocate string buffer\n");
602 pustrDiplayDrivers->Buffer,
603 pustrDiplayDrivers->Length);
608 pustrDescription->Buffer,
609 pustrDescription->Length);
616 EngpLinkGraphicsDevice(pGraphicsDevice);
636 return pGraphicsDevice;
648 TRACE(
"EngpFindGraphicsDevice('%wZ', %lu)\n",
649 pustrDevice, iDevNum);
654 if (pustrDevice && pustrDevice->Buffer)
673 if (iDevNum >= pGraphicsDevice->
dwMonCnt)
674 pGraphicsDevice =
NULL;
684 pGraphicsDevice &&
i < iDevNum;
691 return pGraphicsDevice;
722 liStartOffset.
QuadPart = ullStartOffset;
746 *lpInformation =
Iosb.Information;
806 (
ULONG)nInBufferSize,
808 (
ULONG)nOutBufferSize,
828 *lpInformation =
Iosb.Information;
855 TRACE(
"EngDeviceIoControl() called\n");
885 TRACE(
"EngDeviceIoControl(): Returning %X/%X\n",
Iosb.Status,
#define DBG_DEFAULT_CHANNEL(ch)
#define _Requires_lock_held_(lock)
#define STATUS_NOT_IMPLEMENTED
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
HDC FASTCALL IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING pustrDevice, PVOID pUMdhpdev, CONST PDEVMODEW pdmInit, BOOL CreateAsIC)
#define ERROR_DEV_NOT_EXIST
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INSUFFICIENT_BUFFER
#define ERROR_INVALID_FUNCTION
#define NT_SUCCESS(StatCode)
#define ERROR_INVALID_PARAMETER
#define ERROR_INVALID_HANDLE
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
struct _DEVICE_OBJECT * PDEVICE_OBJECT
#define KeInitializeEvent(pEvt, foo, foo2)
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
HSEMAPHORE WINAPI EngCreateSemaphore(VOID)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define ExFreePoolWithTag(_P, _T)
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
_In_ PNDIS_STRING _In_ PNDIS_STRING _Out_ PDEVICE_OBJECT * pDeviceObject
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define _Out_writes_bytes_opt_(s)
#define _In_reads_bytes_opt_(s)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define RTL_QUERY_REGISTRY_DIRECT
#define RTL_REGISTRY_HANDLE
@ VideoEnumChildPdoNotifyCallout
@ VideoPowerNotifyCallout
@ VideoDxgkFindAdapterTdrCallout
@ VideoDxgkMonitorEventCallout
@ VideoChangeDisplaySettingsCallout
@ VideoDisplaySwitchCallout
@ VideoDxgkDisplaySwitchCallout
@ VideoFindAdapterCallout
struct _VIDEO_WIN32K_CALLBACKS_PARAMS * PVIDEO_WIN32K_CALLBACKS_PARAMS
#define IOCTL_VIDEO_INIT_WIN32K_CALLBACKS
PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
#define STATUS_DEVICE_DOES_NOT_EXIST
NTSTRSAFEAPI RtlStringCchCopyW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
NTSTRSAFEAPI RtlStringCbCopyNW(_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, _In_ size_t cbToCopy)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
struct _GRAPHICS_DEVICE * pVgaDevice
WCHAR szWinDeviceName[CCHDEVICENAME/2]
WCHAR szNtDeviceName[CCHDEVICENAME/2]
struct _GRAPHICS_DEVICE * pNextGraphicsDevice
PDEVICE_OBJECT DeviceObject
PDEVICE_OBJECT PhysDeviceHandle
VIDEO_WIN32K_CALLBACKS_PARAMS_TYPE CalloutType
IN PVIDEO_WIN32K_CALLOUT Callout
OUT HANDLE pPhysDeviceObject
#define RTL_CONSTANT_STRING(s)
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
static PGRAPHICS_DEVICE gpGraphicsDeviceLast
PGRAPHICS_DEVICE NTAPI EngpRegisterGraphicsDevice(_In_ PUNICODE_STRING pustrDeviceName, _In_ PUNICODE_STRING pustrDiplayDrivers, _In_ PUNICODE_STRING pustrDescription)
NTSTATUS EngpGetDisplayDriverParameters(_In_ PGRAPHICS_DEVICE pGraphicsDevice, _Out_ PDEVMODEW pdm)
static HKEY EngpGetRegistryHandleFromDeviceMap(_In_ PGRAPHICS_DEVICE pGraphicsDevice)
static BOOLEAN EngpHasVgaDriver(_In_ PGRAPHICS_DEVICE pGraphicsDevice)
VOID UserRefreshDisplay(IN PPDEVOBJ ppdev)
DWORD EngpGetDisplayDriverAccelerationLevel(_In_ PGRAPHICS_DEVICE pGraphicsDevice)
VOID NTAPI VideoPortCallout(_In_ PVOID Params)
PGRAPHICS_DEVICE NTAPI EngpFindGraphicsDevice(_In_opt_ PUNICODE_STRING pustrDevice, _In_ ULONG iDevNum)
static NTSTATUS EngpFileIoRequest(_In_ PFILE_OBJECT pFileObject, _In_ ULONG ulMajorFunction, _In_reads_(nBufferSize) PVOID lpBuffer, _In_ SIZE_T nBufferSize, _In_ ULONGLONG ullStartOffset, _Out_ PULONG_PTR lpInformation)
static PGRAPHICS_DEVICE gpGraphicsDeviceFirst
NTSTATUS EngpUpdateGraphicsDeviceList(VOID)
VOID APIENTRY EngFileWrite(_In_ PFILE_OBJECT pFileObject, _In_reads_(nLength) PVOID lpBuffer, _In_ SIZE_T nLength, _Out_ PSIZE_T lpBytesWritten)
static PGRAPHICS_DEVICE gpPrimaryGraphicsDevice
static HSEMAPHORE ghsemGraphicsDeviceList
NTSTATUS NTAPI InitDeviceImpl(VOID)
static PGRAPHICS_DEVICE gpVgaGraphicsDevice
_In_ DWORD dwIoControlCode
BOOL NTAPI RegReadDWORD(HKEY hkey, PCWSTR pwszValue, PDWORD pdwData)
BOOL FASTCALL IntPaintDesktop(HDC hDC)
PGRAPHICS_DEVICE NTAPI InitDisplayDriver(IN PWSTR pwszDeviceName, IN PWSTR pwszRegKey)
static const PWCHAR KEY_VIDEO
_In_ DWORD _In_ DWORD _In_ DWORD cjOutBufferSize
_In_ DWORD _In_ DWORD _In_ DWORD _Out_ LPDWORD lpBytesReturned
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
_In_ DWORD _In_ DWORD cjInBufferSize
#define DISPLAY_DEVICE_VGA_COMPATIBLE