ReactOS 0.4.17-dev-684-ga6524ef
videoprt.c File Reference
#include "videoprt.h"
#include <stdio.h>
#include <ndk/exfuncs.h>
#include <ndk/obfuncs.h>
#include <ndk/rtlfuncs.h>
#include <debug.h>
Include dependency graph for videoprt.c:

Go to the source code of this file.

Classes

struct  QueryRegistryCallbackContext
 

Macros

#define NDEBUG
 

Typedefs

typedef struct QueryRegistryCallbackContext QUERY_REGISTRY_CALLBACK_CONTEXT
 
typedef struct QueryRegistryCallbackContextPQUERY_REGISTRY_CALLBACK_CONTEXT
 

Functions

 RTL_STATIC_LIST_HEAD (HwResetAdaptersList)
 
static BOOLEAN IntIsVgaSaveDriver (_In_ PDRIVER_OBJECT DriverObject)
 
ULONG NTAPI DriverEntry (IN PVOID Context1, IN PVOID Context2)
 
static NTSTATUS IntVideoPortAddDeviceMapLink (PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
 
PVOID NTAPI IntVideoPortImageDirectoryEntryToData (PVOID BaseAddress, ULONG Directory)
 
VOID NTAPI IntVideoPortDeferredRoutine (IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
 
NTSTATUS NTAPI IntVideoPortCreateAdapterDeviceObject (_In_ PDRIVER_OBJECT DriverObject, _In_ PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, _In_ USHORT AdapterNumber, _In_ USHORT DisplayNumber, _Out_opt_ PDEVICE_OBJECT *DeviceObject)
 
static NTSTATUS NTAPI IntVideoPortEnumBusCallback (_In_ PVOID Context, _In_ PUNICODE_STRING PathName, _In_ INTERFACE_TYPE BusType, _In_ ULONG BusNumber, _In_ PKEY_VALUE_FULL_INFORMATION *BusInformation, _In_ CONFIGURATION_TYPE ControllerType, _In_ ULONG ControllerNumber, _In_ PKEY_VALUE_FULL_INFORMATION *ControllerInformation, _In_ CONFIGURATION_TYPE PeripheralType, _In_ ULONG PeripheralNumber, _In_ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation)
 A PIO_QUERY_DEVICE_ROUTINE callback for IoQueryDeviceDescription() to return success when an enumerated bus has been found.
 
static NTSTATUS IntVideoPortEnumBuses (_In_ INTERFACE_TYPE AdapterInterfaceType, _Inout_ PULONG BusNumber)
 Enumerates all supported buses on the system.
 
NTSTATUS IntVideoPortFindAdapter (_In_ PDRIVER_OBJECT DriverObject, _In_ PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, _In_ _When_(LegacyDetection, _Null_) PDEVICE_OBJECT DeviceObject, _In_ BOOLEAN LegacyDetection)
 
BOOLEAN FASTCALL IntAttachToCSRSS (_Outptr_ PKPROCESS *CallingProcess, _Out_ PKAPC_STATE ApcState)
 Attach the current thread to the CSRSS process. The caller must detach from the process by invoking IntDetachFromCSRSS() after operating in its context.
 
VOID FASTCALL IntDetachFromCSRSS (_In_ PKPROCESS CallingProcess, _In_ PKAPC_STATE ApcState)
 Detach the current thread from the CSRSS process. This routine is to be invoked after a previous successful IntAttachToCSRSS() call.
 
VOID FASTCALL IntLoadRegistryParameters (VOID)
 
ULONG NTAPI VideoPortInitialize (IN PVOID Context1, IN PVOID Context2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext)
 
VOID __cdecl VideoPortDebugPrint (_In_ VIDEO_DEBUG_LEVEL DebugPrintLevel, _In_ PSTR DebugMessage, _In_ ...)
 
VOID NTAPI VideoPortLogError (IN PVOID HwDeviceExtension, IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, IN VP_STATUS ErrorCode, IN ULONG UniqueId)
 
UCHAR NTAPI VideoPortGetCurrentIrql (VOID)
 
static NTSTATUS NTAPI QueryRegistryCallback (IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)
 
VP_STATUS NTAPI VideoPortGetRegistryParameters (IN PVOID HwDeviceExtension, IN PWSTR ParameterName, IN UCHAR IsParameterFileName, IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine, IN PVOID HwContext)
 
VP_STATUS NTAPI VideoPortSetRegistryParameters (IN PVOID HwDeviceExtension, IN PWSTR ValueName, IN PVOID ValueData, IN ULONG ValueLength)
 
VP_STATUS NTAPI VideoPortGetVgaStatus (IN PVOID HwDeviceExtension, OUT PULONG VgaStatus)
 
PVOID NTAPI VideoPortGetRomImage (IN PVOID HwDeviceExtension, IN PVOID Unused1, IN ULONG Unused2, IN ULONG Length)
 
BOOLEAN NTAPI VideoPortScanRom (IN PVOID HwDeviceExtension, IN PUCHAR RomBase, IN ULONG RomLength, IN PUCHAR String)
 
BOOLEAN NTAPI VideoPortSynchronizeExecution (IN PVOID HwDeviceExtension, IN VIDEO_SYNCHRONIZE_PRIORITY Priority, IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, OUT PVOID Context)
 
NTSTATUS NTAPI IntVideoPortEnumerateChildren (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
VP_STATUS NTAPI VideoPortEnumerateChildren (IN PVOID HwDeviceExtension, IN PVOID Reserved)
 
VP_STATUS NTAPI VideoPortCreateSecondaryDisplay (IN PVOID HwDeviceExtension, IN OUT PVOID *SecondaryDeviceExtension, IN ULONG Flag)
 
BOOLEAN NTAPI VideoPortQueueDpc (IN PVOID HwDeviceExtension, IN PMINIPORT_DPC_ROUTINE CallbackRoutine, IN PVOID Context)
 
PVOID NTAPI VideoPortGetAssociatedDeviceExtension (IN PVOID DeviceObject)
 
VP_STATUS NTAPI VideoPortGetVersion (IN PVOID HwDeviceExtension, IN OUT PVPOSVERSIONINFO VpOsVersionInfo)
 
BOOLEAN NTAPI VideoPortCheckForDeviceExistence (IN PVOID HwDeviceExtension, IN USHORT VendorId, IN USHORT DeviceId, IN UCHAR RevisionId, IN USHORT SubVendorId, IN USHORT SubSystemId, IN ULONG Flags)
 
VP_STATUS NTAPI VideoPortRegisterBugcheckCallback (IN PVOID HwDeviceExtension, IN ULONG BugcheckCode, IN PVIDEO_BUGCHECK_CALLBACK Callback, IN ULONG BugcheckDataSize)
 
LONGLONG NTAPI VideoPortQueryPerformanceCounter (IN PVOID HwDeviceExtension, OUT PLONGLONG PerformanceFrequency OPTIONAL)
 
VOID NTAPI VideoPortAcquireDeviceLock (IN PVOID HwDeviceExtension)
 
VOID NTAPI VideoPortReleaseDeviceLock (IN PVOID HwDeviceExtension)
 
VOID NTAPI VpNotifyEaData (IN PDEVICE_OBJECT DeviceObject, IN PVOID Data)
 
PVOID NTAPI VideoPortAllocateContiguousMemory (IN PVOID HwDeviceExtension, IN ULONG NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
 
BOOLEAN NTAPI VideoPortIsNoVesa (VOID)
 

Variables

ULONG VideoDebugLevel = 0
 
BOOLEAN VpBaseVideo = FALSE
 
BOOLEAN VpNoVesa = FALSE
 
PKPROCESS CsrProcess = NULL
 
static ULONG VideoPortMaxObjectNumber = -1
 
BOOLEAN VideoPortUseNewKey = FALSE
 
KSPIN_LOCK HwResetAdaptersLock
 
KMUTEX VgaSyncLock
 
PVIDEO_PORT_DEVICE_EXTENSION VgaDeviceExtension = NULL
 
PVIDEO_ACCESS_RANGE VgaRanges = NULL
 
ULONG NumOfVgaRanges = 0
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 29 of file videoprt.c.

Typedef Documentation

◆ PQUERY_REGISTRY_CALLBACK_CONTEXT

◆ QUERY_REGISTRY_CALLBACK_CONTEXT

Function Documentation

◆ DriverEntry()

ULONG NTAPI DriverEntry ( IN PVOID  Context1,
IN PVOID  Context2 
)

Definition at line 62 of file videoprt.c.

65{
66 return STATUS_SUCCESS;
67}
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ IntAttachToCSRSS()

BOOLEAN FASTCALL IntAttachToCSRSS ( _Outptr_ PKPROCESS CallingProcess,
_Out_ PKAPC_STATE  ApcState 
)

Attach the current thread to the CSRSS process. The caller must detach from the process by invoking IntDetachFromCSRSS() after operating in its context.

Parameters
[out]CallingProcessPointer to a PKPROCESS variable that receives the current process.
[out]ApcStatePointer to a caller-provided KAPC_STATE structure that will be initialized.
Returns
TRUE if attachment succeeded (the CSRSS process exists); FALSE if not.

Definition at line 748 of file videoprt.c.

751{
752 if (!CsrProcess)
753 return FALSE;
754
755 *CallingProcess = (PKPROCESS)PsGetCurrentProcess();
756 if (*CallingProcess != CsrProcess)
758 return TRUE;
759}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1769
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
Definition: procobj.c:704
PKPROCESS CsrProcess
Definition: videoprt.c:39
struct _KPROCESS * PKPROCESS
Definition: wdm.template.h:201
#define PsGetCurrentProcess
Definition: psfuncs.h:17

Referenced by VideoPortGetRomImage().

◆ IntDetachFromCSRSS()

VOID FASTCALL IntDetachFromCSRSS ( _In_ PKPROCESS  CallingProcess,
_In_ PKAPC_STATE  ApcState 
)

Detach the current thread from the CSRSS process. This routine is to be invoked after a previous successful IntAttachToCSRSS() call.

Parameters
[in]CallingProcessThe calling process that previously invoked IntAttachToCSRSS().
[in]ApcStatePointer to the KAPC_STATE structure that was initialized by a previous IntAttachToCSRSS() call.

Definition at line 775 of file videoprt.c.

778{
780 if (CallingProcess != CsrProcess)
782}
#define ASSERT(a)
Definition: mode.c:44
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
Definition: procobj.c:756

Referenced by VideoPortGetRomImage().

◆ IntIsVgaSaveDriver()

static BOOLEAN IntIsVgaSaveDriver ( _In_ PDRIVER_OBJECT  DriverObject)
static

Definition at line 53 of file videoprt.c.

55{
56 static const UNICODE_STRING VgaSave = RTL_CONSTANT_STRING(L"\\Driver\\VgaSave");
57 return RtlEqualUnicodeString(&VgaSave, &DriverObject->DriverName, TRUE);
58}
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
#define L(x)
Definition: resources.c:13
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213

Referenced by IntVideoPortCreateAdapterDeviceObject().

◆ IntLoadRegistryParameters()

VOID FASTCALL IntLoadRegistryParameters ( VOID  )

Definition at line 786 of file videoprt.c.

787{
790 UNICODE_STRING KeyPath;
791 UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions");
795
796 /* Check if we need to use new registry */
797 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\UseNewKey");
799 &KeyPath,
801 NULL,
802 NULL);
803 Status = ZwOpenKey(&KeyHandle,
806 if (NT_SUCCESS(Status))
807 {
810 }
811
812#ifdef _M_IX86
813 /* Check whether we need to use the 32-bit x86 emulator instead of V86 mode */
814 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\DisableEmulator");
816 &KeyPath,
818 NULL,
819 NULL);
820 Status = ZwOpenKey(&KeyHandle,
823 if (NT_SUCCESS(Status))
824 {
825 VideoPortDisableX86Emulator = TRUE;
827 }
828 DPRINT1("Using %s\n", VideoPortDisableX86Emulator ? "V86 mode" : "x86 emulator");
829#endif // _M_IX86
830
831 /* Initialize object attributes with the path we want */
832 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control");
834 &KeyPath,
836 NULL,
837 NULL);
838
839 /* Open the key */
840 Status = ZwOpenKey(&KeyHandle,
843 if (!NT_SUCCESS(Status))
844 {
845 VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status);
846 return;
847 }
848
849 /* Find out how large our buffer should be */
850 Status = ZwQueryValueKey(KeyHandle,
851 &ValueName,
853 NULL,
854 0,
855 &Length);
857 {
858 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
860 return;
861 }
862
863 /* Allocate it */
865 if (!KeyInfo)
866 {
867 VideoPortDebugPrint(Error, "Out of memory\n");
869 return;
870 }
871
872 /* Now for real this time */
873 Status = ZwQueryValueKey(KeyHandle,
874 &ValueName,
876 KeyInfo,
877 Length,
878 &NewLength);
880
881 if (!NT_SUCCESS(Status))
882 {
883 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
885 return;
886 }
887
888 /* Sanity check */
889 if (KeyInfo->Type != REG_SZ)
890 {
891 VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n");
893 return;
894 }
895
896 /* Check if BASEVIDEO or NOVESA is present in the start options */
897 if (wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO"))
899 if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA"))
900 VpNoVesa = TRUE;
901
903
904 /* FIXME: Old ReactOS-compatibility... */
906
907 if (VpNoVesa)
908 VideoPortDebugPrint(Info, "VESA mode disabled\n");
909 else
910 VideoPortDebugPrint(Info, "VESA mode enabled\n");
911
912 /* If we are in BASEVIDEO, create the volatile registry key for Win32k */
913 if (VpBaseVideo)
914 {
915 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\BaseVideo");
917 &KeyPath,
919 NULL,
920 NULL);
921
922 Status = ZwCreateKey(&KeyHandle,
923 READ_CONTROL, // Non-0 placeholder: no use for this handle.
925 0,
926 NULL,
928 NULL);
929 if (NT_SUCCESS(Status))
931 else
932 ERR_(VIDEOPRT, "Failed to create the BaseVideo key (0x%x)\n", Status);
933 }
934
935 return;
936}
static USHORT USHORT * NewLength
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
BOOL Error
Definition: chkdsk.c:66
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
_ACRTIMP wchar_t *__cdecl wcsstr(const wchar_t *, const wchar_t *)
Definition: wcs.c:2998
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:24
#define REG_SZ
Definition: layer.c:22
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
@ KeyValuePartialInformation
Definition: nt_native.h:1185
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define READ_CONTROL
Definition: nt_native.h:58
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1063
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define ERR_(ch,...)
Definition: debug.h:156
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
BOOLEAN VideoPortUseNewKey
Definition: videoprt.c:41
VOID __cdecl VideoPortDebugPrint(_In_ VIDEO_DEBUG_LEVEL DebugPrintLevel, _In_ PSTR DebugMessage, _In_ ...)
Definition: videoprt.c:1145
BOOLEAN VpNoVesa
Definition: videoprt.c:37
BOOLEAN VpBaseVideo
Definition: videoprt.c:36
#define TAG_VIDEO_PORT
Definition: videoprt.h:38
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243

Referenced by VideoPortInitialize().

◆ IntVideoPortAddDeviceMapLink()

static NTSTATUS IntVideoPortAddDeviceMapLink ( PVIDEO_PORT_DEVICE_EXTENSION  DeviceExtension)
static

Definition at line 71 of file videoprt.c.

73{
75 WCHAR DeviceBuffer[20];
77 WCHAR SymlinkBuffer[20];
78 UNICODE_STRING SymlinkName;
81
82 /* Create a unicode device name */
83 DeviceNumber = DeviceExtension->DeviceNumber;
84 _swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
85
87 RegistryPath = &DeviceExtension->NewRegistryPath;
88 else
89 RegistryPath = &DeviceExtension->RegistryPath;
90
91 /* Add entry to DEVICEMAP\VIDEO key in registry */
93 L"VIDEO",
94 DeviceBuffer,
95 REG_SZ,
96 RegistryPath->Buffer,
97 RegistryPath->Length + sizeof(UNICODE_NULL));
98 if (!NT_SUCCESS(Status))
99 {
100 ERR_(VIDEOPRT, "Failed to create DEVICEMAP registry entry: 0x%X\n", Status);
101 return Status;
102 }
103
105 L"VIDEO",
106 L"MaxObjectNumber",
107 REG_DWORD,
109 sizeof(DeviceNumber));
110 if (!NT_SUCCESS(Status))
111 {
112 ERR_(VIDEOPRT, "Failed to write MaxObjectNumber: 0x%X\n", Status);
113 return Status;
114 }
115
116 /* Create symbolic link "\??\DISPLAYx" */
117 _swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
118 RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
119 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
120 Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
121 if (!NT_SUCCESS(Status))
122 {
123 ERR_(VIDEOPRT, "Failed to create symbolic link: 0x%X\n", Status);
124 return Status;
125 }
126
127 /* Update MaxObjectNumber */
129
130 return STATUS_SUCCESS;
131}
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1230
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
#define RTL_REGISTRY_DEVICEMAP
Definition: nt_native.h:165
#define UNICODE_NULL
short WCHAR
Definition: pedump.c:58
#define REG_DWORD
Definition: sdbapi.c:615
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
UNICODE_STRING NewRegistryPath
Definition: videoprt.h:91
static ULONG VideoPortMaxObjectNumber
Definition: videoprt.c:40
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)

Referenced by IntVideoPortCreateAdapterDeviceObject().

◆ IntVideoPortCreateAdapterDeviceObject()

NTSTATUS NTAPI IntVideoPortCreateAdapterDeviceObject ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PVIDEO_PORT_DRIVER_EXTENSION  DriverExtension,
_In_opt_ PDEVICE_OBJECT  PhysicalDeviceObject,
_In_ USHORT  AdapterNumber,
_In_ USHORT  DisplayNumber,
_Out_opt_ PDEVICE_OBJECT DeviceObject 
)

Definition at line 171 of file videoprt.c.

178{
179 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
181 ULONG PciSlotNumber;
183 ULONG Size;
185 WCHAR DeviceBuffer[20];
187 PDEVICE_OBJECT DeviceObject_;
188
189 if (DeviceObject == NULL)
190 DeviceObject = &DeviceObject_;
191
192 /*
193 * Find the first free device number that can be used for video device
194 * object names and symlinks.
195 */
197 if (DeviceNumber == (ULONG)-1)
198 {
199 WARN_(VIDEOPRT, "Can't find free device number\n");
200 return STATUS_UNSUCCESSFUL;
201 }
202
203 /*
204 * Create the device object.
205 */
206
207 /* Create a unicode device name */
208 _swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
209 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
210
211 INFO_(VIDEOPRT, "HwDeviceExtension size is: 0x%x\n",
212 DriverExtension->InitializationData.HwDeviceExtensionSize);
213
214 /* Create the device object */
216 DriverExtension->InitializationData.HwDeviceExtensionSize;
218 Size,
219 &DeviceName,
221 0,
222 TRUE,
224
225 if (!NT_SUCCESS(Status))
226 {
227 WARN_(VIDEOPRT, "IoCreateDevice call failed with status 0x%08x\n", Status);
228 return Status;
229 }
230
231 /*
232 * Set the buffering strategy here. If you change this, remember
233 * to change VidDispatchDeviceControl too.
234 */
235
236 (*DeviceObject)->Flags |= DO_BUFFERED_IO;
237
238 /* Initialize device extension */
239 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)((*DeviceObject)->DeviceExtension);
240 DeviceExtension->Common.Fdo = TRUE;
241 DeviceExtension->DeviceNumber = DeviceNumber;
242 DeviceExtension->DriverObject = DriverObject;
244 DeviceExtension->FunctionalDeviceObject = *DeviceObject;
245 DeviceExtension->DriverExtension = DriverExtension;
246 DeviceExtension->SessionId = -1;
247 DeviceExtension->AdapterNumber = AdapterNumber;
248 DeviceExtension->DisplayNumber = DisplayNumber;
249 DeviceExtension->IsVgaDriver = IntIsVgaSaveDriver(DriverObject);
250
251 InitializeListHead(&DeviceExtension->ChildDeviceList);
252
253 /*
254 * Miniport owns this blob; many miniports assume it's initially zeroed.
255 * Removing this crashes the NVIDIA GPU driver.
256 */
257 RtlZeroMemory(DeviceExtension->MiniPortDeviceExtension,
258 DriverExtension->InitializationData.HwDeviceExtensionSize);
259
260 /* Get the registry path associated with this device */
262 DeviceExtension->AdapterNumber,
263 &DeviceExtension->RegistryPath);
264 if (!NT_SUCCESS(Status))
265 {
266 WARN_(VIDEOPRT, "IntCreateRegistryPath() call failed with status 0x%08x\n", Status);
267 goto Failure;
268 }
269
271 {
272 /* Get bus number from the upper level bus driver */
273 Size = sizeof(ULONG);
276 Size,
277 &DeviceExtension->SystemIoBusNumber,
278 &Size);
279 if (!NT_SUCCESS(Status))
280 {
281 WARN_(VIDEOPRT, "Couldn't get an information from bus driver. We will try to\n"
282 "use legacy detection method, but even that doesn't mean that\n"
283 "it will work.\n");
284 DeviceExtension->PhysicalDeviceObject = NULL;
285 }
286 }
287
288 DeviceExtension->AdapterInterfaceType =
289 DriverExtension->InitializationData.AdapterInterfaceType;
290
292 {
293 /* Get bus type from the upper level bus driver */
294 Size = sizeof(ULONG);
297 Size,
298 &DeviceExtension->AdapterInterfaceType,
299 &Size);
300
301 /* Get bus device address from the upper level bus driver */
302 Size = sizeof(ULONG);
305 Size,
306 &PciSlotNumber,
307 &Size);
308
309 /* Convert slotnumber to PCI_SLOT_NUMBER */
310 SlotNumber.u.AsULONG = 0;
311 SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF;
312 SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF;
313 DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG;
314 }
315
317 InitializeListHead(&DeviceExtension->DmaAdapterList);
318
319 KeInitializeDpc(&DeviceExtension->DpcObject,
321 DeviceExtension);
322
323 KeInitializeMutex(&DeviceExtension->DeviceLock, 0);
324
325 /* Attach the device */
326 if ((PhysicalDeviceObject != NULL) && (DisplayNumber == 0))
330
331 Status = IntCreateNewRegistryPath(DeviceExtension);
332 if (!NT_SUCCESS(Status))
333 {
334 ERR_(VIDEOPRT, "IntCreateNewRegistryPath() failed with status 0x%08x\n", Status);
335 goto Failure;
336 }
337
338 IntSetupDeviceSettingsKey(DeviceExtension);
339
340 /* Remove the initializing flag */
341 (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
342
343 /* Set up the VIDEO/DEVICEMAP registry keys */
344 Status = IntVideoPortAddDeviceMapLink(DeviceExtension);
345 if (!NT_SUCCESS(Status))
346 {
347 ERR_(VIDEOPRT, "IntVideoPortAddDeviceMapLink() failed with status 0x%08x\n", Status);
348 goto Failure;
349 }
350
351 if (DisplayNumber == 0)
352 {
353 DriverExtension->InitializationData.StartingDeviceNumber++;
354 }
355
356 return STATUS_SUCCESS;
357
358Failure:
359 if (DeviceExtension->NextDeviceObject)
360 IoDetachDevice(DeviceExtension->NextDeviceObject);
363 return Status;
364}
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
#define DO_BUFFERED_IO
Definition: env_spec_w32.h:394
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:967
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1032
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1297
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1252
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
Definition: mutex.c:67
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:1382
#define FILE_DEVICE_VIDEO
Definition: winioctl.h:80
#define INFO_(ch,...)
Definition: debug.h:159
#define WARN_(ch,...)
Definition: debug.h:157
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
INTERFACE_TYPE AdapterInterfaceType
Definition: videoprt.h:98
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:118
LIST_ENTRY AddressMappingListHead
Definition: videoprt.h:101
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:84
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:86
PDEVICE_OBJECT FunctionalDeviceObject
Definition: videoprt.h:88
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
VOID NTAPI IntVideoPortDeferredRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: videoprt.c:158
static BOOLEAN IntIsVgaSaveDriver(_In_ PDRIVER_OBJECT DriverObject)
Definition: videoprt.c:53
static NTSTATUS IntVideoPortAddDeviceMapLink(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: videoprt.c:71
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
struct _VIDEO_PORT_DEVICE_EXTENSTION VIDEO_PORT_DEVICE_EXTENSION
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
NTSTATUS NTAPI IntCreateRegistryPath(IN PCUNICODE_STRING DriverRegistryPath, IN ULONG DeviceNumber, OUT PUNICODE_STRING DeviceRegistryPath)
Definition: registry.c:603
NTSTATUS NTAPI IntCreateNewRegistryPath(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:408
NTSTATUS NTAPI IntSetupDeviceSettingsKey(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:298
@ DevicePropertyAddress
Definition: iotypes.h:1211
@ DevicePropertyBusNumber
Definition: iotypes.h:1209
@ DevicePropertyLegacyBusType
Definition: iotypes.h:1208

Referenced by IntVideoPortAddDevice(), IntVideoPortFindAdapter(), and VideoPortCreateSecondaryDisplay().

◆ IntVideoPortDeferredRoutine()

VOID NTAPI IntVideoPortDeferredRoutine ( IN PKDPC  Dpc,
IN PVOID  DeferredContext,
IN PVOID  SystemArgument1,
IN PVOID  SystemArgument2 
)

Definition at line 158 of file videoprt.c.

163{
164 PVOID HwDeviceExtension =
165 &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension;
167}
VOID(NTAPI * PMINIPORT_DPC_ROUTINE)(IN PVOID HwDeviceExtension, IN PVOID Context)
Definition: video.h:518
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:756
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:755
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:757

Referenced by IntVideoPortCreateAdapterDeviceObject().

◆ IntVideoPortEnumBusCallback()

static NTSTATUS NTAPI IntVideoPortEnumBusCallback ( _In_ PVOID  Context,
_In_ PUNICODE_STRING  PathName,
_In_ INTERFACE_TYPE  BusType,
_In_ ULONG  BusNumber,
_In_ PKEY_VALUE_FULL_INFORMATION BusInformation,
_In_ CONFIGURATION_TYPE  ControllerType,
_In_ ULONG  ControllerNumber,
_In_ PKEY_VALUE_FULL_INFORMATION ControllerInformation,
_In_ CONFIGURATION_TYPE  PeripheralType,
_In_ ULONG  PeripheralNumber,
_In_ PKEY_VALUE_FULL_INFORMATION PeripheralInformation 
)
static

A PIO_QUERY_DEVICE_ROUTINE callback for IoQueryDeviceDescription() to return success when an enumerated bus has been found.

Definition at line 373 of file videoprt.c.

385{
387 UNREFERENCED_PARAMETER(PathName);
391 UNREFERENCED_PARAMETER(ControllerType);
392 UNREFERENCED_PARAMETER(ControllerNumber);
393 UNREFERENCED_PARAMETER(ControllerInformation);
394 UNREFERENCED_PARAMETER(PeripheralType);
395 UNREFERENCED_PARAMETER(PeripheralNumber);
396 UNREFERENCED_PARAMETER(PeripheralInformation);
397
398 /* The bus has been found */
399 return STATUS_SUCCESS;
400}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
_In_ ULONG BusNumber
Definition: pciidex.h:65
_In_ PVOID Context
Definition: storport.h:2269
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
Definition: wdfdevice.h:3921
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE BusType
Definition: halfuncs.h:159

Referenced by IntVideoPortEnumBuses().

◆ IntVideoPortEnumBuses()

static NTSTATUS IntVideoPortEnumBuses ( _In_ INTERFACE_TYPE  AdapterInterfaceType,
_Inout_ PULONG  BusNumber 
)
static

Enumerates all supported buses on the system.

Definition at line 407 of file videoprt.c.

410{
411 // TODO: Forward-compatibility with Windows 7+:
412 // In case AdapterInterfaceType == PCIBus, check for the
413 // \Registry\HARDWARE\DESCRIPTION\System\VideoAdapterBusses
414 // key (created by pci.sys) that enumerates the PCI buses that
415 // are known to have video display adapters on them.
416 // This is a handy shortcut for videoprt, that would otherwise
417 // have to enumerate all the PCI buses (PCI_MAX_BRIDGE_NUMBER)
418 // to locate any video adapter.
419 // Otherwise, fall back to the usual method done below.
420
421 /* Find the next bus of the given type */
422 return IoQueryDeviceDescription(&AdapterInterfaceType,
423 BusNumber,
424 NULL,
425 NULL,
426 NULL,
427 NULL,
429 NULL);
430}
NTSTATUS NTAPI IoQueryDeviceDescription(_In_opt_ PINTERFACE_TYPE BusType, _In_opt_ PULONG BusNumber, _In_opt_ PCONFIGURATION_TYPE ControllerType, _In_opt_ PULONG ControllerNumber, _In_opt_ PCONFIGURATION_TYPE PeripheralType, _In_opt_ PULONG PeripheralNumber, _In_ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, _In_opt_ PVOID Context)
Reads and returns Hardware information from the appropriate hardware registry key.
Definition: iorsrce.c:1213
static NTSTATUS NTAPI IntVideoPortEnumBusCallback(_In_ PVOID Context, _In_ PUNICODE_STRING PathName, _In_ INTERFACE_TYPE BusType, _In_ ULONG BusNumber, _In_ PKEY_VALUE_FULL_INFORMATION *BusInformation, _In_ CONFIGURATION_TYPE ControllerType, _In_ ULONG ControllerNumber, _In_ PKEY_VALUE_FULL_INFORMATION *ControllerInformation, _In_ CONFIGURATION_TYPE PeripheralType, _In_ ULONG PeripheralNumber, _In_ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation)
A PIO_QUERY_DEVICE_ROUTINE callback for IoQueryDeviceDescription() to return success when an enumerat...
Definition: videoprt.c:373

Referenced by IntVideoPortFindAdapter().

◆ IntVideoPortEnumerateChildren()

NTSTATUS NTAPI IntVideoPortEnumerateChildren ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1478 of file videoprt.c.

1481{
1482 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1483 ULONG Status;
1484 VIDEO_CHILD_ENUM_INFO ChildEnumInfo;
1485 BOOLEAN bHaveLastMonitorID = FALSE;
1486 UCHAR LastMonitorID[10];
1487 ULONG Uid, Unused;
1488 UINT i;
1489 PDEVICE_OBJECT ChildDeviceObject;
1490 PVIDEO_PORT_CHILD_EXTENSION ChildExtension;
1491
1492 INFO_(VIDEOPRT, "Starting child device probe\n");
1493 DeviceExtension = DeviceObject->DeviceExtension;
1495 {
1496 WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n");
1497 return STATUS_SUCCESS;
1498 }
1499
1500 if (!IsListEmpty(&DeviceExtension->ChildDeviceList))
1501 {
1502 ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n");
1503 return STATUS_SUCCESS;
1504 }
1505
1506 /* Enumerate the children */
1507 for (i = 1; ; i++)
1508 {
1509 Status = IoCreateDevice(DeviceExtension->DriverObject,
1512 NULL,
1515 FALSE,
1516 &ChildDeviceObject);
1517 if (!NT_SUCCESS(Status))
1518 return Status;
1519
1520 ChildExtension = ChildDeviceObject->DeviceExtension;
1521
1522 RtlZeroMemory(ChildExtension,
1525
1526 ChildExtension->Common.Fdo = FALSE;
1527 ChildExtension->ChildId = i;
1528 ChildExtension->PhysicalDeviceObject = ChildDeviceObject;
1529 ChildExtension->DriverObject = DeviceExtension->DriverObject;
1530
1531 /* Setup the ChildEnumInfo */
1532 ChildEnumInfo.Size = sizeof(ChildEnumInfo);
1533 ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor);
1534 ChildEnumInfo.ACPIHwId = 0;
1535
1537 ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension);
1538 else
1539 ChildEnumInfo.ChildHwDeviceExtension = NULL;
1540
1541 ChildEnumInfo.ChildIndex = ChildExtension->ChildId;
1542
1543 INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex);
1545 DeviceExtension->MiniPortDeviceExtension,
1546 &ChildEnumInfo,
1547 &ChildExtension->ChildType,
1548 ChildExtension->ChildDescriptor,
1549 &Uid,
1550 &Unused);
1552 {
1553 if (ChildExtension->ChildType == Monitor)
1554 {
1555 // Check if the EDID is valid
1556 if (ChildExtension->ChildDescriptor[0] == 0x00 &&
1557 ChildExtension->ChildDescriptor[1] == 0xFF &&
1558 ChildExtension->ChildDescriptor[2] == 0xFF &&
1559 ChildExtension->ChildDescriptor[3] == 0xFF &&
1560 ChildExtension->ChildDescriptor[4] == 0xFF &&
1561 ChildExtension->ChildDescriptor[5] == 0xFF &&
1562 ChildExtension->ChildDescriptor[6] == 0xFF &&
1563 ChildExtension->ChildDescriptor[7] == 0x00)
1564 {
1565 if (bHaveLastMonitorID)
1566 {
1567 // Compare the previous monitor ID with the current one, break the loop if they are identical
1568 if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID))
1569 {
1570 INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n");
1571 IoDeleteDevice(ChildDeviceObject);
1572 break;
1573 }
1574 }
1575
1576 // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor
1577 RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID));
1578 bHaveLastMonitorID = TRUE;
1579
1580 /* Mark it valid */
1581 ChildExtension->EdidValid = TRUE;
1582 }
1583 else
1584 {
1585 /* Mark it invalid */
1586 ChildExtension->EdidValid = FALSE;
1587 }
1588 }
1589 }
1591 {
1592 WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex);
1593 IoDeleteDevice(ChildDeviceObject);
1594 continue;
1595 }
1597 {
1598 INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1);
1599 IoDeleteDevice(ChildDeviceObject);
1600 break;
1601 }
1602 else
1603 {
1604 WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status);
1605 IoDeleteDevice(ChildDeviceObject);
1606 break;
1607 }
1608
1609 if (ChildExtension->ChildType == Monitor)
1610 {
1611 UINT j;
1612 PUCHAR p = ChildExtension->ChildDescriptor;
1613 INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId);
1614 for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8)
1615 {
1616 INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
1617 p[j + 0], p[j + 1], p[j + 2], p[j + 3],
1618 p[j + 4], p[j + 5], p[j + 6], p[j + 7]);
1619 }
1620 }
1621 else if (ChildExtension->ChildType == Other)
1622 {
1623 INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor);
1624 }
1625 else
1626 {
1627 ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType);
1628 }
1629
1630 /* Clear the init flag */
1631 ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
1632
1633 InsertTailList(&DeviceExtension->ChildDeviceList,
1634 &ChildExtension->ListEntry);
1635 }
1636
1637 return STATUS_SUCCESS;
1638}
unsigned char BOOLEAN
Definition: actypes.h:127
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
GLfloat GLfloat p
Definition: glext.h:8902
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
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 GLint GLint j
Definition: glfuncs.h:250
unsigned int UINT
Definition: sysinfo.c:13
#define Unused(x)
Definition: atlwin.h:28
#define FILE_DEVICE_CONTROLLER
Definition: winioctl.h:49
#define VIDEO_ENUM_INVALID_DEVICE
Definition: video.h:141
#define VIDEO_ENUM_NO_MORE_DEVICES
Definition: video.h:140
@ Monitor
Definition: video.h:270
@ Other
Definition: video.h:273
#define VIDEO_ENUM_MORE_DEVICES
Definition: video.h:139
PVOID DeviceExtension
Definition: env_spec_w32.h:418
ULONG ChildDescriptorSize
Definition: video.h:262
PVOID ChildHwDeviceExtension
Definition: video.h:265
PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor
Definition: video.h:685
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:132
VIDEO_CHILD_TYPE ChildType
Definition: videoprt.h:126
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:131
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:123
VIDEO_HW_INITIALIZATION_DATA InitializationData
Definition: videoprt.h:72
uint16_t * PWSTR
Definition: typedefs.h:56
unsigned char UCHAR
Definition: typedefs.h:53
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
unsigned char * PUCHAR
Definition: typedefs.h:53
#define VIDEO_PORT_GET_CHILD_EXTENSION(MiniportExtension)
Definition: videoprt.h:139

Referenced by IntVideoPortQueryBusRelations().

◆ IntVideoPortFindAdapter()

NTSTATUS IntVideoPortFindAdapter ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PVIDEO_PORT_DRIVER_EXTENSION  DriverExtension,
_In_ _When_(LegacyDetection, _Null_) PDEVICE_OBJECT  DeviceObject,
_In_ BOOLEAN  LegacyDetection 
)

Definition at line 433 of file videoprt.c.

438{
439 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
441 VP_STATUS vpStatus;
442 VIDEO_PORT_CONFIG_INFO ConfigInfo;
444 UCHAR Again = FALSE;
445 BOOLEAN VgaResourcesReleased = FALSE;
446
447 if (LegacyDetection)
448 {
452 NULL, // No DeviceExtension->PhysicalDeviceObject
453 DriverExtension->InitializationData.StartingDeviceNumber,
454 0,
455 &DeviceObject);
456 if (!NT_SUCCESS(Status))
457 {
458 ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status);
459 return Status;
460 }
461 }
462
463 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
464 DeviceExtension->IsVgaDetect = DeviceExtension->IsVgaDriver;
465 DeviceExtension->IsLegacyDetect = FALSE;
466 DeviceExtension->ReportDevice = FALSE;
467
468 /* Setup a ConfigInfo structure that we will pass to HwFindAdapter */
469 RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO));
470 ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO);
471 ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType;
472 if (ConfigInfo.AdapterInterfaceType == PCIBus)
473 ConfigInfo.InterruptMode = LevelSensitive;
474 else
475 ConfigInfo.InterruptMode = Latched;
476 ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer;
478 ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
479 ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel;
480 ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector;
481
484 sizeof(SystemBasicInfo),
485 NULL);
486 if (NT_SUCCESS(Status))
487 {
490 }
491
492 // FIXME: Check the adapter key and update VideoDebugLevel variable.
493
494 /*
495 * Call the miniport HwVidFindAdapter entry point to detect if this
496 * particular device is present. There are two possible code paths.
497 * The first one is for Legacy drivers (NT4) and cases when we don't
498 * have information about what bus we're on. The second case is the
499 * standard one for Plug & Play drivers.
500 */
501 if (DeviceExtension->PhysicalDeviceObject == NULL)
502 {
503 ASSERT(LegacyDetection == TRUE);
504 DeviceExtension->IsLegacyDevice = TRUE;
505 DeviceExtension->IsLegacyDetect = TRUE;
506 }
507 else
508 {
509 ASSERT(LegacyDetection == FALSE);
510 DeviceExtension->IsLegacyDevice = FALSE;
511 }
512
513 /* If we already have a VGA miniport and are about to probe for additional adapters,
514 * release its resources temporarily so conflicts are visible during detection.
515 * We'll reclaim them later if no new adapter successfully claims them. */
518 {
519 INFO_(VIDEOPRT, "Temporarily releasing VGA resources for adapter probing\n");
521 VgaResourcesReleased = TRUE;
522 }
524
525 if (LegacyDetection)
526 {
528
529 /* Suppose first we may not find any suitable device */
530 vpStatus = ERROR_DEV_NOT_EXIST; // ERROR_NO_MORE_DEVICES;
531
532 /* Enumerate all buses of the given type, call HwFindAdapter for each
533 * to find whether a video adapter is recognized there. Stop when an
534 * adapter has been found. */
535 for (BusNumber = 0;
536 (BusNumber < MAXULONG) &&
538 &BusNumber));
539 ++BusNumber)
540 {
541 DPRINT("Bus Type %lu, Number %lu\n",
542 DeviceExtension->AdapterInterfaceType, BusNumber);
543
544 DeviceExtension->SystemIoBusNumber =
545 ConfigInfo.SystemIoBusNumber = BusNumber;
546
547 RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension,
548 DriverExtension->InitializationData.HwDeviceExtensionSize);
549
550 // FIXME: Need to figure out what string to pass as param 3.
551 // FIXME: Handle the 'Again' parameter for legacy detection.
552 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
553 &DeviceExtension->MiniPortDeviceExtension,
554 DriverExtension->HwContext,
555 NULL,
556 &ConfigInfo,
557 &Again);
558
559 if (vpStatus == ERROR_DEV_NOT_EXIST)
560 continue;
561 else
562 break;
563 }
564 }
565 else
566 {
567 // FIXME: Need to figure out what string to pass as param 3.
568 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
569 &DeviceExtension->MiniPortDeviceExtension,
570 DriverExtension->HwContext,
571 NULL,
572 &ConfigInfo,
573 &Again);
574 }
575
576 if (vpStatus != NO_ERROR)
577 {
578 ERR_(VIDEOPRT, "HwFindAdapter failed (vpStatus=0x%X) bus=%u iface=%u legacy=%u vga=%u detect(VGA=%u LEGACY=%u)\n",
579 vpStatus,
580 DeviceExtension->SystemIoBusNumber,
581 DeviceExtension->AdapterInterfaceType,
582 DeviceExtension->IsLegacyDevice,
583 DeviceExtension->IsVgaDriver,
584 DeviceExtension->IsVgaDetect,
585 DeviceExtension->IsLegacyDetect);
586 /* If we released VGA resources, reclaim them so VGA fallback still works */
587 if (VgaResourcesReleased)
588 {
590 {
591 INFO_(VIDEOPRT, "Reclaiming VGA resources after failed probe\n");
595 {
596 WARN_(VIDEOPRT, "Failed to reclaim VGA resources after probe failure\n");
597 }
598 }
599 }
601 goto Failure;
602 }
603
604 /*
605 * Now we know the device is present, so let's do all additional tasks
606 * such as creating symlinks or setting up interrupts and timer.
607 */
608
609 // FIXME: Allocate hardware resources for device.
610
611 /* Allocate interrupt for device */
613 {
615 goto Failure;
616 }
617
618 /* Allocate timer for device */
620 {
621 if (DeviceExtension->InterruptObject != NULL)
622 IoDisconnectInterrupt(DeviceExtension->InterruptObject);
623 ERR_(VIDEOPRT, "IntVideoPortSetupTimer failed\n");
625 goto Failure;
626 }
627
628 /* If the device can be reset, insert it in the list of resettable adapters */
629 InitializeListHead(&DeviceExtension->HwResetListEntry);
630 if (DriverExtension->InitializationData.HwResetHw != NULL)
631 {
633 &DeviceExtension->HwResetListEntry,
635 }
636
637 if (DeviceExtension->IsVgaDriver)
638 {
641 {
642 VgaDeviceExtension = DeviceExtension;
643 }
645 }
646
647 DeviceExtension->IsVgaDetect = FALSE;
648 DeviceExtension->IsLegacyDetect = FALSE;
649
650 /* For legacy (non-PnP) adapters we should report a detected device so that
651 * a PDO exists for higher layers to enumerate consistently (mirrors ScsiPort). */
652 if (DeviceExtension->IsLegacyDevice && !DeviceExtension->ReportDevice)
653 {
654 PDEVICE_OBJECT ReportedPdo = NULL;
656 DeviceExtension->AdapterInterfaceType,
657 DeviceExtension->SystemIoBusNumber,
658 DeviceExtension->SystemIoSlotNumber,
659 NULL,
660 NULL,
661 FALSE,
662 &ReportedPdo);
663 if (!NT_SUCCESS(repStatus))
664 {
665 WARN_(VIDEOPRT, "IoReportDetectedDevice failed 0x%08lx (bus=%u slot=%u)\n",
666 repStatus,
667 DeviceExtension->SystemIoBusNumber,
668 DeviceExtension->SystemIoSlotNumber);
669 }
670 else
671 {
672 INFO_(VIDEOPRT, "Reported legacy adapter PDO %p (bus=%u slot=%u)\n",
673 ReportedPdo,
674 DeviceExtension->SystemIoBusNumber,
675 DeviceExtension->SystemIoSlotNumber);
676 DeviceExtension->ReportDevice = TRUE;
677 }
678 }
679
680 /* Attempt to reclaim VGA resources after probing if a VGA device exists */
682 {
683 VP_STATUS vr;
684 INFO_(VIDEOPRT, "Attempt VGA reclaim after probe (ranges=%lu)\n", NumOfVgaRanges);
687 VgaRanges);
688 if (vr != NO_ERROR)
689 {
690 /* Another driver has taken VGA resources; drop fallback state */
691 WARN_(VIDEOPRT, "VGA reclaim failed (vpStatus=0x%X); releasing fallback state\n", vr);
694 VgaRanges = NULL;
695 NumOfVgaRanges = 0;
698
699 }
700 else
701 {
702 INFO_(VIDEOPRT, "VGA reclaim succeeded\n");
703 }
704 }
705
706 INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
707 return STATUS_SUCCESS;
708
709Failure:
710 RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
711 if (DeviceExtension->NextDeviceObject)
712 IoDetachDevice(DeviceExtension->NextDeviceObject);
713
714 /* Explicitly reclaim VGA resources on complete failure */
715 if (VgaResourcesReleased)
716 {
718 {
719 INFO_(VIDEOPRT, "Final reclaim attempt of VGA resources during failure cleanup\n");
723 {
724 WARN_(VIDEOPRT, "VGA reclaim failed during failure cleanup\n");
725 }
726 }
727 }
729 return Status;
730}
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
#define NO_ERROR
Definition: dderror.h:5
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
@ SystemBasicInformation
Definition: ntddk_ex.h:11
PVOID NTAPI IntVideoPortGetProcAddress(_In_ PVOID HwDeviceExtension, _In_ PUCHAR FunctionName)
Definition: funclist.c:106
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
#define KernelMode
Definition: asm.h:38
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
Definition: irq.c:142
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
Definition: mutex.c:189
SYSTEM_BASIC_INFORMATION SystemBasicInfo
Definition: perfdata.c:30
NTSTATUS NTAPI IoReportDetectedDevice(_In_ PDRIVER_OBJECT DriverObject, _In_ INTERFACE_TYPE LegacyBusType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _In_opt_ PCM_RESOURCE_LIST ResourceList, _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements, _In_ BOOLEAN ResourceAssigned, _Inout_ PDEVICE_OBJECT *DeviceObject)
Definition: pnpreport.c:148
@ PCIBus
Definition: restypes.h:126
@ Latched
Definition: miniport.h:81
@ LevelSensitive
Definition: miniport.h:80
VPAPI VP_STATUS NTAPI VideoPortVerifyAccessRanges(_In_ PVOID HwDeviceExtension, _In_opt_ ULONG NumAccessRanges, _In_reads_opt_(NumAccessRanges) PVIDEO_ACCESS_RANGE AccessRanges)
Claims or releases a range of hardware resources and checks for conflicts.
Definition: resource.c:976
LONG VP_STATUS
Definition: video.h:153
struct _VIDEO_PORT_CONFIG_INFO VIDEO_PORT_CONFIG_INFO
#define DPRINT
Definition: sndvol32.h:73
KINTERRUPT_MODE InterruptMode
Definition: video.h:172
INTERFACE_TYPE AdapterInterfaceType
Definition: video.h:169
PVIDEO_PORT_GET_PROC_ADDRESS VideoPortGetProcAddress
Definition: video.h:193
ULONG BusInterruptVector
Definition: video.h:171
ULONGLONG SystemMemorySize
Definition: video.h:195
PWSTR DriverRegistryPath
Definition: video.h:194
#define MAXULONG
Definition: typedefs.h:251
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
ULONG NumOfVgaRanges
Definition: videoprt.c:48
NTSTATUS NTAPI IntVideoPortCreateAdapterDeviceObject(_In_ PDRIVER_OBJECT DriverObject, _In_ PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, _In_ USHORT AdapterNumber, _In_ USHORT DisplayNumber, _Out_opt_ PDEVICE_OBJECT *DeviceObject)
Definition: videoprt.c:171
PVIDEO_PORT_DEVICE_EXTENSION VgaDeviceExtension
Definition: videoprt.c:46
KMUTEX VgaSyncLock
Definition: videoprt.c:45
static NTSTATUS IntVideoPortEnumBuses(_In_ INTERFACE_TYPE AdapterInterfaceType, _Inout_ PULONG BusNumber)
Enumerates all supported buses on the system.
Definition: videoprt.c:407
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:43
PVIDEO_ACCESS_RANGE VgaRanges
Definition: videoprt.c:47
LIST_ENTRY HwResetAdaptersList
BOOLEAN NTAPI IntVideoPortSetupInterrupt(IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PVIDEO_PORT_CONFIG_INFO ConfigInfo)
Definition: interrupt.c:45
VOID IntVideoPortReleaseResources(_In_ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: resource.c:198
BOOLEAN NTAPI IntVideoPortSetupTimer(IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension)
Definition: timer.c:43
#define KeWaitForMutexObject
Definition: kefuncs.h:543
@ Executive
Definition: ketypes.h:467

Referenced by IntVideoPortPnPStartDevice(), and VideoPortInitialize().

◆ IntVideoPortImageDirectoryEntryToData()

PVOID NTAPI IntVideoPortImageDirectoryEntryToData ( PVOID  BaseAddress,
ULONG  Directory 
)

Definition at line 135 of file videoprt.c.

138{
139 PIMAGE_NT_HEADERS NtHeader;
140 ULONG Va;
141
142 NtHeader = RtlImageNtHeader(BaseAddress);
143 if (NtHeader == NULL)
144 return NULL;
145
147 return NULL;
148
150 if (Va == 0)
151 return NULL;
152
153 return (PVOID)((ULONG_PTR)BaseAddress + Va);
154}
#define RtlImageNtHeader
Definition: compat.h:806
#define ULONG_PTR
Definition: config.h:101
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize _Pre_valid_ PVOID * BaseAddress
Definition: mmfuncs.h:408
_In_ BOOLEAN _In_ USHORT Directory
Definition: rtlfuncs.h:3962
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntddk_ex.h:178

◆ QueryRegistryCallback()

static NTSTATUS NTAPI QueryRegistryCallback ( IN PWSTR  ValueName,
IN ULONG  ValueType,
IN PVOID  ValueData,
IN ULONG  ValueLength,
IN PVOID  Context,
IN PVOID  EntryContext 
)
static

Definition at line 1199 of file videoprt.c.

1206{
1208
1209 INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n",
1211 return (*(CallbackContext->HwGetRegistryRoutine))(
1212 CallbackContext->HwDeviceExtension,
1213 CallbackContext->HwContext,
1214 ValueName,
1215 ValueData,
1216 ValueLength);
1217}
_In_ GUID _In_ PVOID ValueData
Definition: hubbusif.h:312
struct QueryRegistryCallbackContext * PQUERY_REGISTRY_CALLBACK_CONTEXT
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
Definition: wdfregistry.h:282
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
Definition: wdfregistry.h:275
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG _In_opt_ PEVENT_FILTER_DESCRIPTOR _Inout_opt_ PVOID CallbackContext
Definition: wmitypes.h:60

Referenced by VideoPortGetRegistryParameters().

◆ RTL_STATIC_LIST_HEAD()

RTL_STATIC_LIST_HEAD ( HwResetAdaptersList  )

◆ VideoPortAcquireDeviceLock()

VOID NTAPI VideoPortAcquireDeviceLock ( IN PVOID  HwDeviceExtension)

Definition at line 1878 of file videoprt.c.

1880{
1881 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1882
1883 TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n");
1884 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1886 // ASSERT(Status == STATUS_SUCCESS);
1887}
#define TRACE_(x)
Definition: compat.h:76
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:145

◆ VideoPortAllocateContiguousMemory()

PVOID NTAPI VideoPortAllocateContiguousMemory ( IN PVOID  HwDeviceExtension,
IN ULONG  NumberOfBytes,
IN PHYSICAL_ADDRESS  HighestAcceptableAddress 
)

Definition at line 1922 of file videoprt.c.

1927{
1929}
PVOID NTAPI MmAllocateContiguousMemory(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
Definition: contmem.c:626
_Out_ PNDIS_HANDLE _Out_ PUINT _In_ PNDIS_STRING _In_ NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
Definition: ndis.h:3230
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036

◆ VideoPortCheckForDeviceExistence()

BOOLEAN NTAPI VideoPortCheckForDeviceExistence ( IN PVOID  HwDeviceExtension,
IN USHORT  VendorId,
IN USHORT  DeviceId,
IN UCHAR  RevisionId,
IN USHORT  SubVendorId,
IN USHORT  SubSystemId,
IN ULONG  Flags 
)

Definition at line 1786 of file videoprt.c.

1794{
1795 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1798 IO_STACK_LOCATION IoStack;
1799 ULONG PciFlags = 0;
1801 BOOL DevicePresent;
1802
1803 TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n");
1804
1806 {
1807 WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS));
1808 return FALSE;
1809 }
1810
1811 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1812
1814 PciDevicePresentInterface.Version = 1;
1816 IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version;
1818 IoStack.Parameters.QueryInterface.InterfaceType =
1819 &GUID_PCI_DEVICE_PRESENT_INTERFACE;
1820 Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject,
1822 if (!NT_SUCCESS(Status))
1823 {
1824 WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status);
1825 return FALSE;
1826 }
1827
1828 if (Flags & CDE_USE_REVISION)
1829 PciFlags |= PCI_USE_REVISION;
1831 PciFlags |= PCI_USE_SUBSYSTEM_IDS;
1832
1833 DevicePresent = PciDevicePresentInterface.IsDevicePresent(
1834 VendorId, DeviceId, RevisionId,
1835 SubVendorId, SubSystemId, PciFlags);
1836
1837 PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context);
1838
1839 return DevicePresent;
1840}
unsigned int BOOL
Definition: ntddk_ex.h:94
PCI_INTERFACE PciDevicePresentInterface
Definition: devhere.c:18
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:100
NTSTATUS NTAPI IopInitiatePnpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, IN UCHAR MinorFunction, IN PIO_STACK_LOCATION Stack)
struct _INTERFACE * PINTERFACE
#define CDE_USE_REVISION
Definition: video.h:147
#define CDE_USE_SUBSYSTEM_IDS
Definition: video.h:146
struct _IO_STACK_LOCATION::@4478::@4504 QueryInterface
union _IO_STACK_LOCATION::@1708 Parameters
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define IRP_MN_QUERY_INTERFACE
struct _PCI_DEVICE_PRESENT_INTERFACE PCI_DEVICE_PRESENT_INTERFACE
#define PCI_USE_REVISION
Definition: iotypes.h:867
#define PCI_USE_SUBSYSTEM_IDS
Definition: iotypes.h:866

◆ VideoPortCreateSecondaryDisplay()

VP_STATUS NTAPI VideoPortCreateSecondaryDisplay ( IN PVOID  HwDeviceExtension,
IN OUT PVOID SecondaryDeviceExtension,
IN ULONG  Flag 
)

Definition at line 1665 of file videoprt.c.

1669{
1671 PVIDEO_PORT_DEVICE_EXTENSION FirstDeviceExtension, DeviceExtension;
1673
1674 ASSERT(SecondaryDeviceExtension);
1675
1676 if (Flag != 0)
1677 {
1679 }
1680
1681 FirstDeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1682
1683 if (FirstDeviceExtension->DisplayNumber != 0)
1684 {
1685 DPRINT1("Calling VideoPortCreateSecondaryDisplay for InstanceId %lu\n",
1686 FirstDeviceExtension->DisplayNumber);
1687 }
1688
1690 FirstDeviceExtension->DriverExtension,
1691 FirstDeviceExtension->PhysicalDeviceObject,
1692 FirstDeviceExtension->AdapterNumber,
1693 FirstDeviceExtension->NumberOfSecondaryDisplays + 1,
1694 &DeviceObject);
1695 if (!NT_SUCCESS(Status))
1696 {
1697 DPRINT1("IntVideoPortCreateAdapterDeviceObject() failed with status 0x%08x\n", Status);
1698 return ERROR_DEV_NOT_EXIST;
1699 }
1700
1701 DeviceExtension = DeviceObject->DeviceExtension;
1702
1703 /* Increment secondary display count */
1704 FirstDeviceExtension->NumberOfSecondaryDisplays++;
1705
1706 *SecondaryDeviceExtension = DeviceExtension->MiniPortDeviceExtension;
1707 return NO_ERROR;
1708}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
Definition: xml2sdb.h:97

◆ VideoPortDebugPrint()

VOID __cdecl VideoPortDebugPrint ( _In_ VIDEO_DEBUG_LEVEL  DebugPrintLevel,
_In_ PSTR  DebugMessage,
_In_ ...   
)

Definition at line 1145 of file videoprt.c.

1149{
1150 va_list ap;
1151
1152 if (VideoDebugLevel >= DebugPrintLevel)
1153 DebugPrintLevel = Error;
1154
1155 va_start(ap, DebugMessage);
1156 vDbgPrintEx(DPFLTR_VIDEO_ID, DebugPrintLevel, DebugMessage, ap);
1157 va_end(ap);
1158}
NTSYSAPI ULONG NTAPI vDbgPrintEx(_In_ ULONG ComponentId, _In_ ULONG Level, _In_z_ PCCH Format, _In_ va_list ap)
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
@ DPFLTR_VIDEO_ID
Definition: dpfilter.h:55
ULONG VideoDebugLevel
Definition: videoprt.c:34
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36

Referenced by IntLoadRegistryParameters(), VBEGetVideoChildDescriptor(), VBEInitialize(), VBEReadEdid(), VBEReadEdidUsingSCI(), VBESetCurrentMode(), and VGASetCurrentMode().

◆ VideoPortEnumerateChildren()

VP_STATUS NTAPI VideoPortEnumerateChildren ( IN PVOID  HwDeviceExtension,
IN PVOID  Reserved 
)

Definition at line 1642 of file videoprt.c.

1645{
1646 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1647
1648 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1649 ASSERT(DeviceExtension);
1650
1651 if (DeviceExtension->PhysicalDeviceObject)
1652 {
1653 /* Trigger reenumeration by the PnP manager */
1655 }
1656
1657 return NO_ERROR;
1658}
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:1772
@ BusRelations
Definition: iotypes.h:2154

Referenced by IntVideoPortDispatchOpen(), and VBEInitialize().

◆ VideoPortGetAssociatedDeviceExtension()

PVOID NTAPI VideoPortGetAssociatedDeviceExtension ( IN PVOID  DeviceObject)

Definition at line 1731 of file videoprt.c.

1733{
1734 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1735
1736 TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n");
1737 DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
1738 if (!DeviceExtension)
1739 return NULL;
1740 return DeviceExtension->MiniPortDeviceExtension;
1741}
struct _DEVICE_OBJECT * PDEVICE_OBJECT

◆ VideoPortGetCurrentIrql()

UCHAR NTAPI VideoPortGetCurrentIrql ( VOID  )

Definition at line 1184 of file videoprt.c.

1185{
1186 return KeGetCurrentIrql();
1187}
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706

◆ VideoPortGetRegistryParameters()

VP_STATUS NTAPI VideoPortGetRegistryParameters ( IN PVOID  HwDeviceExtension,
IN PWSTR  ParameterName,
IN UCHAR  IsParameterFileName,
IN PMINIPORT_GET_REGISTRY_ROUTINE  GetRegistryRoutine,
IN PVOID  HwContext 
)

Definition at line 1225 of file videoprt.c.

1231{
1234 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1236
1237 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1238
1239 TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1240 ParameterName, &DeviceExtension->RegistryPath);
1241
1242 Context.HwDeviceExtension = HwDeviceExtension;
1243 Context.HwContext = HwContext;
1244 Context.HwGetRegistryRoutine = GetRegistryRoutine;
1245
1249
1251 DeviceExtension->RegistryPath.Buffer,
1252 QueryTable,
1253 &Context,
1254 NULL);
1255 if (!NT_SUCCESS(Status))
1256 {
1257 WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the "
1258 "requested parameter\n");
1260 }
1261
1262 if (IsParameterFileName)
1263 {
1264 /* FIXME: need to read the contents of the file */
1266 }
1267
1268 return NO_ERROR;
1269}
_In_opt_ PWSTR _In_ PWSTR ParameterName
Definition: cdrom.h:961
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
Definition: rtlfuncs.h:4231
#define RTL_REGISTRY_ABSOLUTE
Definition: nt_native.h:161
#define RTL_QUERY_REGISTRY_REQUIRED
Definition: nt_native.h:132
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA _In_ PVOID HwContext
Definition: srb.h:907
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
Definition: nt_native.h:109
static NTSTATUS NTAPI QueryRegistryCallback(IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)
Definition: videoprt.c:1199
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)

◆ VideoPortGetRomImage()

PVOID NTAPI VideoPortGetRomImage ( IN PVOID  HwDeviceExtension,
IN PVOID  Unused1,
IN ULONG  Unused2,
IN ULONG  Length 
)

Definition at line 1335 of file videoprt.c.

1340{
1341 static PVOID RomImageBuffer = NULL;
1342 PKPROCESS CallingProcess;
1344
1345 TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n",
1346 HwDeviceExtension, Length);
1347
1348 /* If the length is zero then free the existing buffer */
1349 if (Length == 0)
1350 {
1351 if (RomImageBuffer != NULL)
1352 {
1353 ExFreePool(RomImageBuffer);
1354 RomImageBuffer = NULL;
1355 }
1356 return NULL;
1357 }
1358 else
1359 {
1360 /*
1361 * The DDK says we shouldn't use the legacy C0000 method but get the
1362 * ROM base address from the corresponding PCI or ACPI register but
1363 * lets ignore that and use C0000 anyway. We have already mapped the
1364 * BIOS area into memory so we'll copy from there.
1365 */
1366
1367 /* Copy the BIOS */
1368 Length = min(Length, 0x10000);
1369 if (RomImageBuffer != NULL)
1370 ExFreePool(RomImageBuffer);
1371
1372 RomImageBuffer = ExAllocatePool(PagedPool, Length);
1373 if (RomImageBuffer == NULL)
1374 return NULL;
1375
1376 /* Perform the copy in the CSRSS context */
1377 if (IntAttachToCSRSS(&CallingProcess, &ApcState))
1378 {
1379 RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length);
1380 IntDetachFromCSRSS(CallingProcess, &ApcState);
1381 }
1382 else
1383 {
1384 ExFreePool(RomImageBuffer);
1385 RomImageBuffer = NULL;
1386 }
1387 return RomImageBuffer;
1388 }
1389}
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
#define min(a, b)
Definition: monoChain.cc:55
VOID FASTCALL IntDetachFromCSRSS(_In_ PKPROCESS CallingProcess, _In_ PKAPC_STATE ApcState)
Detach the current thread from the CSRSS process. This routine is to be invoked after a previous succ...
Definition: videoprt.c:775
BOOLEAN FASTCALL IntAttachToCSRSS(_Outptr_ PKPROCESS *CallingProcess, _Out_ PKAPC_STATE ApcState)
Attach the current thread to the CSRSS process. The caller must detach from the process by invoking I...
Definition: videoprt.c:748
KAPC_STATE
Definition: ketypes.h:1727

◆ VideoPortGetVersion()

VP_STATUS NTAPI VideoPortGetVersion ( IN PVOID  HwDeviceExtension,
IN OUT PVPOSVERSIONINFO  VpOsVersionInfo 
)

Definition at line 1748 of file videoprt.c.

1751{
1753
1754 Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
1755 if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO))
1756 {
1757#if 1
1759 {
1760 VpOsVersionInfo->MajorVersion = Version.dwMajorVersion;
1761 VpOsVersionInfo->MinorVersion = Version.dwMinorVersion;
1762 VpOsVersionInfo->BuildNumber = Version.dwBuildNumber;
1763 VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor;
1764 VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor;
1765 return NO_ERROR;
1766 }
1768#else
1769 VpOsVersionInfo->MajorVersion = 5;
1770 VpOsVersionInfo->MinorVersion = 0;
1771 VpOsVersionInfo->BuildNumber = 2195;
1772 VpOsVersionInfo->ServicePackMajor = 4;
1773 VpOsVersionInfo->ServicePackMinor = 0;
1774 return NO_ERROR;
1775#endif
1776 }
1777
1779}
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:182
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
struct _OSVERSIONINFOEXW RTL_OSVERSIONINFOEXW

◆ VideoPortGetVgaStatus()

VP_STATUS NTAPI VideoPortGetVgaStatus ( IN PVOID  HwDeviceExtension,
OUT PULONG  VgaStatus 
)

Definition at line 1307 of file videoprt.c.

1310{
1311 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1312
1313 TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n");
1314
1315 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1317 {
1318 if (DeviceExtension->AdapterInterfaceType == PCIBus)
1319 {
1320 /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled */
1321 /* Assumed for now */
1322 *VgaStatus = 1;
1323 return NO_ERROR;
1324 }
1325 }
1326
1328}
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693

◆ VideoPortInitialize()

ULONG NTAPI VideoPortInitialize ( IN PVOID  Context1,
IN PVOID  Context2,
IN PVIDEO_HW_INITIALIZATION_DATA  HwInitializationData,
IN PVOID  HwContext 
)

Definition at line 945 of file videoprt.c.

950{
955 BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE;
956 static BOOLEAN FirstInitialization = FALSE;
957
958 TRACE_(VIDEOPRT, "VideoPortInitialize\n");
959
960 if (!FirstInitialization)
961 {
962 FirstInitialization = TRUE;
967
969 if (!NT_SUCCESS(Status))
970 {
971 ERR_(VIDEOPRT, "IntInitializeInt10(FirstInit) failed: 0x%lx\n", Status);
972 // return Status; // Let's continue and hope for the best...
973 }
974 }
975
976 /* As a first thing do parameter checks */
977 if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA))
978 {
979 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
981 }
982
983 if ((HwInitializationData->HwFindAdapter == NULL) ||
984 (HwInitializationData->HwInitialize == NULL) ||
985 (HwInitializationData->HwStartIO == NULL))
986 {
987 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
989 }
990
991 switch (HwInitializationData->HwInitDataSize)
992 {
993 /*
994 * NT4 drivers are special case, because we must use legacy method
995 * of detection instead of the Plug & Play one.
996 */
998 INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n");
999 break;
1000
1002 INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n");
1003 break;
1004
1005 case sizeof(VIDEO_HW_INITIALIZATION_DATA):
1006 INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n");
1007 break;
1008
1009 default:
1010 ERR_(VIDEOPRT, "Invalid HwInitializationData size %lu (expected %lu, %lu or %lu)\n",
1011 HwInitializationData->HwInitDataSize,
1015 return STATUS_UNSUCCESSFUL;
1016 }
1017
1018 /* Set dispatching routines */
1021 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
1023 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =
1025 DriverObject->DriverUnload = IntVideoPortUnload;
1026
1027 /* Determine type of the miniport driver */
1028 if ((HwInitializationData->HwInitDataSize >=
1029 FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) &&
1030 (HwInitializationData->HwSetPowerState != NULL) &&
1031 (HwInitializationData->HwGetPowerState != NULL) &&
1032 (HwInitializationData->HwGetVideoChildDescriptor != NULL))
1033 {
1034 INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n");
1035 PnpDriver = TRUE;
1036 }
1037
1038 /* Check if legacy detection should be applied */
1039 if (!PnpDriver || HwContext)
1040 {
1041 INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n",
1042 HwInitializationData->AdapterInterfaceType);
1043
1044 /* Enable legacy detection, will be invoked below */
1045 LegacyDetection = TRUE;
1046 }
1047
1048 /*
1049 * NOTE: The driver extension can be already allocated in case we were
1050 * called by legacy driver and failed detecting device. Some miniport
1051 * drivers in that case adjust parameters and call VideoPortInitialize
1052 * again.
1053 */
1055 if (DriverExtension == NULL)
1056 {
1061 if (!NT_SUCCESS(Status))
1062 {
1063 ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status);
1064 return Status;
1065 }
1066
1067 /*
1068 * Save the registry path. This should be done only once even if
1069 * VideoPortInitialize is called multiple times.
1070 */
1071 if (RegistryPath->Length != 0)
1072 {
1073 DriverExtension->RegistryPath.Length = 0;
1074 DriverExtension->RegistryPath.MaximumLength =
1075 RegistryPath->Length + sizeof(UNICODE_NULL);
1076 DriverExtension->RegistryPath.Buffer =
1078 PagedPool,
1079 DriverExtension->RegistryPath.MaximumLength,
1080 'RTSU');
1081 if (DriverExtension->RegistryPath.Buffer == NULL)
1082 {
1083 RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
1085 }
1086
1088
1089 /* There is a bug in Spice guest agent, which searches 'System' case-sensitively.
1090 * Replace 'SYSTEM' by 'System' to fix that.
1091 * Probably for similar reason, Windows also replaces 'MACHINE' by 'Machine'.
1092 */
1093 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\SYSTEM\\"), L"\\System\\", ARRAYSIZE(L"\\SYSTEM\\") - 1);
1094 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\MACHINE\\"), L"\\Machine\\", ARRAYSIZE(L"\\MACHINE\\") - 1);
1095
1096 INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath);
1097 }
1098 else
1099 {
1100 RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
1101 }
1102 }
1103
1104 /* Copy the correct miniport initialization data to the device extension */
1105 RtlCopyMemory(&DriverExtension->InitializationData,
1107 HwInitializationData->HwInitDataSize);
1108 if (HwInitializationData->HwInitDataSize < sizeof(VIDEO_HW_INITIALIZATION_DATA))
1109 {
1110 RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData +
1111 HwInitializationData->HwInitDataSize),
1113 HwInitializationData->HwInitDataSize);
1114 }
1115 DriverExtension->HwContext = HwContext;
1116
1117 /*
1118 * Plug & Play drivers register the device in the AddDevice routine.
1119 * For legacy drivers we must do it now.
1120 */
1121 if (LegacyDetection)
1122 {
1123 /* Power management */
1126
1128 if (!NT_SUCCESS(Status))
1129 ERR_(VIDEOPRT, "IntVideoPortFindAdapter(Legacy) returned 0x%x\n", Status);
1130 return Status;
1131 }
1132
1133 DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice;
1137 return STATUS_SUCCESS;
1138}
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
NTSTATUS IntInitializeInt10(VOID)
Definition: int10.c:766
KMUTEX VideoPortInt10Mutex
Definition: int10.c:41
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1916
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1838
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:419
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA * HwInitializationData
Definition: srb.h:906
struct _VIDEO_HW_INITIALIZATION_DATA VIDEO_HW_INITIALIZATION_DATA
#define SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA
Definition: video.h:119
#define SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA
Definition: video.h:120
wcsncpy
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT Context1
Definition: tdikrnl.h:1095
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT _In_ PTDI_PNP_CONTEXT Context2
Definition: tdikrnl.h:1096
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
VOID FASTCALL IntLoadRegistryParameters(VOID)
Definition: videoprt.c:786
NTSTATUS IntVideoPortFindAdapter(_In_ PDRIVER_OBJECT DriverObject, _In_ PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, _In_ _When_(LegacyDetection, _Null_) PDEVICE_OBJECT DeviceObject, _In_ BOOLEAN LegacyDetection)
Definition: videoprt.c:433
NTSTATUS NTAPI IntVideoPortDispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:434
VOID NTAPI IntVideoPortUnload(PDRIVER_OBJECT DriverObject)
Definition: dispatch.c:1288
NTSTATUS NTAPI IntVideoPortDispatchOpen(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:369
NTSTATUS NTAPI IntVideoPortDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:766
NTSTATUS NTAPI IntVideoPortDispatchSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1266
NTSTATUS NTAPI IntVideoPortDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1200
NTSTATUS NTAPI IntVideoPortAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
Definition: dispatch.c:334
NTSTATUS NTAPI IntVideoPortDispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1232
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MJ_SHUTDOWN
#define IRP_MJ_POWER

Referenced by DriverEntry().

◆ VideoPortIsNoVesa()

BOOLEAN NTAPI VideoPortIsNoVesa ( VOID  )

Definition at line 1936 of file videoprt.c.

1937{
1938 return VpNoVesa;
1939}

Referenced by InitializeModeTable(), VBEFindAdapter(), and VBEInitialize().

◆ VideoPortLogError()

VOID NTAPI VideoPortLogError ( IN PVOID  HwDeviceExtension,
IN PVIDEO_REQUEST_PACKET Vrp  OPTIONAL,
IN VP_STATUS  ErrorCode,
IN ULONG  UniqueId 
)

Definition at line 1165 of file videoprt.c.

1170{
1172
1173 INFO_(VIDEOPRT, "VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n",
1174 ErrorCode, ErrorCode, UniqueId, UniqueId);
1175 if (Vrp)
1176 INFO_(VIDEOPRT, "Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode);
1177}
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436

◆ VideoPortQueryPerformanceCounter()

LONGLONG NTAPI VideoPortQueryPerformanceCounter ( IN PVOID  HwDeviceExtension,
OUT PLONGLONG PerformanceFrequency  OPTIONAL 
)

Definition at line 1862 of file videoprt.c.

1865{
1867
1868 TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n");
1869 Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency);
1870 return Result.QuadPart;
1871}
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

◆ VideoPortQueueDpc()

BOOLEAN NTAPI VideoPortQueueDpc ( IN PVOID  HwDeviceExtension,
IN PMINIPORT_DPC_ROUTINE  CallbackRoutine,
IN PVOID  Context 
)

Definition at line 1715 of file videoprt.c.

1719{
1720 return KeInsertQueueDpc(
1721 &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject,
1723 (PVOID)Context);
1724}
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:725
_Must_inspect_result_ _In_ PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine
Definition: fltkernel.h:1035
@ DpcObject
Definition: ketypes.h:444

◆ VideoPortRegisterBugcheckCallback()

VP_STATUS NTAPI VideoPortRegisterBugcheckCallback ( IN PVOID  HwDeviceExtension,
IN ULONG  BugcheckCode,
IN PVIDEO_BUGCHECK_CALLBACK  Callback,
IN ULONG  BugcheckDataSize 
)

Definition at line 1847 of file videoprt.c.

1852{
1854 return NO_ERROR;
1855}

◆ VideoPortReleaseDeviceLock()

VOID NTAPI VideoPortReleaseDeviceLock ( IN PVOID  HwDeviceExtension)

Definition at line 1894 of file videoprt.c.

1896{
1897 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1898
1899 TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n");
1900 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1901 KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE);
1902 //ASSERT(Status == STATUS_SUCCESS);
1903}

◆ VideoPortScanRom()

BOOLEAN NTAPI VideoPortScanRom ( IN PVOID  HwDeviceExtension,
IN PUCHAR  RomBase,
IN ULONG  RomLength,
IN PUCHAR  String 
)

Definition at line 1396 of file videoprt.c.

1401{
1402 SIZE_T StringLength;
1403 BOOLEAN Found;
1404 PUCHAR SearchLocation;
1405
1406 TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String);
1407
1408 StringLength = strlen((PCHAR)String);
1409 Found = FALSE;
1410 for (SearchLocation = RomBase;
1411 !Found && SearchLocation < RomBase + RomLength - StringLength;
1412 SearchLocation++)
1413 {
1414 Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength);
1415 if (Found)
1416 {
1417 INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation);
1418 }
1419 }
1420
1421 return Found;
1422}
return Found
Definition: dirsup.c:1270
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
ULONG_PTR SIZE_T
Definition: typedefs.h:80
char * PCHAR
Definition: typedefs.h:51
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439

◆ VideoPortSetRegistryParameters()

VP_STATUS NTAPI VideoPortSetRegistryParameters ( IN PVOID  HwDeviceExtension,
IN PWSTR  ValueName,
IN PVOID  ValueData,
IN ULONG  ValueLength 
)

Definition at line 1276 of file videoprt.c.

1281{
1282 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1284
1285 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1286 TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1287 ValueName,
1288 &DeviceExtension->RegistryPath);
1291 DeviceExtension->RegistryPath.Buffer,
1292 ValueName,
1293 REG_BINARY,
1294 ValueData,
1295 ValueLength);
1296 if (Status != NO_ERROR)
1297 WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status);
1298
1299 return Status;
1300}
#define REG_BINARY
Definition: nt_native.h:1499
#define ASSERT_IRQL_LESS_OR_EQUAL(x)
Definition: debug.h:251

Referenced by BochsGetControllerInfo(), Pc98VidFindAdapter(), and VmxFindAdapter().

◆ VideoPortSynchronizeExecution()

BOOLEAN NTAPI VideoPortSynchronizeExecution ( IN PVOID  HwDeviceExtension,
IN VIDEO_SYNCHRONIZE_PRIORITY  Priority,
IN PMINIPORT_SYNCHRONIZE_ROUTINE  SynchronizeRoutine,
OUT PVOID  Context 
)

Definition at line 1429 of file videoprt.c.

1434{
1435 BOOLEAN Ret;
1436 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1437 KIRQL OldIrql;
1438
1439 switch (Priority)
1440 {
1441 case VpLowPriority:
1442 Ret = (*SynchronizeRoutine)(Context);
1443 break;
1444
1445 case VpMediumPriority:
1446 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1447 if (DeviceExtension->InterruptObject == NULL)
1448 Ret = (*SynchronizeRoutine)(Context);
1449 else
1451 DeviceExtension->InterruptObject,
1453 Context);
1454 break;
1455
1456 case VpHighPriority:
1458 if (OldIrql < SYNCH_LEVEL)
1460
1461 Ret = (*SynchronizeRoutine)(Context);
1462
1463 if (OldIrql < SYNCH_LEVEL)
1465 break;
1466
1467 default:
1468 Ret = FALSE;
1469 }
1470
1471 return Ret;
1472}
static KSYNCHRONIZE_ROUTINE SynchronizeRoutine
Definition: IoInterrupt.c:30
#define SYNCH_LEVEL
Definition: env_spec_w32.h:704
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
BOOLEAN NTAPI KeSynchronizeExecution(IN OUT PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext OPTIONAL)
Definition: interrupt.c:237
@ VpMediumPriority
Definition: video.h:536
@ VpLowPriority
Definition: video.h:535
@ VpHighPriority
Definition: video.h:537
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
Definition: wdfinterrupt.h:655
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

◆ VpNotifyEaData()

VOID NTAPI VpNotifyEaData ( IN PDEVICE_OBJECT  DeviceObject,
IN PVOID  Data 
)

Definition at line 1910 of file videoprt.c.

1913{
1915}

Variable Documentation

◆ CsrProcess

◆ HwResetAdaptersLock

KSPIN_LOCK HwResetAdaptersLock

◆ NumOfVgaRanges

ULONG NumOfVgaRanges = 0

Definition at line 48 of file videoprt.c.

Referenced by IntVideoPortFindAdapter(), and VideoPortVerifyAccessRanges().

◆ VgaDeviceExtension

PVIDEO_PORT_DEVICE_EXTENSION VgaDeviceExtension = NULL

Definition at line 46 of file videoprt.c.

Referenced by IntVideoPortFindAdapter(), VbeSetMode(), and VideoPortVerifyAccessRanges().

◆ VgaRanges

Definition at line 47 of file videoprt.c.

Referenced by IntVideoPortFindAdapter(), and VideoPortVerifyAccessRanges().

◆ VgaSyncLock

KMUTEX VgaSyncLock

◆ VideoDebugLevel

ULONG VideoDebugLevel = 0

Definition at line 34 of file videoprt.c.

Referenced by VideoPortDebugPrint().

◆ VideoPortMaxObjectNumber

ULONG VideoPortMaxObjectNumber = -1
static

◆ VideoPortUseNewKey

BOOLEAN VideoPortUseNewKey = FALSE

◆ VpBaseVideo

BOOLEAN VpBaseVideo = FALSE

Definition at line 36 of file videoprt.c.

Referenced by IntLoadRegistryParameters(), and VideoPortVerifyAccessRanges().

◆ VpNoVesa

BOOLEAN VpNoVesa = FALSE

Definition at line 37 of file videoprt.c.

Referenced by IntLoadRegistryParameters(), and VideoPortIsNoVesa().