ReactOS 0.4.16-dev-1878-g24e88af
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)
 
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 NTAPI IntVideoPortFindAdapter (IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
 
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 VideoPortDebugPrint (IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PCHAR DebugMessage,...)
 
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
 
KMUTEX VideoPortInt10Mutex
 
KSPIN_LOCK HwResetAdaptersLock
 

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 50 of file videoprt.c.

53{
54 return STATUS_SUCCESS;
55}
#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 589 of file videoprt.c.

592{
593 if (!CsrProcess)
594 return FALSE;
595
596 *CallingProcess = (PKPROCESS)PsGetCurrentProcess();
597 if (*CallingProcess != CsrProcess)
599 return TRUE;
600}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1768
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 IntInt10AllocateBuffer(), IntInt10CallBios(), IntInt10FreeBuffer(), IntInt10ReadMemory(), IntInt10WriteMemory(), and 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 616 of file videoprt.c.

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

Referenced by IntInt10AllocateBuffer(), IntInt10CallBios(), IntInt10FreeBuffer(), IntInt10ReadMemory(), IntInt10WriteMemory(), and VideoPortGetRomImage().

◆ IntLoadRegistryParameters()

VOID FASTCALL IntLoadRegistryParameters ( VOID  )

Definition at line 627 of file videoprt.c.

628{
631 UNICODE_STRING UseNewKeyPath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\UseNewKey");
632 UNICODE_STRING Path = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control");
633 UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions");
637
638 /* Check if we need to use new registry */
640 &UseNewKeyPath,
642 NULL,
643 NULL);
644 Status = ZwOpenKey(&KeyHandle,
647 if (NT_SUCCESS(Status))
648 {
651 }
652
653 /* Initialize object attributes with the path we want */
655 &Path,
657 NULL,
658 NULL);
659
660 /* Open the key */
661 Status = ZwOpenKey(&KeyHandle,
664 if (!NT_SUCCESS(Status))
665 {
666 VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status);
667 return;
668 }
669
670 /* Find out how large our buffer should be */
671 Status = ZwQueryValueKey(KeyHandle,
672 &ValueName,
674 NULL,
675 0,
676 &Length);
678 {
679 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
681 return;
682 }
683
684 /* Allocate it */
686 if (!KeyInfo)
687 {
688 VideoPortDebugPrint(Error, "Out of memory\n");
690 return;
691 }
692
693 /* Now for real this time */
694 Status = ZwQueryValueKey(KeyHandle,
695 &ValueName,
697 KeyInfo,
698 Length,
699 &NewLength);
701
702 if (!NT_SUCCESS(Status))
703 {
704 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
706 return;
707 }
708
709 /* Sanity check */
710 if (KeyInfo->Type != REG_SZ)
711 {
712 VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n");
714 return;
715 }
716
717 /* Check if BASEVIDEO or NOVESA is present in the start options */
718 if (wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO"))
720 if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA"))
721 VpNoVesa = TRUE;
722
724
725 /* FIXME: Old ReactOS-compatibility... */
727
728 if (VpNoVesa)
729 VideoPortDebugPrint(Info, "VESA mode disabled\n");
730 else
731 VideoPortDebugPrint(Info, "VESA mode enabled\n");
732
733 /* If we are in BASEVIDEO, create the volatile registry key for Win32k */
734 if (VpBaseVideo)
735 {
736 RtlInitUnicodeString(&Path, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\BaseVideo");
737
739 &Path,
741 NULL,
742 NULL);
743
744 Status = ZwCreateKey(&KeyHandle,
745 READ_CONTROL, // Non-0 placeholder: no use for this handle.
747 0,
748 NULL,
750 NULL);
751 if (NT_SUCCESS(Status))
753 else
754 ERR_(VIDEOPRT, "Failed to create the BaseVideo key (0x%x)\n", Status);
755 }
756
757 return;
758}
static USHORT USHORT * NewLength
PRTL_UNICODE_STRING_BUFFER Path
LONG NTSTATUS
Definition: precomp.h:26
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
#define GENERIC_READ
Definition: compat.h:135
#define L(x)
Definition: resources.c:13
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#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:106
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
#define KernelMode
Definition: asm.h:38
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 GENERIC_WRITE
Definition: nt_native.h:90
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1063
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
#define ERR_(ch,...)
Definition: debug.h:156
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
BOOLEAN VideoPortUseNewKey
Definition: videoprt.c:41
BOOLEAN VpNoVesa
Definition: videoprt.c:37
VOID VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PCHAR DebugMessage,...)
Definition: videoprt.c:981
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 59 of file videoprt.c.

61{
63 WCHAR DeviceBuffer[20];
65 WCHAR SymlinkBuffer[20];
66 UNICODE_STRING SymlinkName;
69
70 /* Create a unicode device name. */
71 DeviceNumber = DeviceExtension->DeviceNumber;
72 swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
73
75 RegistryPath = &DeviceExtension->NewRegistryPath;
76 else
77 RegistryPath = &DeviceExtension->RegistryPath;
78
79 /* Add entry to DEVICEMAP\VIDEO key in registry. */
81 L"VIDEO",
82 DeviceBuffer,
83 REG_SZ,
84 RegistryPath->Buffer,
85 RegistryPath->Length + sizeof(UNICODE_NULL));
86 if (!NT_SUCCESS(Status))
87 {
88 ERR_(VIDEOPRT, "Failed to create DEVICEMAP registry entry: 0x%X\n", Status);
89 return Status;
90 }
91
93 L"VIDEO",
94 L"MaxObjectNumber",
97 sizeof(DeviceNumber));
98 if (!NT_SUCCESS(Status))
99 {
100 ERR_(VIDEOPRT, "Failed to write MaxObjectNumber: 0x%X\n", Status);
101 return Status;
102 }
103
104 /* Create symbolic link "\??\DISPLAYx" */
105 swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
106 RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
107 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
108 Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
109 if (!NT_SUCCESS(Status))
110 {
111 ERR_(VIDEOPRT, "Failed to create symbolic link: 0x%X\n", Status);
112 return Status;
113 }
114
115 /* Update MaxObjectNumber */
117
118 return STATUS_SUCCESS;
119}
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1230
#define swprintf
Definition: precomp.h:40
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
#define RTL_REGISTRY_DEVICEMAP
Definition: nt_native.h:165
#define UNICODE_NULL
#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
__wchar_t WCHAR
Definition: xmlstorage.h:180

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 159 of file videoprt.c.

166{
167 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
169 ULONG PciSlotNumber;
171 ULONG Size;
173 WCHAR DeviceBuffer[20];
175 PDEVICE_OBJECT DeviceObject_;
176
177 if (DeviceObject == NULL)
178 DeviceObject = &DeviceObject_;
179
180 /*
181 * Find the first free device number that can be used for video device
182 * object names and symlinks.
183 */
185 if (DeviceNumber == (ULONG)-1)
186 {
187 WARN_(VIDEOPRT, "Can't find free device number\n");
188 return STATUS_UNSUCCESSFUL;
189 }
190
191 /*
192 * Create the device object.
193 */
194
195 /* Create a unicode device name. */
196 swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
197 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
198
199 INFO_(VIDEOPRT, "HwDeviceExtension size is: 0x%x\n",
200 DriverExtension->InitializationData.HwDeviceExtensionSize);
201
202 /* Create the device object. */
204 DriverExtension->InitializationData.HwDeviceExtensionSize;
206 Size,
207 &DeviceName,
209 0,
210 TRUE,
212
213 if (!NT_SUCCESS(Status))
214 {
215 WARN_(VIDEOPRT, "IoCreateDevice call failed with status 0x%08x\n", Status);
216 return Status;
217 }
218
219 /*
220 * Set the buffering strategy here. If you change this, remember
221 * to change VidDispatchDeviceControl too.
222 */
223
224 (*DeviceObject)->Flags |= DO_BUFFERED_IO;
225
226 /* Initialize device extension. */
227 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)((*DeviceObject)->DeviceExtension);
228 DeviceExtension->Common.Fdo = TRUE;
229 DeviceExtension->DeviceNumber = DeviceNumber;
230 DeviceExtension->DriverObject = DriverObject;
232 DeviceExtension->FunctionalDeviceObject = *DeviceObject;
233 DeviceExtension->DriverExtension = DriverExtension;
234 DeviceExtension->SessionId = -1;
235 DeviceExtension->AdapterNumber = AdapterNumber;
236 DeviceExtension->DisplayNumber = DisplayNumber;
237
238 InitializeListHead(&DeviceExtension->ChildDeviceList);
239
240 /* Get the registry path associated with this device. */
242 DeviceExtension->AdapterNumber,
243 &DeviceExtension->RegistryPath);
244 if (!NT_SUCCESS(Status))
245 {
246 WARN_(VIDEOPRT, "IntCreateRegistryPath() call failed with status 0x%08x\n", Status);
247 goto Failure;
248 }
249
251 {
252 /* Get bus number from the upper level bus driver. */
253 Size = sizeof(ULONG);
256 Size,
257 &DeviceExtension->SystemIoBusNumber,
258 &Size);
259 if (!NT_SUCCESS(Status))
260 {
261 WARN_(VIDEOPRT, "Couldn't get an information from bus driver. We will try to\n"
262 "use legacy detection method, but even that doesn't mean that\n"
263 "it will work.\n");
264 DeviceExtension->PhysicalDeviceObject = NULL;
265 }
266 }
267
268 DeviceExtension->AdapterInterfaceType =
269 DriverExtension->InitializationData.AdapterInterfaceType;
270
272 {
273 /* Get bus type from the upper level bus driver. */
274 Size = sizeof(ULONG);
277 Size,
278 &DeviceExtension->AdapterInterfaceType,
279 &Size);
280
281 /* Get bus device address from the upper level bus driver. */
282 Size = sizeof(ULONG);
285 Size,
286 &PciSlotNumber,
287 &Size);
288
289 /* Convert slotnumber to PCI_SLOT_NUMBER */
290 SlotNumber.u.AsULONG = 0;
291 SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF;
292 SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF;
293 DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG;
294 }
295
297 InitializeListHead(&DeviceExtension->DmaAdapterList);
298
299 KeInitializeDpc(&DeviceExtension->DpcObject,
301 DeviceExtension);
302
303 KeInitializeMutex(&DeviceExtension->DeviceLock, 0);
304
305 /* Attach the device. */
306 if ((PhysicalDeviceObject != NULL) && (DisplayNumber == 0))
310
311 Status = IntCreateNewRegistryPath(DeviceExtension);
312 if (!NT_SUCCESS(Status))
313 {
314 ERR_(VIDEOPRT, "IntCreateNewRegistryPath() failed with status 0x%08x\n", Status);
315 goto Failure;
316 }
317
318 IntSetupDeviceSettingsKey(DeviceExtension);
319
320 /* Remove the initializing flag */
321 (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
322
323 /* Set up the VIDEO/DEVICEMAP registry keys */
324 Status = IntVideoPortAddDeviceMapLink(DeviceExtension);
325 if (!NT_SUCCESS(Status))
326 {
327 ERR_(VIDEOPRT, "IntVideoPortAddDeviceMapLink() failed with status 0x%08x\n", Status);
328 goto Failure;
329 }
330
331 if (DisplayNumber == 0)
332 {
333 DriverExtension->InitializationData.StartingDeviceNumber++;
334 }
335
336 return STATUS_SUCCESS;
337
338Failure:
339 if (DeviceExtension->NextDeviceObject)
340 IoDetachDevice(DeviceExtension->NextDeviceObject);
343 return Status;
344}
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:966
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:1031
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1296
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
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
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 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:146
static NTSTATUS IntVideoPortAddDeviceMapLink(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: videoprt.c:59
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
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_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:601
NTSTATUS NTAPI IntCreateNewRegistryPath(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:407
NTSTATUS NTAPI IntSetupDeviceSettingsKey(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:297
@ DevicePropertyAddress
Definition: iotypes.h:1211
@ DevicePropertyBusNumber
Definition: iotypes.h:1209
@ DevicePropertyLegacyBusType
Definition: iotypes.h:1208

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

◆ IntVideoPortDeferredRoutine()

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

Definition at line 146 of file videoprt.c.

151{
152 PVOID HwDeviceExtension =
153 &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension;
155}
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:740
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:739
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:741

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 353 of file videoprt.c.

365{
367 UNREFERENCED_PARAMETER(PathName);
371 UNREFERENCED_PARAMETER(ControllerType);
372 UNREFERENCED_PARAMETER(ControllerNumber);
373 UNREFERENCED_PARAMETER(ControllerInformation);
374 UNREFERENCED_PARAMETER(PeripheralType);
375 UNREFERENCED_PARAMETER(PeripheralNumber);
376 UNREFERENCED_PARAMETER(PeripheralInformation);
377
378 /* The bus has been found */
379 return STATUS_SUCCESS;
380}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
Definition: wdfdevice.h:3921
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
Definition: halfuncs.h:160
_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 387 of file videoprt.c.

390{
391 // TODO: Forward-compatibility with Windows 7+:
392 // In case AdapterInterfaceType == PCIBus, check for the
393 // \Registry\HARDWARE\DESCRIPTION\System\VideoAdapterBusses
394 // key (created by pci.sys) that enumerates the PCI buses that
395 // are known to have video display adapters on them.
396 // This is a handy shortcut for videoprt, that would otherwise
397 // have to enumerate all the PCI buses (PCI_MAX_BRIDGE_NUMBER)
398 // to locate any video adapter.
399 // Otherwise, fall back to the usual method done below.
400
401 /* Find the next bus of the given type */
402 return IoQueryDeviceDescription(&AdapterInterfaceType,
403 BusNumber,
404 NULL,
405 NULL,
406 NULL,
407 NULL,
409 NULL);
410}
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:353

Referenced by IntVideoPortFindAdapter().

◆ IntVideoPortEnumerateChildren()

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

Definition at line 1314 of file videoprt.c.

1317{
1318 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1319 ULONG Status;
1320 VIDEO_CHILD_ENUM_INFO ChildEnumInfo;
1321 BOOLEAN bHaveLastMonitorID = FALSE;
1322 UCHAR LastMonitorID[10];
1323 ULONG Unused;
1324 UINT i;
1325 PDEVICE_OBJECT ChildDeviceObject;
1326 PVIDEO_PORT_CHILD_EXTENSION ChildExtension;
1327
1328 INFO_(VIDEOPRT, "Starting child device probe\n");
1329 DeviceExtension = DeviceObject->DeviceExtension;
1331 {
1332 WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n");
1333 return STATUS_SUCCESS;
1334 }
1335
1336 if (!IsListEmpty(&DeviceExtension->ChildDeviceList))
1337 {
1338 ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n");
1339 return STATUS_SUCCESS;
1340 }
1341
1342 /* Enumerate the children */
1343 for (i = 1; ; i++)
1344 {
1345 Status = IoCreateDevice(DeviceExtension->DriverObject,
1348 NULL,
1351 FALSE,
1352 &ChildDeviceObject);
1353 if (!NT_SUCCESS(Status))
1354 return Status;
1355
1356 ChildExtension = ChildDeviceObject->DeviceExtension;
1357
1358 RtlZeroMemory(ChildExtension,
1361
1362 ChildExtension->Common.Fdo = FALSE;
1363 ChildExtension->ChildId = i;
1364 ChildExtension->PhysicalDeviceObject = ChildDeviceObject;
1365 ChildExtension->DriverObject = DeviceExtension->DriverObject;
1366
1367 /* Setup the ChildEnumInfo */
1368 ChildEnumInfo.Size = sizeof(ChildEnumInfo);
1369 ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor);
1370 ChildEnumInfo.ACPIHwId = 0;
1371
1373 ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension);
1374 else
1375 ChildEnumInfo.ChildHwDeviceExtension = NULL;
1376
1377 ChildEnumInfo.ChildIndex = ChildExtension->ChildId;
1378
1379 INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex);
1381 DeviceExtension->MiniPortDeviceExtension,
1382 &ChildEnumInfo,
1383 &ChildExtension->ChildType,
1384 ChildExtension->ChildDescriptor,
1385 &ChildExtension->ChildId,
1386 &Unused);
1388 {
1389 if (ChildExtension->ChildType == Monitor)
1390 {
1391 // Check if the EDID is valid
1392 if (ChildExtension->ChildDescriptor[0] == 0x00 &&
1393 ChildExtension->ChildDescriptor[1] == 0xFF &&
1394 ChildExtension->ChildDescriptor[2] == 0xFF &&
1395 ChildExtension->ChildDescriptor[3] == 0xFF &&
1396 ChildExtension->ChildDescriptor[4] == 0xFF &&
1397 ChildExtension->ChildDescriptor[5] == 0xFF &&
1398 ChildExtension->ChildDescriptor[6] == 0xFF &&
1399 ChildExtension->ChildDescriptor[7] == 0x00)
1400 {
1401 if (bHaveLastMonitorID)
1402 {
1403 // Compare the previous monitor ID with the current one, break the loop if they are identical
1404 if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID))
1405 {
1406 INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n");
1407 IoDeleteDevice(ChildDeviceObject);
1408 break;
1409 }
1410 }
1411
1412 // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor
1413 RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID));
1414 bHaveLastMonitorID = TRUE;
1415
1416 /* Mark it valid */
1417 ChildExtension->EdidValid = TRUE;
1418 }
1419 else
1420 {
1421 /* Mark it invalid */
1422 ChildExtension->EdidValid = FALSE;
1423 }
1424 }
1425 }
1427 {
1428 WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex);
1429 IoDeleteDevice(ChildDeviceObject);
1430 continue;
1431 }
1433 {
1434 INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1);
1435 IoDeleteDevice(ChildDeviceObject);
1436 break;
1437 }
1438 else
1439 {
1440 WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status);
1441 IoDeleteDevice(ChildDeviceObject);
1442 break;
1443 }
1444
1445 if (ChildExtension->ChildType == Monitor)
1446 {
1447 UINT j;
1448 PUCHAR p = ChildExtension->ChildDescriptor;
1449 INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId);
1450 for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8)
1451 {
1452 INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
1453 p[j + 0], p[j + 1], p[j + 2], p[j + 3],
1454 p[j + 4], p[j + 5], p[j + 6], p[j + 7]);
1455 }
1456 }
1457 else if (ChildExtension->ChildType == Other)
1458 {
1459 INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor);
1460 }
1461 else
1462 {
1463 ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType);
1464 }
1465
1466 /* Clear the init flag */
1467 ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
1468
1469 InsertTailList(&DeviceExtension->ChildDeviceList,
1470 &ChildExtension->ListEntry);
1471 }
1472
1473 return STATUS_SUCCESS;
1474}
unsigned char BOOLEAN
#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
#define Unused(x)
Definition: atlwin.h:28
unsigned int UINT
Definition: ndis.h:50
#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:127
VIDEO_CHILD_TYPE ChildType
Definition: videoprt.h:121
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:126
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:118
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
VIDEO_HW_INITIALIZATION_DATA InitializationData
Definition: videoprt.h:72
uint16_t * PWSTR
Definition: typedefs.h:56
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
unsigned char * PUCHAR
Definition: typedefs.h:53
#define VIDEO_PORT_GET_CHILD_EXTENSION(MiniportExtension)
Definition: videoprt.h:134
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by IntVideoPortQueryBusRelations().

◆ IntVideoPortFindAdapter()

NTSTATUS NTAPI IntVideoPortFindAdapter ( IN PDRIVER_OBJECT  DriverObject,
IN PVIDEO_PORT_DRIVER_EXTENSION  DriverExtension,
IN PDEVICE_OBJECT  DeviceObject 
)

Definition at line 414 of file videoprt.c.

418{
419 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
421 VP_STATUS vpStatus;
422 VIDEO_PORT_CONFIG_INFO ConfigInfo;
424 UCHAR Again = FALSE;
425 BOOL LegacyDetection = FALSE;
426
427 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
428
429 /* Setup a ConfigInfo structure that we will pass to HwFindAdapter. */
430 RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO));
431 ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO);
432 ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType;
433 if (ConfigInfo.AdapterInterfaceType == PCIBus)
434 ConfigInfo.InterruptMode = LevelSensitive;
435 else
436 ConfigInfo.InterruptMode = Latched;
437 ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer;
439 ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
440 ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel;
441 ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector;
442
445 sizeof(SystemBasicInfo),
446 NULL);
447 if (NT_SUCCESS(Status))
448 {
451 }
452
453 // FIXME: Check the adapter key and update VideoDebugLevel variable.
454
455 /*
456 * Call miniport HwVidFindAdapter entry point to detect if
457 * particular device is present. There are two possible code
458 * paths. The first one is for Legacy drivers (NT4) and cases
459 * when we don't have information about what bus we're on. The
460 * second case is the standard one for Plug & Play drivers.
461 */
462 if (DeviceExtension->PhysicalDeviceObject == NULL)
463 {
464 LegacyDetection = TRUE;
465 }
466
467 if (LegacyDetection)
468 {
470
471 /* Suppose first we may not find any suitable device */
472 vpStatus = ERROR_DEV_NOT_EXIST; // ERROR_NO_MORE_DEVICES;
473
474 /* Enumerate all buses of the given type, call HwFindAdapter for each
475 * to find whether a video adapter is recognized there. Stop when an
476 * adapter has been found. */
477 for (BusNumber = 0;
478 (BusNumber < MAXULONG) &&
480 &BusNumber));
481 ++BusNumber)
482 {
483 DPRINT("Bus Type %lu, Number %lu\n",
484 DeviceExtension->AdapterInterfaceType, BusNumber);
485
486 DeviceExtension->SystemIoBusNumber =
487 ConfigInfo.SystemIoBusNumber = BusNumber;
488
489 RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension,
490 DriverExtension->InitializationData.HwDeviceExtensionSize);
491
492 /* FIXME: Need to figure out what string to pass as param 3. */
493 // FIXME: Handle the 'Again' parameter for legacy detection.
494 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
495 &DeviceExtension->MiniPortDeviceExtension,
496 DriverExtension->HwContext,
497 NULL,
498 &ConfigInfo,
499 &Again);
500
501 if (vpStatus == ERROR_DEV_NOT_EXIST)
502 {
503 continue;
504 }
505 else
506 {
507 break;
508 }
509 }
510 }
511 else
512 {
513 /* FIXME: Need to figure out what string to pass as param 3. */
514 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
515 &DeviceExtension->MiniPortDeviceExtension,
516 DriverExtension->HwContext,
517 NULL,
518 &ConfigInfo,
519 &Again);
520 }
521
522 if (vpStatus != NO_ERROR)
523 {
524 ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", vpStatus);
526 goto Failure;
527 }
528
529 /*
530 * Now we know the device is present, so let's do all additional tasks
531 * such as creating symlinks or setting up interrupts and timer.
532 */
533
534 /* FIXME: Allocate hardware resources for device. */
535
536 /* Allocate interrupt for device. */
538 {
540 goto Failure;
541 }
542
543 /* Allocate timer for device. */
545 {
546 if (DeviceExtension->InterruptObject != NULL)
547 IoDisconnectInterrupt(DeviceExtension->InterruptObject);
548 ERR_(VIDEOPRT, "IntVideoPortSetupTimer failed\n");
550 goto Failure;
551 }
552
553 /* If the device can be reset, insert it in the list of resettable adapters */
554 InitializeListHead(&DeviceExtension->HwResetListEntry);
555 if (DriverExtension->InitializationData.HwResetHw != NULL)
556 {
558 &DeviceExtension->HwResetListEntry,
560 }
561
562 INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
563 return STATUS_SUCCESS;
564
565Failure:
566 RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
567 if (DeviceExtension->NextDeviceObject)
568 IoDetachDevice(DeviceExtension->NextDeviceObject);
570 return Status;
571}
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
#define NO_ERROR
Definition: dderror.h:5
unsigned int BOOL
Definition: ntddk_ex.h:94
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
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
Definition: irq.c:142
SYSTEM_BASIC_INFORMATION SystemBasicInfo
Definition: perfdata.c:30
@ PCIBus
Definition: restypes.h:126
@ Latched
Definition: miniport.h:81
@ LevelSensitive
Definition: miniport.h:80
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
static NTSTATUS IntVideoPortEnumBuses(_In_ INTERFACE_TYPE AdapterInterfaceType, _Inout_ PULONG BusNumber)
Enumerates all supported buses on the system.
Definition: videoprt.c:387
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:43
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
BOOLEAN NTAPI IntVideoPortSetupTimer(IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension)
Definition: timer.c:43

Referenced by IntVideoPortPnPStartDevice(), and VideoPortInitialize().

◆ IntVideoPortImageDirectoryEntryToData()

PVOID NTAPI IntVideoPortImageDirectoryEntryToData ( PVOID  BaseAddress,
ULONG  Directory 
)

Definition at line 123 of file videoprt.c.

126{
127 PIMAGE_NT_HEADERS NtHeader;
128 ULONG Va;
129
130 NtHeader = RtlImageNtHeader(BaseAddress);
131 if (NtHeader == NULL)
132 return NULL;
133
135 return NULL;
136
138 if (Va == 0)
139 return NULL;
140
141 return (PVOID)((ULONG_PTR)BaseAddress + Va);
142}
#define RtlImageNtHeader
Definition: compat.h:806
#define ULONG_PTR
Definition: config.h:101
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
base for all directory entries
Definition: entries.h:138
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 1035 of file videoprt.c.

1042{
1044
1045 INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n",
1047 return (*(CallbackContext->HwGetRegistryRoutine))(
1048 CallbackContext->HwDeviceExtension,
1049 CallbackContext->HwContext,
1050 ValueName,
1051 ValueData,
1052 ValueLength);
1053}
_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 1714 of file videoprt.c.

1716{
1717 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1718
1719 TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n");
1720 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1722 // ASSERT(Status == STATUS_SUCCESS);
1723}
#define TRACE_(x)
Definition: compat.h:76
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define KeWaitForMutexObject
Definition: kefuncs.h:543
@ Executive
Definition: ketypes.h:467

◆ VideoPortAllocateContiguousMemory()

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

Definition at line 1758 of file videoprt.c.

1763{
1765}
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 1622 of file videoprt.c.

1630{
1631 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1634 IO_STACK_LOCATION IoStack;
1635 ULONG PciFlags = 0;
1637 BOOL DevicePresent;
1638
1639 TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n");
1640
1642 {
1643 WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS));
1644 return FALSE;
1645 }
1646
1647 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1648
1650 PciDevicePresentInterface.Version = 1;
1652 IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version;
1654 IoStack.Parameters.QueryInterface.InterfaceType =
1655 &GUID_PCI_DEVICE_PRESENT_INTERFACE;
1656 Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject,
1658 if (!NT_SUCCESS(Status))
1659 {
1660 WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status);
1661 return FALSE;
1662 }
1663
1664 if (Flags & CDE_USE_REVISION)
1665 PciFlags |= PCI_USE_REVISION;
1667 PciFlags |= PCI_USE_SUBSYSTEM_IDS;
1668
1669 DevicePresent = PciDevicePresentInterface.IsDevicePresent(
1670 VendorId, DeviceId, RevisionId,
1671 SubVendorId, SubSystemId, PciFlags);
1672
1673 PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context);
1674
1675 return DevicePresent;
1676}
PCI_INTERFACE PciDevicePresentInterface
Definition: devhere.c:18
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
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
union _IO_STACK_LOCATION::@1694 Parameters
struct _IO_STACK_LOCATION::@4270::@4296 QueryInterface
_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 1501 of file videoprt.c.

1505{
1507 PVIDEO_PORT_DEVICE_EXTENSION FirstDeviceExtension, DeviceExtension;
1509
1510 ASSERT(SecondaryDeviceExtension);
1511
1512 if (Flag != 0)
1513 {
1515 }
1516
1517 FirstDeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1518
1519 if (FirstDeviceExtension->DisplayNumber != 0)
1520 {
1521 DPRINT1("Calling VideoPortCreateSecondaryDisplay for InstanceId %lu\n",
1522 FirstDeviceExtension->DisplayNumber);
1523 }
1524
1526 FirstDeviceExtension->DriverExtension,
1527 FirstDeviceExtension->PhysicalDeviceObject,
1528 FirstDeviceExtension->AdapterNumber,
1529 FirstDeviceExtension->NumberOfSecondaryDisplays + 1,
1530 &DeviceObject);
1531 if (!NT_SUCCESS(Status))
1532 {
1533 DPRINT1("IntVideoPortCreateAdapterDeviceObject() failed with status 0x%08x\n", Status);
1534 return ERROR_DEV_NOT_EXIST;
1535 }
1536
1537 DeviceExtension = DeviceObject->DeviceExtension;
1538
1539 /* Increment secondary display count */
1540 FirstDeviceExtension->NumberOfSecondaryDisplays++;
1541
1542 *SecondaryDeviceExtension = DeviceExtension->MiniPortDeviceExtension;
1543 return NO_ERROR;
1544}
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
Definition: xml2sdb.h:80
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:159

◆ VideoPortDebugPrint()

VOID VideoPortDebugPrint ( IN VIDEO_DEBUG_LEVEL  DebugPrintLevel,
IN PCHAR  DebugMessage,
  ... 
)

Definition at line 981 of file videoprt.c.

985{
986 va_list ap;
987
988 if (VideoDebugLevel >= DebugPrintLevel)
989 DebugPrintLevel = Error;
990
991 va_start(ap, DebugMessage);
992 vDbgPrintEx(DPFLTR_IHVVIDEO_ID, DebugPrintLevel, DebugMessage, ap);
993 va_end(ap);
994}
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
NTSYSAPI ULONG NTAPI vDbgPrintEx(_In_ ULONG ComponentId, _In_ ULONG Level, _In_z_ PCCH Format, _In_ va_list ap)
@ DPFLTR_IHVVIDEO_ID
Definition: dpfilter.h:106
ULONG VideoDebugLevel
Definition: videoprt.c:34
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36

Referenced by IntLoadRegistryParameters().

◆ VideoPortEnumerateChildren()

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

Definition at line 1478 of file videoprt.c.

1481{
1482 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1483
1484 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1485 ASSERT(DeviceExtension);
1486
1487 if (DeviceExtension->PhysicalDeviceObject)
1488 {
1489 /* Trigger reenumeration by the PnP manager */
1491 }
1492
1493 return NO_ERROR;
1494}
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 1567 of file videoprt.c.

1569{
1570 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1571
1572 TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n");
1573 DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
1574 if (!DeviceExtension)
1575 return NULL;
1576 return DeviceExtension->MiniPortDeviceExtension;
1577}
struct _DEVICE_OBJECT * PDEVICE_OBJECT

◆ VideoPortGetCurrentIrql()

UCHAR NTAPI VideoPortGetCurrentIrql ( VOID  )

Definition at line 1020 of file videoprt.c.

1021{
1022 return KeGetCurrentIrql();
1023}
#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 1061 of file videoprt.c.

1067{
1070 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1072
1073 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1074
1075 TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1076 ParameterName, &DeviceExtension->RegistryPath);
1077
1078 Context.HwDeviceExtension = HwDeviceExtension;
1079 Context.HwContext = HwContext;
1080 Context.HwGetRegistryRoutine = GetRegistryRoutine;
1081
1085
1087 DeviceExtension->RegistryPath.Buffer,
1088 QueryTable,
1089 &Context,
1090 NULL);
1091 if (!NT_SUCCESS(Status))
1092 {
1093 WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the "
1094 "requested parameter\n");
1096 }
1097
1098 if (IsParameterFileName)
1099 {
1100 /* FIXME: need to read the contents of the file */
1102 }
1103
1104 return NO_ERROR;
1105}
_In_opt_ PWSTR _In_ PWSTR ParameterName
Definition: cdrom.h:961
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
Definition: rtlfuncs.h:4211
#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:1035

◆ VideoPortGetRomImage()

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

Definition at line 1171 of file videoprt.c.

1176{
1177 static PVOID RomImageBuffer = NULL;
1178 PKPROCESS CallingProcess;
1180
1181 TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n",
1182 HwDeviceExtension, Length);
1183
1184 /* If the length is zero then free the existing buffer */
1185 if (Length == 0)
1186 {
1187 if (RomImageBuffer != NULL)
1188 {
1189 ExFreePool(RomImageBuffer);
1190 RomImageBuffer = NULL;
1191 }
1192 return NULL;
1193 }
1194 else
1195 {
1196 /*
1197 * The DDK says we shouldn't use the legacy C0000 method but get the
1198 * ROM base address from the corresponding PCI or ACPI register but
1199 * lets ignore that and use C0000 anyway. We have already mapped the
1200 * BIOS area into memory so we'll copy from there.
1201 */
1202
1203 /* Copy the BIOS */
1204 Length = min(Length, 0x10000);
1205 if (RomImageBuffer != NULL)
1206 ExFreePool(RomImageBuffer);
1207
1208 RomImageBuffer = ExAllocatePool(PagedPool, Length);
1209 if (RomImageBuffer == NULL)
1210 return NULL;
1211
1212 /* Perform the copy in the CSRSS context */
1213 if (IntAttachToCSRSS(&CallingProcess, &ApcState))
1214 {
1215 RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length);
1216 IntDetachFromCSRSS(CallingProcess, &ApcState);
1217 }
1218 else
1219 {
1220 ExFreePool(RomImageBuffer);
1221 RomImageBuffer = NULL;
1222 }
1223 return RomImageBuffer;
1224 }
1225}
#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:616
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:589
KAPC_STATE
Definition: ketypes.h:1711

◆ VideoPortGetVersion()

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

Definition at line 1584 of file videoprt.c.

1587{
1589
1590 Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
1591 if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO))
1592 {
1593#if 1
1595 {
1596 VpOsVersionInfo->MajorVersion = Version.dwMajorVersion;
1597 VpOsVersionInfo->MinorVersion = Version.dwMinorVersion;
1598 VpOsVersionInfo->BuildNumber = Version.dwBuildNumber;
1599 VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor;
1600 VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor;
1601 return NO_ERROR;
1602 }
1604#else
1605 VpOsVersionInfo->MajorVersion = 5;
1606 VpOsVersionInfo->MinorVersion = 0;
1607 VpOsVersionInfo->BuildNumber = 2195;
1608 VpOsVersionInfo->ServicePackMajor = 4;
1609 VpOsVersionInfo->ServicePackMinor = 0;
1610 return NO_ERROR;
1611#endif
1612 }
1613
1615}
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 1143 of file videoprt.c.

1146{
1147 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1148
1149 TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n");
1150
1151 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1153 {
1154 if (DeviceExtension->AdapterInterfaceType == PCIBus)
1155 {
1156 /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */
1157 /* Assumed for now */
1158 *VgaStatus = 1;
1159 return NO_ERROR;
1160 }
1161 }
1162
1164}
#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 767 of file videoprt.c.

772{
777 BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE;
778 static BOOLEAN FirstInitialization;
779
780 TRACE_(VIDEOPRT, "VideoPortInitialize\n");
781
782 if (!FirstInitialization)
783 {
784 FirstInitialization = TRUE;
788 }
789
790 /* As a first thing do parameter checks. */
791 if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA))
792 {
793 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
795 }
796
797 if ((HwInitializationData->HwFindAdapter == NULL) ||
798 (HwInitializationData->HwInitialize == NULL) ||
799 (HwInitializationData->HwStartIO == NULL))
800 {
801 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
803 }
804
805 switch (HwInitializationData->HwInitDataSize)
806 {
807 /*
808 * NT4 drivers are special case, because we must use legacy method
809 * of detection instead of the Plug & Play one.
810 */
812 INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n");
813 break;
814
816 INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n");
817 break;
818
819 case sizeof(VIDEO_HW_INITIALIZATION_DATA):
820 INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n");
821 break;
822
823 default:
824 ERR_(VIDEOPRT, "Invalid HwInitializationData size %lu (expected %lu, %lu or %lu)\n",
825 HwInitializationData->HwInitDataSize,
829 return STATUS_UNSUCCESSFUL;
830 }
831
832 /* Set dispatching routines */
835 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
837 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =
839 DriverObject->DriverUnload = IntVideoPortUnload;
840
841 /* Determine type of the miniport driver */
842 if ((HwInitializationData->HwInitDataSize >=
843 FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) &&
844 (HwInitializationData->HwSetPowerState != NULL) &&
845 (HwInitializationData->HwGetPowerState != NULL) &&
846 (HwInitializationData->HwGetVideoChildDescriptor != NULL))
847 {
848 INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n");
849 PnpDriver = TRUE;
850 }
851
852 /* Check if legacy detection should be applied */
853 if (!PnpDriver || HwContext)
854 {
855 INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n",
856 HwInitializationData->AdapterInterfaceType);
857
858 /* FIXME: Move the code for legacy detection
859 to another function and call it here */
860 LegacyDetection = TRUE;
861 }
862
863 /*
864 * NOTE:
865 * The driver extension can be already allocated in case that we were
866 * called by legacy driver and failed detecting device. Some miniport
867 * drivers in that case adjust parameters and call VideoPortInitialize
868 * again.
869 */
871 if (DriverExtension == NULL)
872 {
877 if (!NT_SUCCESS(Status))
878 {
879 ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status);
880 return Status;
881 }
882
883 /*
884 * Save the registry path. This should be done only once even if
885 * VideoPortInitialize is called multiple times.
886 */
887 if (RegistryPath->Length != 0)
888 {
889 DriverExtension->RegistryPath.Length = 0;
890 DriverExtension->RegistryPath.MaximumLength =
891 RegistryPath->Length + sizeof(UNICODE_NULL);
892 DriverExtension->RegistryPath.Buffer =
894 PagedPool,
895 DriverExtension->RegistryPath.MaximumLength,
896 'RTSU');
897 if (DriverExtension->RegistryPath.Buffer == NULL)
898 {
901 }
902
904
905 /* There is a bug in Spice guest agent, which searches 'System' case-sensitively.
906 * Replace 'SYSTEM' by 'System' to fix that.
907 * Probably for similar reason, Windows also replaces 'MACHINE' by 'Machine'.
908 */
909 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\SYSTEM\\"), L"\\System\\", ARRAYSIZE(L"\\SYSTEM\\") - 1);
910 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\MACHINE\\"), L"\\Machine\\", ARRAYSIZE(L"\\MACHINE\\") - 1);
911
912 INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath);
913 }
914 else
915 {
917 }
918 }
919
920 /* Copy the correct miniport initialization data to the device extension. */
921 RtlCopyMemory(&DriverExtension->InitializationData,
923 HwInitializationData->HwInitDataSize);
924 if (HwInitializationData->HwInitDataSize <
926 {
927 RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData +
928 HwInitializationData->HwInitDataSize),
930 HwInitializationData->HwInitDataSize);
931 }
932 DriverExtension->HwContext = HwContext;
933
934 /*
935 * Plug & Play drivers registers the device in AddDevice routine.
936 * For legacy drivers we must do it now.
937 */
938 if (LegacyDetection)
939 {
941
943 {
944 /* Power management */
946 }
947
950 NULL,
951 DriverExtension->InitializationData.StartingDeviceNumber,
952 0,
953 &DeviceObject);
954 if (!NT_SUCCESS(Status))
955 {
956 ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status);
957 return Status;
958 }
959
961 if (!NT_SUCCESS(Status))
962 ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status);
963
964 return Status;
965 }
966 else
967 {
968 DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice;
972
973 return STATUS_SUCCESS;
974 }
975}
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
wcsncpy
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
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
_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:627
NTSTATUS NTAPI IntVideoPortFindAdapter(IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
Definition: videoprt.c:414
KMUTEX VideoPortInt10Mutex
Definition: videoprt.c:42
NTSTATUS NTAPI IntVideoPortDispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:434
VOID NTAPI IntVideoPortUnload(PDRIVER_OBJECT DriverObject)
Definition: dispatch.c:1242
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:1220
NTSTATUS NTAPI IntVideoPortDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1154
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:1186
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MJ_SHUTDOWN
#define IRP_MJ_POWER

Referenced by DriverEntry().

◆ VideoPortIsNoVesa()

BOOLEAN NTAPI VideoPortIsNoVesa ( VOID  )

Definition at line 1772 of file videoprt.c.

1773{
1774 return VpNoVesa;
1775}

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 1001 of file videoprt.c.

1006{
1008
1009 INFO_(VIDEOPRT, "VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n",
1010 ErrorCode, ErrorCode, UniqueId, UniqueId);
1011 if (Vrp)
1012 INFO_(VIDEOPRT, "Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode);
1013}
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436

◆ VideoPortQueryPerformanceCounter()

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

Definition at line 1698 of file videoprt.c.

1701{
1703
1704 TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n");
1705 Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency);
1706 return Result.QuadPart;
1707}
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 1551 of file videoprt.c.

1555{
1556 return KeInsertQueueDpc(
1557 &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject,
1559 (PVOID)Context);
1560}
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:425

◆ VideoPortRegisterBugcheckCallback()

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

Definition at line 1683 of file videoprt.c.

1688{
1690 return NO_ERROR;
1691}

◆ VideoPortReleaseDeviceLock()

VOID NTAPI VideoPortReleaseDeviceLock ( IN PVOID  HwDeviceExtension)

Definition at line 1730 of file videoprt.c.

1732{
1733 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1734
1735 TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n");
1736 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1737 KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE);
1738 //ASSERT(Status == STATUS_SUCCESS);
1739}
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
Definition: mutex.c:189

◆ VideoPortScanRom()

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

Definition at line 1232 of file videoprt.c.

1237{
1238 SIZE_T StringLength;
1239 BOOLEAN Found;
1240 PUCHAR SearchLocation;
1241
1242 TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String);
1243
1244 StringLength = strlen((PCHAR)String);
1245 Found = FALSE;
1246 for (SearchLocation = RomBase;
1247 !Found && SearchLocation < RomBase + RomLength - StringLength;
1248 SearchLocation++)
1249 {
1250 Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength);
1251 if (Found)
1252 {
1253 INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation);
1254 }
1255 }
1256
1257 return Found;
1258}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
return Found
Definition: dirsup.c:1270
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 1112 of file videoprt.c.

1117{
1118 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1120
1121 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1122 TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1123 ValueName,
1124 &DeviceExtension->RegistryPath);
1127 DeviceExtension->RegistryPath.Buffer,
1128 ValueName,
1129 REG_BINARY,
1130 ValueData,
1131 ValueLength);
1132 if (Status != NO_ERROR)
1133 WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status);
1134
1135 return Status;
1136}
#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 1265 of file videoprt.c.

1270{
1271 BOOLEAN Ret;
1272 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1273 KIRQL OldIrql;
1274
1275 switch (Priority)
1276 {
1277 case VpLowPriority:
1278 Ret = (*SynchronizeRoutine)(Context);
1279 break;
1280
1281 case VpMediumPriority:
1282 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1283 if (DeviceExtension->InterruptObject == NULL)
1284 Ret = (*SynchronizeRoutine)(Context);
1285 else
1287 DeviceExtension->InterruptObject,
1289 Context);
1290 break;
1291
1292 case VpHighPriority:
1294 if (OldIrql < SYNCH_LEVEL)
1296
1297 Ret = (*SynchronizeRoutine)(Context);
1298
1299 if (OldIrql < SYNCH_LEVEL)
1301 break;
1302
1303 default:
1304 Ret = FALSE;
1305 }
1306
1307 return Ret;
1308}
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 1746 of file videoprt.c.

1749{
1751}

Variable Documentation

◆ CsrProcess

◆ HwResetAdaptersLock

KSPIN_LOCK HwResetAdaptersLock

◆ VideoDebugLevel

ULONG VideoDebugLevel = 0

Definition at line 34 of file videoprt.c.

Referenced by VideoPortDebugPrint().

◆ VideoPortInt10Mutex

KMUTEX VideoPortInt10Mutex

Definition at line 42 of file videoprt.c.

Referenced by IntInt10CallBios(), and VideoPortInitialize().

◆ 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().