ReactOS 0.4.16-dev-1255-g6dd0406
device.c File Reference
#include <win32k.h>
#include <ntddvdeo.h>
Include dependency graph for device.c:

Go to the source code of this file.

Macros

#define READ(field, str)
 

Functions

 DBG_DEFAULT_CHANNEL (EngDev)
 
NTSTATUS NTAPI InitDeviceImpl (VOID)
 
static BOOLEAN EngpHasVgaDriver (_In_ PGRAPHICS_DEVICE pGraphicsDevice)
 
 _Requires_lock_held_ (ghsemGraphicsDeviceList)
 
NTSTATUS EngpUpdateGraphicsDeviceList (VOID)
 
static HKEY EngpGetRegistryHandleFromDeviceMap (_In_ PGRAPHICS_DEVICE pGraphicsDevice)
 
NTSTATUS EngpGetDisplayDriverParameters (_In_ PGRAPHICS_DEVICE pGraphicsDevice, _Out_ PDEVMODEW pdm)
 
DWORD EngpGetDisplayDriverAccelerationLevel (_In_ PGRAPHICS_DEVICE pGraphicsDevice)
 
VOID UserRefreshDisplay (IN PPDEVOBJ ppdev)
 
VOID NTAPI VideoPortCallout (_In_ PVOID Params)
 
static NTSTATUS EngpPnPTargetRelationRequest (_In_ PDEVICE_OBJECT pDeviceObject, _Out_ PDEVICE_RELATIONS *pDeviceRelations)
 
NTSTATUS NTAPI EngpUpdateMonitorDevices (_In_ PGRAPHICS_DEVICE pGraphicsDevice)
 
PGRAPHICS_DEVICE NTAPI EngpRegisterGraphicsDevice (_In_ PUNICODE_STRING pustrDeviceName, _In_ PUNICODE_STRING pustrDiplayDrivers, _In_ PUNICODE_STRING pustrDescription)
 
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)
 
VOID APIENTRY EngFileWrite (_In_ PFILE_OBJECT pFileObject, _In_reads_(nLength) PVOID lpBuffer, _In_ SIZE_T nLength, _Out_ PSIZE_T lpBytesWritten)
 
 _Success_ (return >=0) NTSTATUS APIENTRY EngFileIoControl(_In_ PFILE_OBJECT pFileObject
 
_In_ DWORD _In_reads_ (nInBufferSize)
 
 _Success_ (return==0)
 Deletes the virtual mapping and optionally gives back the page & dirty bit.
 

Variables

static PGRAPHICS_DEVICE gpPrimaryGraphicsDevice
 
static PGRAPHICS_DEVICE gpVgaGraphicsDevice
 
static PGRAPHICS_DEVICE gpGraphicsDeviceFirst = NULL
 
static PGRAPHICS_DEVICE gpGraphicsDeviceLast = NULL
 
static HSEMAPHORE ghsemGraphicsDeviceList
 
static ULONG giDevNum = 1
 
_In_ DWORD dwIoControlCode
 

Macro Definition Documentation

◆ READ

#define READ (   field,
  str 
)
Value:
{ \
NULL, \
L ##str, \
&pdm->field, \
REG_NONE, NULL, 0 \
},
#define NULL
Definition: types.h:112
#define RTL_QUERY_REGISTRY_DIRECT
Definition: nt_native.h:144
#define REG_NONE
Definition: nt_native.h:1492
#define L(x)
Definition: ntvdm.h:50
const WCHAR * str

Function Documentation

◆ _In_reads_()

_In_ DWORD _In_reads_ ( nInBufferSize  )

Definition at line 919 of file device.c.

924{
927 PIRP pIrp;
930
931 /* Get corresponding device object */
933 if (!pDeviceObject)
934 {
936 }
937
938 /* Initialize an event */
940
941 /* Build IO control IRP */
944 lpInBuffer,
945 (ULONG)nInBufferSize,
946 lpOutBuffer,
947 (ULONG)nOutBufferSize,
948 FALSE,
949 &Event,
950 &Iosb);
951 if (!pIrp)
952 {
954 }
955
956 /* Call the driver */
958
959 /* Wait if neccessary */
960 if (Status == STATUS_PENDING)
961 {
963 Status = Iosb.Status;
964 }
965
966 /* Return information to the caller about the operation. */
967 *lpInformation = Iosb.Information;
968
969 /* This function returns NTSTATUS */
970 return Status;
971}
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_PENDING
Definition: d3dkmdt.h:43
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
return Iosb
Definition: create.c:4403
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
FxIrp * pIrp
Status
Definition: gdiplustypes.h:25
_In_ PNDIS_STRING _In_ PNDIS_STRING _Out_ PDEVICE_OBJECT * pDeviceObject
Definition: ndis.h:4679
#define KernelMode
Definition: asm.h:38
@ SynchronizationEvent
PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
Definition: device.c:1539
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)
Definition: irp.c:881
#define IoCallDriver
Definition: irp.c:1225
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ DWORD dwIoControlCode
Definition: device.c:918
@ Executive
Definition: ketypes.h:415

◆ _Requires_lock_held_()

_Requires_lock_held_ ( ghsemGraphicsDeviceList  )

Definition at line 104 of file device.c.

109{
110 PGRAPHICS_DEVICE pGraphicsDevice;
111
112 TRACE("EngLinkGraphicsDevice(%p)\n", pToAdd);
113
114 /* Search if device is not already linked */
115 for (pGraphicsDevice = gpGraphicsDeviceFirst;
116 pGraphicsDevice;
117 pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice)
118 {
119 if (pGraphicsDevice == pToAdd)
120 return;
121 }
122
123 pToAdd->pNextGraphicsDevice = NULL;
126 gpGraphicsDeviceLast = pToAdd;
128 gpGraphicsDeviceFirst = pToAdd;
129}
#define TRACE(s)
Definition: solgame.cpp:4
struct _GRAPHICS_DEVICE * pNextGraphicsDevice
Definition: pdevobj.h:61
static PGRAPHICS_DEVICE gpGraphicsDeviceLast
Definition: device.c:19
static PGRAPHICS_DEVICE gpGraphicsDeviceFirst
Definition: device.c:18

◆ _Success_() [1/2]

_Success_ ( return >=  0)

◆ _Success_() [2/2]

_Success_ ( return  = =0)

Deletes the virtual mapping and optionally gives back the page & dirty bit.

Parameters
Process- The process this address belongs to, or NULL if system address.
Address- The address to unmap.
WasDirty- Optional param receiving the dirty bit of the PTE.
Page- Optional param receiving the page number previously mapped to this address.
Returns
Whether there was actually a page mapped at the given address.

Definition at line 976 of file device.c.

987{
988 PIRP Irp;
993
994 TRACE("EngDeviceIoControl() called\n");
995
996 if (!hDevice)
997 {
999 }
1000
1002
1003 DeviceObject = (PDEVICE_OBJECT) hDevice;
1004
1007 lpInBuffer,
1009 lpOutBuffer,
1011 FALSE,
1012 &Event,
1013 &Iosb);
1014 if (!Irp) return ERROR_NOT_ENOUGH_MEMORY;
1015
1017
1018 if (Status == STATUS_PENDING)
1019 {
1021 Status = Iosb.Status;
1022 }
1023
1024 TRACE("EngDeviceIoControl(): Returning %X/%X\n", Iosb.Status,
1025 Iosb.Information);
1026
1027 /* Return information to the caller about the operation. */
1028 *lpBytesReturned = (DWORD)Iosb.Information;
1029
1030 /* Convert NT status values to win32 error codes. */
1031 switch (Status)
1032 {
1035
1037 return ERROR_MORE_DATA;
1038
1041
1044
1047
1049 return ERROR_DEV_NOT_EXIST;
1050
1051 case STATUS_PENDING:
1052 return ERROR_IO_PENDING;
1053 }
1054
1055 return Status;
1056}
#define VOID
Definition: acefi.h:82
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
switch(r->id)
Definition: btrfs.c:3046
struct _DEVICE_OBJECT * PDEVICE_OBJECT
#define DWORD
Definition: nt_native.h:44
#define STATUS_DEVICE_DOES_NOT_EXIST
Definition: ntstatus.h:428
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ DWORD _In_ DWORD _In_ DWORD cjOutBufferSize
Definition: winddi.h:1704
_In_ DWORD _In_ DWORD _In_ DWORD _Out_ LPDWORD lpBytesReturned
Definition: winddi.h:1705
_In_ DWORD _In_ DWORD cjInBufferSize
Definition: winddi.h:1702

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( EngDev  )

◆ EngFileWrite()

VOID APIENTRY EngFileWrite ( _In_ PFILE_OBJECT  pFileObject,
_In_reads_(nLength) PVOID  lpBuffer,
_In_ SIZE_T  nLength,
_Out_ PSIZE_T  lpBytesWritten 
)

Definition at line 893 of file device.c.

898{
900
901 status = EngpFileIoRequest(pFileObject,
903 lpBuffer,
904 nLength,
905 0,
906 lpBytesWritten);
907 if (!NT_SUCCESS(status))
908 {
909 *lpBytesWritten = 0;
910 }
911}
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define IRP_MJ_WRITE
Definition: rdpdr.c:47
Definition: ps.c:97
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)
Definition: device.c:835
WINBASEAPI _In_ DWORD nLength
Definition: wincon.h:682

◆ EngpFileIoRequest()

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

Definition at line 835 of file device.c.

842{
845 PIRP pIrp;
848 LARGE_INTEGER liStartOffset;
849
850 /* Get corresponding device object */
852 if (!pDeviceObject)
853 {
855 }
856
857 /* Initialize an event */
859
860 /* Build IRP */
861 liStartOffset.QuadPart = ullStartOffset;
862 pIrp = IoBuildSynchronousFsdRequest(ulMajorFunction,
864 lpBuffer,
865 (ULONG)nBufferSize,
866 &liStartOffset,
867 &Event,
868 &Iosb);
869 if (!pIrp)
870 {
872 }
873
874 /* Call the driver */
876
877 /* Wait if neccessary */
878 if (STATUS_PENDING == Status)
879 {
881 Status = Iosb.Status;
882 }
883
884 /* Return information to the caller about the operation. */
885 *lpInformation = Iosb.Information;
886
887 /* Return NTSTATUS */
888 return Status;
889}
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)
Definition: irp.c:1069
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by EngFileWrite().

◆ EngpFindGraphicsDevice()

PGRAPHICS_DEVICE NTAPI EngpFindGraphicsDevice ( _In_opt_ PUNICODE_STRING  pustrDevice,
_In_ ULONG  iDevNum 
)

Definition at line 780 of file device.c.

783{
784 UNICODE_STRING ustrCurrent;
785 PGRAPHICS_DEVICE pGraphicsDevice;
786 ULONG i;
787 TRACE("EngpFindGraphicsDevice('%wZ', %lu)\n",
788 pustrDevice, iDevNum);
789
790 /* Lock list */
792
793 if (pustrDevice && pustrDevice->Buffer)
794 {
795 /* Find specified video adapter by name */
796 for (pGraphicsDevice = gpGraphicsDeviceFirst;
797 pGraphicsDevice;
798 pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice)
799 {
800 /* Compare the device name */
801 RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
802 if (RtlEqualUnicodeString(&ustrCurrent, pustrDevice, FALSE))
803 {
804 break;
805 }
806 }
807
808 if (pGraphicsDevice)
809 {
810 /* Validate selected monitor number */
811#if 0
812 if (iDevNum >= pGraphicsDevice->dwMonCnt)
813 pGraphicsDevice = NULL;
814#else
815 /* FIXME: dwMonCnt not initialized, see EngpRegisterGraphicsDevice */
816#endif
817 }
818 }
819 else
820 {
821 /* Select video adapter by device number */
822 for (pGraphicsDevice = gpGraphicsDeviceFirst, i = 0;
823 pGraphicsDevice && i < iDevNum;
824 pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice, i++);
825 }
826
827 /* Unlock list */
829
830 return pGraphicsDevice;
831}
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
Definition: eng.c:235
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
Definition: glfuncs.h:248
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
WCHAR szWinDeviceName[CCHDEVICENAME/2]
Definition: pdevobj.h:60
DWORD dwMonCnt
Definition: pdevobj.h:73
static HSEMAPHORE ghsemGraphicsDeviceList
Definition: device.c:20
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)

Referenced by co_IntInitializeDesktopGraphics(), EngpUpdateGraphicsDeviceList(), MDEVOBJ_Create(), PDEVOBJ_lChangeDisplaySettings(), UserEnumDisplayDevices(), and UserEnumDisplaySettings().

◆ EngpGetDisplayDriverAccelerationLevel()

DWORD EngpGetDisplayDriverAccelerationLevel ( _In_ PGRAPHICS_DEVICE  pGraphicsDevice)

Definition at line 420 of file device.c.

422{
423 HKEY hKey;
424 DWORD dwAccelerationLevel = 0;
425 RTL_QUERY_REGISTRY_TABLE DisplaySettingsTable[] =
426 {
427 {
428 NULL,
430 L"Acceleration.Level",
431 &dwAccelerationLevel,
432 REG_NONE, NULL, 0
433 },
434 {0}
435 };
436
437 hKey = EngpGetRegistryHandleFromDeviceMap(pGraphicsDevice);
438 if (!hKey)
439 return 0;
440
442 (PWSTR)hKey,
443 DisplaySettingsTable,
444 NULL,
445 NULL);
446 ZwClose(hKey);
447
448 return dwAccelerationLevel;
449}
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define RTL_REGISTRY_HANDLE
Definition: nt_native.h:168
uint16_t * PWSTR
Definition: typedefs.h:56
static HKEY EngpGetRegistryHandleFromDeviceMap(_In_ PGRAPHICS_DEVICE pGraphicsDevice)
Definition: device.c:336

Referenced by MDEVOBJ_Create().

◆ EngpGetDisplayDriverParameters()

NTSTATUS EngpGetDisplayDriverParameters ( _In_ PGRAPHICS_DEVICE  pGraphicsDevice,
_Out_ PDEVMODEW  pdm 
)

Definition at line 374 of file device.c.

377{
378 HKEY hKey;
380 RTL_QUERY_REGISTRY_TABLE DisplaySettingsTable[] =
381 {
382#define READ(field, str) \
383 { \
384 NULL, \
385 RTL_QUERY_REGISTRY_DIRECT, \
386 L ##str, \
387 &pdm->field, \
388 REG_NONE, NULL, 0 \
389 },
390 READ(dmBitsPerPel, "DefaultSettings.BitsPerPel")
391 READ(dmPelsWidth, "DefaultSettings.XResolution")
392 READ(dmPelsHeight, "DefaultSettings.YResolution")
393 READ(dmDisplayFlags, "DefaultSettings.Flags")
394 READ(dmDisplayFrequency, "DefaultSettings.VRefresh")
395 READ(dmPanningWidth, "DefaultSettings.XPanning")
396 READ(dmPanningHeight, "DefaultSettings.YPanning")
397 READ(dmDisplayOrientation, "DefaultSettings.Orientation")
398 READ(dmDisplayFixedOutput, "DefaultSettings.FixedOutput")
399 READ(dmPosition.x, "Attach.RelativeX")
400 READ(dmPosition.y, "Attach.RelativeY")
401#undef READ
402 {0}
403 };
404
405 hKey = EngpGetRegistryHandleFromDeviceMap(pGraphicsDevice);
406 if (!hKey)
407 return STATUS_UNSUCCESSFUL;
408
410 (PWSTR)hKey,
411 DisplaySettingsTable,
412 NULL,
413 NULL);
414
415 ZwClose(hKey);
416 return Status;
417}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define READ(field, str)
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

Referenced by LDEVOBJ_bProbeAndCaptureDevmode().

◆ EngpGetRegistryHandleFromDeviceMap()

static HKEY EngpGetRegistryHandleFromDeviceMap ( _In_ PGRAPHICS_DEVICE  pGraphicsDevice)
static

Definition at line 336 of file device.c.

338{
339 static const PWCHAR KEY_VIDEO = L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP\\VIDEO";
340 HKEY hKey;
341 WCHAR szDeviceKey[256];
342 ULONG cbSize;
344
345 /* Open the device map registry key */
347 if (!NT_SUCCESS(Status))
348 {
349 ERR("Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key: status 0x%08x\n", Status);
350 return NULL;
351 }
352
353 /* Query the registry path */
354 cbSize = sizeof(szDeviceKey);
356 pGraphicsDevice->szNtDeviceName,
357 REG_SZ,
358 szDeviceKey,
359 &cbSize);
360 ZwClose(hKey);
361
362 /* Open the registry key */
363 Status = RegOpenKey(szDeviceKey, &hKey);
364 if (!NT_SUCCESS(Status))
365 {
366 ERR("Could not open registry key '%S': status 0x%08x\n", szDeviceKey, Status);
367 return NULL;
368 }
369
370 return hKey;
371}
#define ERR(fmt,...)
Definition: precomp.h:57
#define REG_SZ
Definition: layer.c:22
uint16_t * PWCHAR
Definition: typedefs.h:56
static const PWCHAR KEY_VIDEO
Definition: display.c:15
#define RegOpenKey
Definition: winreg.h:519
#define RegQueryValue
Definition: winreg.h:523
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by EngpGetDisplayDriverAccelerationLevel(), and EngpGetDisplayDriverParameters().

◆ EngpHasVgaDriver()

static BOOLEAN EngpHasVgaDriver ( _In_ PGRAPHICS_DEVICE  pGraphicsDevice)
static

Definition at line 37 of file device.c.

39{
40 WCHAR awcDeviceKey[256], awcServiceName[100];
41 PWSTR lastBkSlash;
43 ULONG cbValue;
44 HKEY hkey;
45
46 /* Open the key for the adapters */
47 Status = RegOpenKey(L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP\\VIDEO", &hkey);
48 if (!NT_SUCCESS(Status))
49 {
50 ERR("Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key: 0x%08lx\n", Status);
51 return FALSE;
52 }
53
54 /* Read the name of the device key */
55 cbValue = sizeof(awcDeviceKey);
56 Status = RegQueryValue(hkey, pGraphicsDevice->szNtDeviceName, REG_SZ, awcDeviceKey, &cbValue);
57 ZwClose(hkey);
58 if (!NT_SUCCESS(Status))
59 {
60 ERR("Could not read '%S' registry value: 0x%08lx\n", Status);
61 return FALSE;
62 }
63
64 /* Replace 'DeviceN' by 'Video' */
65 lastBkSlash = wcsrchr(awcDeviceKey, L'\\');
66 if (!lastBkSlash)
67 {
68 ERR("Invalid registry key '%S'\n", lastBkSlash);
69 return FALSE;
70 }
71 if (!NT_SUCCESS(RtlStringCchCopyW(lastBkSlash + 1,
72 ARRAYSIZE(awcDeviceKey) - (lastBkSlash + 1 - awcDeviceKey),
73 L"Video")))
74 {
75 ERR("Failed to add 'Video' to registry key '%S'\n", awcDeviceKey);
76 return FALSE;
77 }
78
79 /* Open device key */
80 Status = RegOpenKey(awcDeviceKey, &hkey);
81 if (!NT_SUCCESS(Status))
82 {
83 ERR("Could not open %S registry key: 0x%08lx\n", awcDeviceKey, Status);
84 return FALSE;
85 }
86
87 /* Read service name */
88 cbValue = sizeof(awcServiceName);
89 Status = RegQueryValue(hkey, L"Service", REG_SZ, awcServiceName, &cbValue);
90 ZwClose(hkey);
91 if (!NT_SUCCESS(Status))
92 {
93 ERR("Could not read Service registry value in %S: 0x%08lx\n", awcDeviceKey, Status);
94 return FALSE;
95 }
96
97 /* Device is using VGA driver if service name is 'VGASave' (case insensitive) */
98 return (_wcsicmp(awcServiceName, L"VGASave") == 0);
99}
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define wcsrchr
Definition: compat.h:16
NTSTRSAFEAPI RtlStringCchCopyW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
Definition: ntstrsafe.h:127
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)

Referenced by EngpUpdateGraphicsDeviceList().

◆ EngpPnPTargetRelationRequest()

static NTSTATUS EngpPnPTargetRelationRequest ( _In_ PDEVICE_OBJECT  pDeviceObject,
_Out_ PDEVICE_RELATIONS pDeviceRelations 
)
static

Definition at line 520 of file device.c.

523{
526 PIRP pIrp;
529
530 /* Initialize an event */
532
533 /* Build IRP */
536 NULL, 0,
537 NULL,
538 &Event,
539 &Iosb);
540 if (!pIrp)
542
543 /* Initialize IRP */
544 pIrp->IoStatus.Status = STATUS_NOT_SUPPORTED;
548
549 /* Call the driver */
551
552 /* Wait if neccessary */
553 if (Status == STATUS_PENDING)
554 {
556 Status = Iosb.Status;
557 }
558
559 /* Return information to the caller about the operation. */
560 if (NT_SUCCESS(Status))
561 *pDeviceRelations = (PDEVICE_RELATIONS)Iosb.Information;
562
563 return Status;
564}
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4138
struct _IO_STACK_LOCATION::@4137::@4162 QueryDeviceRelations
union _IO_STACK_LOCATION::@1647 Parameters
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
@ TargetDeviceRelation
Definition: iotypes.h:2156
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
#define IRP_MN_QUERY_DEVICE_RELATIONS

Referenced by EngpUpdateMonitorDevices().

◆ EngpRegisterGraphicsDevice()

PGRAPHICS_DEVICE NTAPI EngpRegisterGraphicsDevice ( _In_ PUNICODE_STRING  pustrDeviceName,
_In_ PUNICODE_STRING  pustrDiplayDrivers,
_In_ PUNICODE_STRING  pustrDescription 
)

Definition at line 647 of file device.c.

651{
652 PGRAPHICS_DEVICE pGraphicsDevice;
654 PFILE_OBJECT pFileObject;
656 VIDEO_WIN32K_CALLBACKS Win32kCallbacks;
657 ULONG ulReturn;
658 PWSTR pwsz;
659 ULONG cj;
660
661 TRACE("EngpRegisterGraphicsDevice(%wZ)\n", pustrDeviceName);
662
663 /* Allocate a GRAPHICS_DEVICE structure */
664 pGraphicsDevice = ExAllocatePoolZero(PagedPool,
665 sizeof(GRAPHICS_DEVICE),
667 if (!pGraphicsDevice)
668 {
669 ERR("ExAllocatePoolWithTag failed\n");
670 return NULL;
671 }
672
673 /* Try to open and enable the device */
674 Status = IoGetDeviceObjectPointer(pustrDeviceName,
676 &pFileObject,
678 if (!NT_SUCCESS(Status))
679 {
680 ERR("Could not open device %wZ, 0x%lx\n", pustrDeviceName, Status);
681 ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
682 return NULL;
683 }
684
685 /* Copy the device and file object pointers */
686 pGraphicsDevice->DeviceObject = pDeviceObject;
687 pGraphicsDevice->FileObject = pFileObject;
688
689 /* Initialize and register the device with videoprt for Win32k callbacks */
690 Win32kCallbacks.PhysDisp = pGraphicsDevice;
691 Win32kCallbacks.Callout = VideoPortCallout;
692 // Reset the data being returned prior to the call.
693 Win32kCallbacks.bACPI = FALSE;
694 Win32kCallbacks.pPhysDeviceObject = NULL;
695 Win32kCallbacks.DualviewFlags = 0;
696 Status = (NTSTATUS)EngDeviceIoControl((HANDLE)pDeviceObject,
698 &Win32kCallbacks,
699 sizeof(Win32kCallbacks),
700 &Win32kCallbacks,
701 sizeof(Win32kCallbacks),
702 &ulReturn);
703 if (Status != ERROR_SUCCESS)
704 {
705 ERR("EngDeviceIoControl(0x%p, IOCTL_VIDEO_INIT_WIN32K_CALLBACKS) failed, Status 0x%lx\n",
707 }
708 // TODO: Set flags according to the results.
709 // if (Win32kCallbacks.bACPI)
710 // if (Win32kCallbacks.DualviewFlags & ???)
711 pGraphicsDevice->PhysDeviceHandle = Win32kCallbacks.pPhysDeviceObject;
712
713 /* Copy the device name */
714 RtlStringCbCopyNW(pGraphicsDevice->szNtDeviceName,
715 sizeof(pGraphicsDevice->szNtDeviceName),
716 pustrDeviceName->Buffer,
717 pustrDeviceName->Length);
718
719 /* Create a Win32 device name (FIXME: virtual devices!) */
720 RtlStringCbPrintfW(pGraphicsDevice->szWinDeviceName,
721 sizeof(pGraphicsDevice->szWinDeviceName),
722 L"\\\\.\\DISPLAY%d",
723 (int)giDevNum);
724
725 /* Allocate a buffer for the strings */
726 cj = pustrDiplayDrivers->Length + pustrDescription->Length + sizeof(WCHAR);
728 if (!pwsz)
729 {
730 ERR("Could not allocate string buffer\n");
731 ASSERT(FALSE); // FIXME
732 ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
733 return NULL;
734 }
735
736 /* Copy the display driver names */
737 pGraphicsDevice->pDiplayDrivers = pwsz;
738 RtlCopyMemory(pGraphicsDevice->pDiplayDrivers,
739 pustrDiplayDrivers->Buffer,
740 pustrDiplayDrivers->Length);
741
742 /* Copy the description */
743 pGraphicsDevice->pwszDescription = pwsz + pustrDiplayDrivers->Length / sizeof(WCHAR);
744 RtlCopyMemory(pGraphicsDevice->pwszDescription,
745 pustrDescription->Buffer,
746 pustrDescription->Length);
747 pGraphicsDevice->pwszDescription[pustrDescription->Length/sizeof(WCHAR)] = 0;
748
749 /* Update list of connected monitors */
750 EngpUpdateMonitorDevices(pGraphicsDevice);
751
752 /* Lock loader */
754
755 /* Insert the device into the global list */
756 EngpLinkGraphicsDevice(pGraphicsDevice);
757
758 /* Increment the device number */
759 giDevNum++;
760
761 /* Unlock loader */
763
764 /* HACK: already in graphic mode; display wallpaper on this new display */
766 {
767 UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY");
768 UNICODE_STRING DisplayName;
769 HDC hdc;
770 RtlInitUnicodeString(&DisplayName, pGraphicsDevice->szWinDeviceName);
771 hdc = IntGdiCreateDC(&DriverName, &DisplayName, NULL, NULL, FALSE);
773 }
774
775 return pGraphicsDevice;
776}
HDC FASTCALL IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING pustrDevice, PVOID pUMdhpdev, CONST PDEVMODEW pdmInit, BOOL CreateAsIC)
Definition: dclife.c:1040
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NTSTATUS
Definition: precomp.h:19
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
HDC hdc
Definition: main.c:9
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
static HDC
Definition: imagelist.c:88
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define FILE_READ_DATA
Definition: nt_native.h:628
#define IOCTL_VIDEO_INIT_WIN32K_CALLBACKS
Definition: ntddvdeo.h:131
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1435
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
NTSTRSAFEAPI RtlStringCbCopyNW(_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, _In_ size_t cbToCopy)
Definition: ntstrsafe.h:416
LPWSTR pDiplayDrivers
Definition: pdevobj.h:71
PFILE_OBJECT FileObject
Definition: pdevobj.h:75
WCHAR szNtDeviceName[CCHDEVICENAME/2]
Definition: pdevobj.h:59
LPWSTR pwszDescription
Definition: pdevobj.h:72
PDEVICE_OBJECT DeviceObject
Definition: pdevobj.h:63
PDEVICE_OBJECT PhysDeviceHandle
Definition: pdevobj.h:64
OUT ULONG DualviewFlags
Definition: ntddvdeo.h:335
IN PVIDEO_WIN32K_CALLOUT Callout
Definition: ntddvdeo.h:332
OUT HANDLE pPhysDeviceObject
Definition: ntddvdeo.h:334
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
static ULONG giDevNum
Definition: device.c:21
VOID NTAPI VideoPortCallout(_In_ PVOID Params)
Definition: device.c:457
NTSTATUS NTAPI EngpUpdateMonitorDevices(_In_ PGRAPHICS_DEVICE pGraphicsDevice)
Definition: device.c:568
HDC ScreenDeviceContext
Definition: desktop.c:53
BOOL FASTCALL IntPaintDesktop(HDC hDC)
Definition: desktop.c:1854
#define GDITAG_DRVSUP
Definition: tags.h:77
#define GDITAG_GDEVICE
Definition: tags.h:99
_In_ ULONG cj
Definition: winddi.h:3540
* PFILE_OBJECT
Definition: iotypes.h:1998

Referenced by InitDisplayDriver().

◆ EngpUpdateGraphicsDeviceList()

NTSTATUS EngpUpdateGraphicsDeviceList ( VOID  )

Definition at line 182 of file device.c.

183{
184 ULONG iDevNum, ulMaxObjectNumber = 0;
185 WCHAR awcDeviceName[20], awcWinDeviceName[20];
186 UNICODE_STRING ustrDeviceName;
187 WCHAR awcBuffer[256];
189 PGRAPHICS_DEVICE pGraphicsDevice, pNewPrimaryGraphicsDevice = NULL;
190 ULONG cbValue;
191 HKEY hkey;
192
193 /* Open the key for the adapters */
194 Status = RegOpenKey(L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP\\VIDEO", &hkey);
195 if (!NT_SUCCESS(Status))
196 {
197 ERR("Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key:0x%lx\n", Status);
198 return Status;
199 }
200
201 /* Get the maximum number of adapters */
202 if (!RegReadDWORD(hkey, L"MaxObjectNumber", &ulMaxObjectNumber))
203 {
204 ERR("Could not read MaxObjectNumber, defaulting to 0.\n");
205 }
206
207 TRACE("Found %lu devices\n", ulMaxObjectNumber + 1);
208
209 /* Loop through all adapters, to detect new ones */
210 for (iDevNum = 0; iDevNum <= ulMaxObjectNumber; iDevNum++)
211 {
212 /* Create the adapter's key name */
213 swprintf(awcDeviceName, L"\\Device\\Video%lu", iDevNum);
214
215 /* Create the display device name */
216 swprintf(awcWinDeviceName, L"\\\\.\\DISPLAY%lu", iDevNum + 1);
217 RtlInitUnicodeString(&ustrDeviceName, awcWinDeviceName);
218
219 /* Check if the device exists already */
220 pGraphicsDevice = EngpFindGraphicsDevice(&ustrDeviceName, iDevNum);
221 if (pGraphicsDevice != NULL)
222 {
223 continue;
224 }
225
226 /* Read the reg key name */
227 cbValue = sizeof(awcBuffer);
228 Status = RegQueryValue(hkey, awcDeviceName, REG_SZ, awcBuffer, &cbValue);
229 if (!NT_SUCCESS(Status))
230 {
231 ERR("failed to query the registry path:0x%lx\n", Status);
232 continue;
233 }
234
235 /* Initialize the driver for this device */
236 pGraphicsDevice = InitDisplayDriver(awcDeviceName, awcBuffer);
237 if (!pGraphicsDevice) continue;
238 }
239
240 /* Close the device map registry key */
241 ZwClose(hkey);
242
243 /* Choose a VGA device */
244 /* Try a device with DISPLAY_DEVICE_VGA_COMPATIBLE flag. If not found,
245 * fall back to current VGA device */
246 for (pGraphicsDevice = gpGraphicsDeviceFirst;
247 pGraphicsDevice;
248 pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice)
249 {
250 if (pGraphicsDevice == gpVgaGraphicsDevice)
251 continue;
252 if (pGraphicsDevice->StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE && EngpHasVgaDriver(pGraphicsDevice))
253 {
254 gpVgaGraphicsDevice = pGraphicsDevice;
255 break;
256 }
257 }
258
259 /* Handle gbBaseVideo */
260 if (gbBaseVideo)
261 {
262 PGRAPHICS_DEVICE pToDelete;
263
264 /* Lock list */
266
267 /* Remove every device from linked list, except base-video one */
268 pGraphicsDevice = gpGraphicsDeviceFirst;
269 while (pGraphicsDevice)
270 {
271 if (!EngpHasVgaDriver(pGraphicsDevice))
272 {
273 /* Not base-video device. Remove it */
274 pToDelete = pGraphicsDevice;
275 TRACE("Removing non-base-video device %S (%S)\n", pToDelete->szWinDeviceName, pToDelete->szNtDeviceName);
276
277 EngpUnlinkGraphicsDevice(pGraphicsDevice);
278 pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice;
279
280 /* Free memory */
283 }
284 else
285 {
286 pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice;
287 }
288 }
289
290 /* Unlock list */
292 }
293
294 /* Choose a primary device (if none already exists) */
296 {
297 for (pGraphicsDevice = gpGraphicsDeviceFirst;
298 pGraphicsDevice;
299 pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice)
300 {
301 if (!EngpHasVgaDriver(pGraphicsDevice))
302 {
303 pNewPrimaryGraphicsDevice = pGraphicsDevice;
304 break;
305 }
306 }
307 if (!pNewPrimaryGraphicsDevice)
308 pNewPrimaryGraphicsDevice = gpGraphicsDeviceFirst;
309 if (pNewPrimaryGraphicsDevice)
310 {
311 pNewPrimaryGraphicsDevice->StateFlags |= DISPLAY_DEVICE_PRIMARY_DEVICE;
312 gpPrimaryGraphicsDevice = pNewPrimaryGraphicsDevice;
313 }
314 }
315
316 /* Can we link VGA device to primary device? */
321 {
322 /* Yes. Remove VGA device from global list, and attach it to primary device */
323 TRACE("Linking VGA device %S to primary device %S\n", gpVgaGraphicsDevice->szNtDeviceName, gpPrimaryGraphicsDevice->szNtDeviceName);
325 EngpUnlinkGraphicsDevice(gpVgaGraphicsDevice);
328 }
329
330 return STATUS_SUCCESS;
331}
#define swprintf
Definition: precomp.h:40
#define STATUS_SUCCESS
Definition: shellext.h:65
DWORD StateFlags
Definition: pdevobj.h:66
struct _GRAPHICS_DEVICE * pVgaDevice
Definition: pdevobj.h:62
static BOOLEAN EngpHasVgaDriver(_In_ PGRAPHICS_DEVICE pGraphicsDevice)
Definition: device.c:37
PGRAPHICS_DEVICE NTAPI EngpFindGraphicsDevice(_In_opt_ PUNICODE_STRING pustrDevice, _In_ ULONG iDevNum)
Definition: device.c:780
static PGRAPHICS_DEVICE gpPrimaryGraphicsDevice
Definition: device.c:15
static PGRAPHICS_DEVICE gpVgaGraphicsDevice
Definition: device.c:16
BOOL NTAPI RegReadDWORD(HKEY hkey, PCWSTR pwszValue, PDWORD pdwData)
Definition: registry.c:149
BOOL gbBaseVideo
Definition: display.c:12
PGRAPHICS_DEVICE NTAPI InitDisplayDriver(IN PWSTR pwszDeviceName, IN PWSTR pwszRegKey)
Definition: display.c:66
#define DISPLAY_DEVICE_VGA_COMPATIBLE
Definition: wingdi.h:1400
#define DISPLAY_DEVICE_PRIMARY_DEVICE
Definition: wingdi.h:1398

Referenced by co_IntInitializeDesktopGraphics(), InitVideo(), and UserEnumDisplayDevices().

◆ EngpUpdateMonitorDevices()

NTSTATUS NTAPI EngpUpdateMonitorDevices ( _In_ PGRAPHICS_DEVICE  pGraphicsDevice)

Definition at line 568 of file device.c.

570{
571 PDEVICE_RELATIONS pDeviceRelations;
572 PVIDEO_MONITOR_DEVICE pMonitorDevices;
573 ULONG i, bytesWritten, monitorCount;
575
576 /* Request right PDO for device relations */
577 Status = EngpPnPTargetRelationRequest(pGraphicsDevice->DeviceObject, &pDeviceRelations);
578 if (!NT_SUCCESS(Status))
579 {
580 ERR("EngpPnPTargetRelationRequest() failed with status 0x%08x\n", Status);
581 return Status;
582 }
583 ASSERT(pDeviceRelations->Count == 1);
584
585 /* Invalidate relations, so that videoprt reenumerates its monitors */
587
588 /* Free returned structure */
589 for (i = 0; i < pDeviceRelations->Count; i++)
590 ObDereferenceObject(pDeviceRelations->Objects[i]);
591 ExFreePool(pDeviceRelations);
592
593 /* Now, get list of monitor PDOs */
594 Status = EngDeviceIoControl(pGraphicsDevice->DeviceObject,
596 NULL, 0,
597 &pMonitorDevices, sizeof(pMonitorDevices),
598 &bytesWritten);
599 if (Status != ERROR_SUCCESS)
600 {
601 ERR("EngDeviceIoControl(IOCTL_VIDEO_ENUM_MONITOR_PDO) failed with status 0x%08x\n", Status);
602 return Status;
603 }
604 ASSERT(bytesWritten == sizeof(pMonitorDevices));
605
606 /* Count number of available monitors */
607 for (monitorCount = 0; pMonitorDevices[monitorCount].pdo; ++monitorCount)
608 ;
609
610 if (pGraphicsDevice->pvMonDev)
611 {
612 /* Erase everything */
613 for (i = 0; i < pGraphicsDevice->dwMonCnt; i++)
614 ObDereferenceObject(pGraphicsDevice->pvMonDev[i].pdo);
615 ExFreePoolWithTag(pGraphicsDevice->pvMonDev, GDITAG_GDEVICE);
616 pGraphicsDevice->pvMonDev = NULL;
617 pGraphicsDevice->dwMonCnt = 0;
618 }
619
620 if (monitorCount > 0)
621 {
622 pGraphicsDevice->pvMonDev = ExAllocatePoolZero(PagedPool,
623 monitorCount * sizeof(VIDEO_MONITOR_DEVICE),
625 if (!pGraphicsDevice->pvMonDev)
626 {
627 for (i = 0; pMonitorDevices[i].pdo; ++i)
628 ObDereferenceObject(pMonitorDevices[i].pdo);
629 ExFreePool(pMonitorDevices);
631 }
632
633 /* Copy data */
634 for (i = 0; i < monitorCount; i++)
635 {
636 TRACE("%S\\Monitor%u: PDO %p HwID %u\n", pGraphicsDevice->szWinDeviceName, i, pMonitorDevices[i].pdo, pMonitorDevices[i].HwID);
637 pGraphicsDevice->pvMonDev[pGraphicsDevice->dwMonCnt++] = pMonitorDevices[i];
638 }
639 }
640
641 ExFreePool(pMonitorDevices);
642 return STATUS_SUCCESS;
643}
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
GLenum GLsizei GLuint GLint * bytesWritten
Definition: glext.h:11123
#define IOCTL_VIDEO_ENUM_MONITOR_PDO
Definition: ntddvdeo.h:128
NTSTATUS NTAPI IoSynchronousInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:1798
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2163
static NTSTATUS EngpPnPTargetRelationRequest(_In_ PDEVICE_OBJECT pDeviceObject, _Out_ PDEVICE_RELATIONS *pDeviceRelations)
Definition: device.c:520
@ BusRelations
Definition: iotypes.h:2152
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by EngpRegisterGraphicsDevice(), and UserEnumDisplayDevices().

◆ InitDeviceImpl()

NTSTATUS NTAPI InitDeviceImpl ( VOID  )

Definition at line 26 of file device.c.

27{
31
32 return STATUS_SUCCESS;
33}
HSEMAPHORE WINAPI EngCreateSemaphore(VOID)
Definition: eng.c:75

Referenced by DriverEntry().

◆ UserRefreshDisplay()

VOID UserRefreshDisplay ( IN PPDEVOBJ  ppdev)

Definition at line 177 of file display.c.

178{
179 ULONG_PTR ulResult;
180 // PVOID pvOldCursor;
181
182 // TODO: Re-enable the cursor reset code once this function becomes called
183 // from within a Win32 thread... Indeed UserSetCursor() requires this, but
184 // at the moment this function is directly called from a separate thread
185 // from within videoprt, instead of by a separate win32k system thread.
186
187 if (!ppdev)
188 return;
189
190 PDEVOBJ_vReference(ppdev);
191
192 /* Remove mouse pointer */
193 // pvOldCursor = UserSetCursor(NULL, TRUE);
194
195 /* Do the mode switch -- Use the actual same current mode */
196 ulResult = PDEVOBJ_bSwitchMode(ppdev, ppdev->pdmwDev);
197 ASSERT(ulResult);
198
199 /* Restore mouse pointer, no hooks called */
200 // pvOldCursor = UserSetCursor(pvOldCursor, TRUE);
201 // ASSERT(pvOldCursor == NULL);
202
203 /* Update the system metrics */
204 InitMetrics();
205
206 /* Set new size of the monitor */
207 // UserUpdateMonitorSize((HDEV)ppdev);
208
209 //co_IntShowDesktop(pdesk, ppdev->gdiinfo.ulHorzRes, ppdev->gdiinfo.ulVertRes);
211
212 PDEVOBJ_vRelease(ppdev);
213}
BOOL NTAPI PDEVOBJ_bSwitchMode(PPDEVOBJ ppdev, PDEVMODEW pdm)
Definition: pdevobj.c:712
VOID NTAPI PDEVOBJ_vRelease(_Inout_ PPDEVOBJ ppdev)
Definition: pdevobj.c:105
FORCEINLINE VOID PDEVOBJ_vReference(_In_ PPDEVOBJ ppdev)
Definition: pdevobj.h:160
uint32_t ULONG_PTR
Definition: typedefs.h:65
VOID APIENTRY UserRedrawDesktop(VOID)
Definition: desktop.c:1616
BOOL NTAPI InitMetrics(VOID)
Definition: metric.c:45

Referenced by VideoPortCallout().

◆ VideoPortCallout()

VOID NTAPI VideoPortCallout ( _In_ PVOID  Params)

Definition at line 457 of file device.c.

459{
460/*
461 * IMPORTANT NOTICE!! On Windows XP/2003 this function triggers the creation of
462 * a specific VideoPortCalloutThread() system thread using the same mechanism
463 * as the RIT/desktop/Ghost system threads.
464 */
465
467
468 TRACE("VideoPortCallout(0x%p, 0x%x)\n",
469 CallbackParams, CallbackParams ? CallbackParams->CalloutType : -1);
470
471 if (!CallbackParams)
472 return;
473
474 switch (CallbackParams->CalloutType)
475 {
477 {
478 TRACE("VideoPortCallout: VideoFindAdapterCallout called - Param = %s\n",
479 CallbackParams->Param ? "TRUE" : "FALSE");
480 if (CallbackParams->Param == TRUE)
481 {
482 /* Re-enable the display */
484 }
485 else
486 {
487 /* Disable the display */
488 NOTHING; // Nothing to do for the moment...
489 }
490
491 CallbackParams->Status = STATUS_SUCCESS;
492 break;
493 }
494
504 ERR("VideoPortCallout: CalloutType 0x%x is UNIMPLEMENTED!\n", CallbackParams->CalloutType);
505 CallbackParams->Status = STATUS_NOT_IMPLEMENTED;
506 break;
507
508 default:
509 ERR("VideoPortCallout: Unknown CalloutType 0x%x\n", CallbackParams->CalloutType);
510 CallbackParams->Status = STATUS_UNSUCCESSFUL;
511 break;
512 }
513}
#define NOTHING
Definition: input_list.c:10
PMDEVOBJ gpmdev
Definition: mdevobj.c:14
@ VideoEnumChildPdoNotifyCallout
Definition: ntddvdeo.h:295
@ VideoPowerNotifyCallout
Definition: ntddvdeo.h:293
@ VideoDxgkFindAdapterTdrCallout
Definition: ntddvdeo.h:302
@ VideoDxgkMonitorEventCallout
Definition: ntddvdeo.h:301
@ VideoChangeDisplaySettingsCallout
Definition: ntddvdeo.h:298
@ VideoDisplaySwitchCallout
Definition: ntddvdeo.h:294
@ VideoPnpNotifyCallout
Definition: ntddvdeo.h:299
@ VideoDxgkDisplaySwitchCallout
Definition: ntddvdeo.h:300
@ VideoFindAdapterCallout
Definition: ntddvdeo.h:296
@ VideoWakeupCallout
Definition: ntddvdeo.h:297
struct _VIDEO_WIN32K_CALLBACKS_PARAMS * PVIDEO_WIN32K_CALLBACKS_PARAMS
PPDEVOBJ ppdevGlobal
Definition: mdevobj.h:16
VIDEO_WIN32K_CALLBACKS_PARAMS_TYPE CalloutType
Definition: ntddvdeo.h:319
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
Definition: wdfrequest.h:308
VOID UserRefreshDisplay(IN PPDEVOBJ ppdev)
Definition: display.c:177

Referenced by EngpRegisterGraphicsDevice().

Variable Documentation

◆ dwIoControlCode

_In_ DWORD dwIoControlCode

Definition at line 918 of file device.c.

Referenced by _In_reads_(), and _Success_().

◆ ghsemGraphicsDeviceList

HSEMAPHORE ghsemGraphicsDeviceList
static

◆ giDevNum

ULONG giDevNum = 1
static

Definition at line 21 of file device.c.

Referenced by EngpRegisterGraphicsDevice().

◆ gpGraphicsDeviceFirst

PGRAPHICS_DEVICE gpGraphicsDeviceFirst = NULL
static

◆ gpGraphicsDeviceLast

PGRAPHICS_DEVICE gpGraphicsDeviceLast = NULL
static

Definition at line 19 of file device.c.

Referenced by _Requires_lock_held_().

◆ gpPrimaryGraphicsDevice

PGRAPHICS_DEVICE gpPrimaryGraphicsDevice
static

Definition at line 15 of file device.c.

Referenced by EngpUpdateGraphicsDeviceList().

◆ gpVgaGraphicsDevice

PGRAPHICS_DEVICE gpVgaGraphicsDevice
static

Definition at line 16 of file device.c.

Referenced by EngpUpdateGraphicsDeviceList().