ReactOS  0.4.15-dev-4863-gba0d16f
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)
 
NTSTATUS NTAPI IntVideoPortFindAdapter (IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
 
VOID FASTCALL IntAttachToCSRSS (PKPROCESS *CallingProcess, PKAPC_STATE ApcState)
 
VOID FASTCALL IntDetachFromCSRSS (PKPROCESS *CallingProcess, PKAPC_STATE ApcState)
 
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()

VOID FASTCALL IntAttachToCSRSS ( PKPROCESS CallingProcess,
PKAPC_STATE  ApcState 
)

Definition at line 497 of file videoprt.c.

500 {
501  *CallingProcess = (PKPROCESS)PsGetCurrentProcess();
502  if (*CallingProcess != CsrProcess)
503  {
505  }
506 }
PKPROCESS CsrProcess
Definition: videoprt.c:39
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
Definition: procobj.c:704
#define PsGetCurrentProcess
Definition: psfuncs.h:17
struct _KPROCESS * PKPROCESS
Definition: wdm.template.h:201
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1700

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

◆ IntDetachFromCSRSS()

VOID FASTCALL IntDetachFromCSRSS ( PKPROCESS CallingProcess,
PKAPC_STATE  ApcState 
)

Definition at line 510 of file videoprt.c.

513 {
514  if (*CallingProcess != CsrProcess)
515  {
517  }
518 }
PKPROCESS CsrProcess
Definition: videoprt.c:39
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
Definition: procobj.c:756
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1700

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

◆ IntLoadRegistryParameters()

VOID FASTCALL IntLoadRegistryParameters ( VOID  )

Definition at line 522 of file videoprt.c.

523 {
526  UNICODE_STRING UseNewKeyPath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\UseNewKey");
527  UNICODE_STRING Path = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control");
528  UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions");
532 
533  /* Check if we need to use new registry */
535  &UseNewKeyPath,
537  NULL,
538  NULL);
539  Status = ZwOpenKey(&KeyHandle,
542  if (NT_SUCCESS(Status))
543  {
546  }
547 
548  /* Initialize object attributes with the path we want */
550  &Path,
552  NULL,
553  NULL);
554 
555  /* Open the key */
556  Status = ZwOpenKey(&KeyHandle,
559  if (!NT_SUCCESS(Status))
560  {
561  VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status);
562  return;
563  }
564 
565  /* Find out how large our buffer should be */
566  Status = ZwQueryValueKey(KeyHandle,
567  &ValueName,
569  NULL,
570  0,
571  &Length);
573  {
574  VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
576  return;
577  }
578 
579  /* Allocate it */
581  if (!KeyInfo)
582  {
583  VideoPortDebugPrint(Error, "Out of memory\n");
585  return;
586  }
587 
588  /* Now for real this time */
589  Status = ZwQueryValueKey(KeyHandle,
590  &ValueName,
592  KeyInfo,
593  Length,
594  &NewLength);
596 
597  if (!NT_SUCCESS(Status))
598  {
599  VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
601  return;
602  }
603 
604  /* Sanity check */
605  if (KeyInfo->Type != REG_SZ)
606  {
607  VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n");
609  return;
610  }
611 
612  /* Check if BASEVIDEO or NOVESA is present in the start options */
613  if (wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO"))
614  VpBaseVideo = TRUE;
615  if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA"))
616  VpNoVesa = TRUE;
617 
619 
620  /* FIXME: Old ReactOS-compatibility... */
621  if (VpBaseVideo) VpNoVesa = TRUE;
622 
623  if (VpNoVesa)
624  VideoPortDebugPrint(Info, "VESA mode disabled\n");
625  else
626  VideoPortDebugPrint(Info, "VESA mode enabled\n");
627 
628  /* If we are in BASEVIDEO, create the volatile registry key for Win32k */
629  if (VpBaseVideo)
630  {
631  RtlInitUnicodeString(&Path, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\BaseVideo");
632 
634  &Path,
636  NULL,
637  NULL);
638 
639  Status = ZwCreateKey(&KeyHandle,
640  READ_CONTROL, // Non-0 placeholder: no use for this handle.
642  0,
643  NULL,
645  NULL);
646  if (NT_SUCCESS(Status))
648  else
649  ERR_(VIDEOPRT, "Failed to create the BaseVideo key (0x%x)\n", Status);
650  }
651 
652  return;
653 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
#define TAG_VIDEO_PORT
Definition: videoprt.h:38
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
BOOLEAN VpBaseVideo
Definition: videoprt.c:36
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4711
#define TRUE
Definition: types.h:120
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
uint16_t * PWCHAR
Definition: typedefs.h:56
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
static USHORT USHORT * NewLength
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
#define L(x)
Definition: ntvdm.h:50
#define GENERIC_WRITE
Definition: nt_native.h:90
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
BOOL Error
Definition: chkdsk.c:66
#define READ_CONTROL
Definition: nt_native.h:58
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:240
BOOLEAN VpNoVesa
Definition: videoprt.c:37
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
BOOLEAN VideoPortUseNewKey
Definition: videoprt.c:41
#define GENERIC_READ
Definition: compat.h:135
VOID VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PCHAR DebugMessage,...)
Definition: videoprt.c:872
PRTL_UNICODE_STRING_BUFFER Path
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define REG_SZ
Definition: layer.c:22

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",
95  REG_DWORD,
96  &DeviceNumber,
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 }
UNICODE_STRING NewRegistryPath
Definition: videoprt.h:91
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:213
#define L(x)
Definition: ntvdm.h:50
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3272
#define UNICODE_NULL
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
static ULONG VideoPortMaxObjectNumber
Definition: videoprt.c:40
Status
Definition: gdiplustypes.h:24
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
BOOLEAN VideoPortUseNewKey
Definition: videoprt.c:41
int _cdecl swprintf(const WCHAR *,...)
unsigned int ULONG
Definition: retypes.h:1
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1229
#define RTL_REGISTRY_DEVICEMAP
Definition: nt_native.h:165
#define REG_DWORD
Definition: sdbapi.c:596
#define REG_SZ
Definition: layer.c:22

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,
211  DeviceObject);
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;
231  DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
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);
248  *DeviceObject = NULL;
249  return Status;
250  }
251 
252  if (PhysicalDeviceObject != NULL)
253  {
254  /* Get bus number from the upper level bus driver. */
255  Size = sizeof(ULONG);
258  Size,
259  &DeviceExtension->SystemIoBusNumber,
260  &Size);
261  if (!NT_SUCCESS(Status))
262  {
263  WARN_(VIDEOPRT, "Couldn't get an information from bus driver. We will try to\n"
264  "use legacy detection method, but even that doesn't mean that\n"
265  "it will work.\n");
266  DeviceExtension->PhysicalDeviceObject = NULL;
267  }
268  }
269 
270  DeviceExtension->AdapterInterfaceType =
271  DriverExtension->InitializationData.AdapterInterfaceType;
272 
273  if (PhysicalDeviceObject != NULL)
274  {
275  /* Get bus type from the upper level bus driver. */
276  Size = sizeof(ULONG);
279  Size,
280  &DeviceExtension->AdapterInterfaceType,
281  &Size);
282 
283  /* Get bus device address from the upper level bus driver. */
284  Size = sizeof(ULONG);
287  Size,
288  &PciSlotNumber,
289  &Size);
290 
291  /* Convert slotnumber to PCI_SLOT_NUMBER */
292  SlotNumber.u.AsULONG = 0;
293  SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF;
294  SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF;
295  DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG;
296  }
297 
298  InitializeListHead(&DeviceExtension->AddressMappingListHead);
299  InitializeListHead(&DeviceExtension->DmaAdapterList);
300 
301  KeInitializeDpc(&DeviceExtension->DpcObject,
303  DeviceExtension);
304 
305  KeInitializeMutex(&DeviceExtension->DeviceLock, 0);
306 
307  /* Attach the device. */
308  if ((PhysicalDeviceObject != NULL) && (DisplayNumber == 0))
310  *DeviceObject,
312 
313  Status = IntCreateNewRegistryPath(DeviceExtension);
314  if (!NT_SUCCESS(Status))
315  {
316  ERR_(VIDEOPRT, "IntCreateNewRegistryPath() failed with status 0x%08x\n", Status);
318  *DeviceObject = NULL;
319  return Status;
320  }
321 
322  IntSetupDeviceSettingsKey(DeviceExtension);
323 
324  /* Remove the initailizing flag */
325  (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
326 
327  /* Set up the VIDEO/DEVICEMAP registry keys */
328  Status = IntVideoPortAddDeviceMapLink(DeviceExtension);
329  if (!NT_SUCCESS(Status))
330  {
331  ERR_(VIDEOPRT, "IntVideoPortAddDeviceMapLink() failed with status 0x%08x\n", Status);
333  *DeviceObject = NULL;
334  return Status;
335  }
336 
337  if (DisplayNumber == 0)
338  {
339  DriverExtension->InitializationData.StartingDeviceNumber++;
340  }
341 
342  return STATUS_SUCCESS;
343 }
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:65
PDEVICE_OBJECT FunctionalDeviceObject
Definition: videoprt.h:88
NTSTATUS NTAPI IntCreateNewRegistryPath(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:407
VOID NTAPI IntVideoPortDeferredRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: videoprt.c:146
#define INFO_(ch,...)
Definition: debug.h:159
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
NTSTATUS NTAPI IntCreateRegistryPath(IN PCUNICODE_STRING DriverRegistryPath, IN ULONG DeviceNumber, OUT PUNICODE_STRING DeviceRegistryPath)
Definition: registry.c:601
#define TRUE
Definition: types.h:120
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
LIST_ENTRY AddressMappingListHead
Definition: videoprt.h:101
NTSTATUS NTAPI IntSetupDeviceSettingsKey(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:297
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1149
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define L(x)
Definition: ntvdm.h:50
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3272
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:966
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:1952
static ULONG VideoPortMaxObjectNumber
Definition: videoprt.c:40
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
Status
Definition: gdiplustypes.h:24
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define FILE_DEVICE_VIDEO
Definition: winioctl.h:141
#define DO_BUFFERED_IO
Definition: env_spec_w32.h:394
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
Definition: mutex.c:67
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
int _cdecl swprintf(const WCHAR *,...)
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:86
struct _VIDEO_PORT_DEVICE_EXTENSTION VIDEO_PORT_DEVICE_EXTENSION
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
static NTSTATUS IntVideoPortAddDeviceMapLink(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: videoprt.c:59
#define NULL
Definition: types.h:112
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:84
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
unsigned int ULONG
Definition: retypes.h:1
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
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1229
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
INTERFACE_TYPE AdapterInterfaceType
Definition: videoprt.h:98
#define WARN_(ch,...)
Definition: debug.h:157

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 }
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:675
VOID(NTAPI * PMINIPORT_DPC_ROUTINE)(IN PVOID HwDeviceExtension, IN PVOID Context)
Definition: video.h:518
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:675
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:675

Referenced by IntVideoPortCreateAdapterDeviceObject().

◆ IntVideoPortEnumerateChildren()

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

Definition at line 1202 of file videoprt.c.

1205 {
1206  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1207  ULONG Status;
1208  VIDEO_CHILD_ENUM_INFO ChildEnumInfo;
1209  BOOLEAN bHaveLastMonitorID = FALSE;
1210  UCHAR LastMonitorID[10];
1211  ULONG Unused;
1212  UINT i;
1213  PDEVICE_OBJECT ChildDeviceObject;
1214  PVIDEO_PORT_CHILD_EXTENSION ChildExtension;
1215 
1216  INFO_(VIDEOPRT, "Starting child device probe\n");
1217  DeviceExtension = DeviceObject->DeviceExtension;
1219  {
1220  WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n");
1221  return STATUS_SUCCESS;
1222  }
1223 
1224  if (!IsListEmpty(&DeviceExtension->ChildDeviceList))
1225  {
1226  ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n");
1227  return STATUS_SUCCESS;
1228  }
1229 
1230  /* Enumerate the children */
1231  for (i = 1; ; i++)
1232  {
1233  Status = IoCreateDevice(DeviceExtension->DriverObject,
1234  sizeof(VIDEO_PORT_CHILD_EXTENSION) +
1236  NULL,
1239  FALSE,
1240  &ChildDeviceObject);
1241  if (!NT_SUCCESS(Status))
1242  return Status;
1243 
1244  ChildExtension = ChildDeviceObject->DeviceExtension;
1245 
1246  RtlZeroMemory(ChildExtension,
1247  sizeof(VIDEO_PORT_CHILD_EXTENSION) +
1249 
1250  ChildExtension->Common.Fdo = FALSE;
1251  ChildExtension->ChildId = i;
1252  ChildExtension->PhysicalDeviceObject = ChildDeviceObject;
1253  ChildExtension->DriverObject = DeviceExtension->DriverObject;
1254 
1255  /* Setup the ChildEnumInfo */
1256  ChildEnumInfo.Size = sizeof(ChildEnumInfo);
1257  ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor);
1258  ChildEnumInfo.ACPIHwId = 0;
1259 
1261  ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension);
1262  else
1263  ChildEnumInfo.ChildHwDeviceExtension = NULL;
1264 
1265  ChildEnumInfo.ChildIndex = ChildExtension->ChildId;
1266 
1267  INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex);
1269  DeviceExtension->MiniPortDeviceExtension,
1270  &ChildEnumInfo,
1271  &ChildExtension->ChildType,
1272  ChildExtension->ChildDescriptor,
1273  &ChildExtension->ChildId,
1274  &Unused);
1276  {
1277  if (ChildExtension->ChildType == Monitor)
1278  {
1279  // Check if the EDID is valid
1280  if (ChildExtension->ChildDescriptor[0] == 0x00 &&
1281  ChildExtension->ChildDescriptor[1] == 0xFF &&
1282  ChildExtension->ChildDescriptor[2] == 0xFF &&
1283  ChildExtension->ChildDescriptor[3] == 0xFF &&
1284  ChildExtension->ChildDescriptor[4] == 0xFF &&
1285  ChildExtension->ChildDescriptor[5] == 0xFF &&
1286  ChildExtension->ChildDescriptor[6] == 0xFF &&
1287  ChildExtension->ChildDescriptor[7] == 0x00)
1288  {
1289  if (bHaveLastMonitorID)
1290  {
1291  // Compare the previous monitor ID with the current one, break the loop if they are identical
1292  if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID))
1293  {
1294  INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n");
1295  IoDeleteDevice(ChildDeviceObject);
1296  break;
1297  }
1298  }
1299 
1300  // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor
1301  RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID));
1302  bHaveLastMonitorID = TRUE;
1303 
1304  /* Mark it valid */
1305  ChildExtension->EdidValid = TRUE;
1306  }
1307  else
1308  {
1309  /* Mark it invalid */
1310  ChildExtension->EdidValid = FALSE;
1311  }
1312  }
1313  }
1314  else if (Status == VIDEO_ENUM_INVALID_DEVICE)
1315  {
1316  WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex);
1317  IoDeleteDevice(ChildDeviceObject);
1318  continue;
1319  }
1320  else if (Status == VIDEO_ENUM_NO_MORE_DEVICES)
1321  {
1322  INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1);
1323  IoDeleteDevice(ChildDeviceObject);
1324  break;
1325  }
1326  else
1327  {
1328  WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status);
1329  IoDeleteDevice(ChildDeviceObject);
1330  break;
1331  }
1332 
1333  if (ChildExtension->ChildType == Monitor)
1334  {
1335  UINT j;
1336  PUCHAR p = ChildExtension->ChildDescriptor;
1337  INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId);
1338  for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8)
1339  {
1340  INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
1341  p[j + 0], p[j + 1], p[j + 2], p[j + 3],
1342  p[j + 4], p[j + 5], p[j + 6], p[j + 7]);
1343  }
1344  }
1345  else if (ChildExtension->ChildType == Other)
1346  {
1347  INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor);
1348  }
1349  else
1350  {
1351  ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType);
1352  }
1353 
1354  /* Clear the init flag */
1355  ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
1356 
1357  InsertTailList(&DeviceExtension->ChildDeviceList,
1358  &ChildExtension->ListEntry);
1359  }
1360 
1361  return STATUS_SUCCESS;
1362 }
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
_Must_inspect_result_ typedef _In_ PVOID Unused
Definition: iotypes.h:1166
VIDEO_CHILD_TYPE ChildType
Definition: videoprt.h:121
#define INFO_(ch,...)
Definition: debug.h:159
PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor
Definition: video.h:677
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
#define TRUE
Definition: types.h:120
uint16_t * PWSTR
Definition: typedefs.h:56
VIDEO_HW_INITIALIZATION_DATA InitializationData
Definition: videoprt.h:72
unsigned char * PUCHAR
Definition: retypes.h:3
#define ERR_(ch,...)
Definition: debug.h:156
ULONG ChildDescriptorSize
Definition: video.h:262
#define InsertTailList(ListHead, Entry)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define FILE_DEVICE_CONTROLLER
Definition: winioctl.h:110
#define FALSE
Definition: types.h:117
#define VIDEO_PORT_GET_CHILD_EXTENSION(MiniportExtension)
Definition: videoprt.h:134
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:118
PVOID DeviceExtension
Definition: env_spec_w32.h:418
unsigned char BOOLEAN
#define VIDEO_ENUM_MORE_DEVICES
Definition: video.h:139
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:126
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
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Definition: video.h:273
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
unsigned char UCHAR
Definition: xmlstorage.h:181
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:86
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
Definition: video.h:270
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
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:127
unsigned int ULONG
Definition: retypes.h:1
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
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
PVOID ChildHwDeviceExtension
Definition: video.h:265
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define STATUS_SUCCESS
Definition: shellext.h:65
GLfloat GLfloat p
Definition: glext.h:8902
#define VIDEO_ENUM_NO_MORE_DEVICES
Definition: video.h:140
#define WARN_(ch,...)
Definition: debug.h:157
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
#define VIDEO_ENUM_INVALID_DEVICE
Definition: video.h:141

Referenced by IntVideoPortQueryBusRelations().

◆ IntVideoPortFindAdapter()

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

Definition at line 348 of file videoprt.c.

352 {
353  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
355  VP_STATUS vpStatus;
356  VIDEO_PORT_CONFIG_INFO ConfigInfo;
358  UCHAR Again = FALSE;
359  BOOL LegacyDetection = FALSE;
360 
361  DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
362 
363  /* Setup a ConfigInfo structure that we will pass to HwFindAdapter. */
364  RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO));
365  ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO);
366  ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType;
367  if (ConfigInfo.AdapterInterfaceType == PCIBus)
368  ConfigInfo.InterruptMode = LevelSensitive;
369  else
370  ConfigInfo.InterruptMode = Latched;
371  ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer;
373  ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
374  ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel;
375  ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector;
376 
379  sizeof(SystemBasicInfo),
380  NULL);
381  if (NT_SUCCESS(Status))
382  {
385  }
386 
387  // FIXME: Check the adapter key and update VideoDebugLevel variable.
388 
389  /*
390  * Call miniport HwVidFindAdapter entry point to detect if
391  * particular device is present. There are two possible code
392  * paths. The first one is for Legacy drivers (NT4) and cases
393  * when we don't have information about what bus we're on. The
394  * second case is the standard one for Plug & Play drivers.
395  */
396  if (DeviceExtension->PhysicalDeviceObject == NULL)
397  {
398  LegacyDetection = TRUE;
399  }
400 
401  if (LegacyDetection)
402  {
403  ULONG BusNumber, MaxBuses;
404 
405  MaxBuses = DeviceExtension->AdapterInterfaceType == PCIBus ? PCI_MAX_BRIDGE_NUMBER : 1;
406 
407  for (BusNumber = 0; BusNumber < MaxBuses; BusNumber++)
408  {
409  DeviceExtension->SystemIoBusNumber =
410  ConfigInfo.SystemIoBusNumber = BusNumber;
411 
412  RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension,
413  DriverExtension->InitializationData.HwDeviceExtensionSize);
414 
415  /* FIXME: Need to figure out what string to pass as param 3. */
416  vpStatus = DriverExtension->InitializationData.HwFindAdapter(
417  &DeviceExtension->MiniPortDeviceExtension,
418  DriverExtension->HwContext,
419  NULL,
420  &ConfigInfo,
421  &Again);
422 
423  if (vpStatus == ERROR_DEV_NOT_EXIST)
424  {
425  continue;
426  }
427  else
428  {
429  break;
430  }
431  }
432  }
433  else
434  {
435  /* FIXME: Need to figure out what string to pass as param 3. */
436  vpStatus = DriverExtension->InitializationData.HwFindAdapter(
437  &DeviceExtension->MiniPortDeviceExtension,
438  DriverExtension->HwContext,
439  NULL,
440  &ConfigInfo,
441  &Again);
442  }
443 
444  if (vpStatus != NO_ERROR)
445  {
446  ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", vpStatus);
448  goto Failure;
449  }
450 
451  /*
452  * Now we know the device is present, so let's do all additional tasks
453  * such as creating symlinks or setting up interrupts and timer.
454  */
455 
456  /* FIXME: Allocate hardware resources for device. */
457 
458  /* Allocate interrupt for device. */
460  {
462  goto Failure;
463  }
464 
465  /* Allocate timer for device. */
467  {
468  if (DeviceExtension->InterruptObject != NULL)
469  IoDisconnectInterrupt(DeviceExtension->InterruptObject);
470  ERR_(VIDEOPRT, "IntVideoPortSetupTimer failed\n");
472  goto Failure;
473  }
474 
475  /* If the device can be reset, insert it in the list of resettable adapters */
476  InitializeListHead(&DeviceExtension->HwResetListEntry);
477  if (DriverExtension->InitializationData.HwResetHw != NULL)
478  {
480  &DeviceExtension->HwResetListEntry,
482  }
483 
484  INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
485  return STATUS_SUCCESS;
486 
487 Failure:
488  RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
489  if (DeviceExtension->NextDeviceObject)
490  IoDetachDevice(DeviceExtension->NextDeviceObject);
492  return Status;
493 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define PCI_MAX_BRIDGE_NUMBER
Definition: iotypes.h:3600
#define INFO_(ch,...)
Definition: debug.h:159
#define TRUE
Definition: types.h:120
BOOLEAN NTAPI IntVideoPortSetupTimer(IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension)
Definition: timer.c:43
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1296
#define NO_ERROR
Definition: dderror.h:5
INTERFACE_TYPE AdapterInterfaceType
Definition: video.h:169
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
PVOID NTAPI IntVideoPortGetProcAddress(IN PVOID HwDeviceExtension, IN PUCHAR FunctionName)
Definition: funclist.c:100
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
PVIDEO_PORT_GET_PROC_ADDRESS VideoPortGetProcAddress
Definition: video.h:193
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
Definition: irq.c:140
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:43
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
Definition: halfuncs.h:156
Status
Definition: gdiplustypes.h:24
ULONGLONG SystemMemorySize
Definition: video.h:195
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
SYSTEM_BASIC_INFORMATION SystemBasicInfo
Definition: perfdata.c:45
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
struct _VIDEO_PORT_CONFIG_INFO VIDEO_PORT_CONFIG_INFO
unsigned char UCHAR
Definition: xmlstorage.h:181
PWSTR DriverRegistryPath
Definition: video.h:194
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
BOOLEAN NTAPI IntVideoPortSetupInterrupt(IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PVIDEO_PORT_CONFIG_INFO ConfigInfo)
Definition: interrupt.c:45
#define NULL
Definition: types.h:112
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
LIST_ENTRY HwResetAdaptersList
LONG VP_STATUS
Definition: video.h:153
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
#define STATUS_SUCCESS
Definition: shellext.h:65
INTERFACE_TYPE AdapterInterfaceType
Definition: videoprt.h:98
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
ULONG BusInterruptVector
Definition: video.h:171
KINTERRUPT_MODE InterruptMode
Definition: video.h:172

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 }
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntddk_ex.h:178
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
#define NULL
Definition: types.h:112
#define RtlImageNtHeader
Definition: compat.h:665
unsigned int ULONG
Definition: retypes.h:1
base for all directory entries
Definition: entries.h:138
#define ULONG_PTR
Definition: config.h:101
_In_ BOOLEAN _In_ USHORT Directory
Definition: rtlfuncs.h:3885

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

933 {
935 
936  INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n",
938  return (*(CallbackContext->HwGetRegistryRoutine))(
939  CallbackContext->HwDeviceExtension,
940  CallbackContext->HwContext,
941  ValueName,
942  ValueData,
943  ValueLength);
944 }
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG _In_opt_ PEVENT_FILTER_DESCRIPTOR _Inout_opt_ PVOID CallbackContext
Definition: wmitypes.h:55
#define INFO_(ch,...)
Definition: debug.h:159
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
Definition: wdfregistry.h:279
struct QueryRegistryCallbackContext * PQUERY_REGISTRY_CALLBACK_CONTEXT
_In_ GUID _In_ PVOID ValueData
Definition: hubbusif.h:311
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:240
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
Definition: wdfregistry.h:271

Referenced by VideoPortGetRegistryParameters().

◆ RTL_STATIC_LIST_HEAD()

RTL_STATIC_LIST_HEAD ( HwResetAdaptersList  )

◆ VideoPortAcquireDeviceLock()

VOID NTAPI VideoPortAcquireDeviceLock ( IN PVOID  HwDeviceExtension)

Definition at line 1602 of file videoprt.c.

1604 {
1605  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1606 
1607  TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n");
1608  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1610  // ASSERT(Status == STATUS_SUCCESS);
1611 }
#define KeWaitForMutexObject
Definition: kefuncs.h:557
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define FALSE
Definition: types.h:117
#define TRACE_(x)
Definition: compat.h:76
#define NULL
Definition: types.h:112

◆ VideoPortAllocateContiguousMemory()

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

Definition at line 1646 of file videoprt.c.

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

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

1518 {
1519  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1522  IO_STACK_LOCATION IoStack;
1523  ULONG PciFlags = 0;
1524  NTSTATUS Status;
1525  BOOL DevicePresent;
1526 
1527  TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n");
1528 
1530  {
1531  WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS));
1532  return FALSE;
1533  }
1534 
1535  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1536 
1538  PciDevicePresentInterface.Version = 1;
1540  IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version;
1542  IoStack.Parameters.QueryInterface.InterfaceType =
1543  &GUID_PCI_DEVICE_PRESENT_INTERFACE;
1544  Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject,
1546  if (!NT_SUCCESS(Status))
1547  {
1548  WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status);
1549  return FALSE;
1550  }
1551 
1552  if (Flags & CDE_USE_REVISION)
1553  PciFlags |= PCI_USE_REVISION;
1555  PciFlags |= PCI_USE_SUBSYSTEM_IDS;
1556 
1557  DevicePresent = PciDevicePresentInterface.IsDevicePresent(
1558  VendorId, DeviceId, RevisionId,
1559  SubVendorId, SubSystemId, PciFlags);
1560 
1561  PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context);
1562 
1563  return DevicePresent;
1564 }
LONG NTSTATUS
Definition: precomp.h:26
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
struct _PCI_DEVICE_PRESENT_INTERFACE PCI_DEVICE_PRESENT_INTERFACE
#define PCI_USE_REVISION
Definition: iotypes.h:867
#define FALSE
Definition: types.h:117
#define CDE_USE_REVISION
Definition: video.h:147
unsigned int BOOL
Definition: ntddk_ex.h:94
struct _INTERFACE * PINTERFACE
Status
Definition: gdiplustypes.h:24
#define TRACE_(x)
Definition: compat.h:76
#define CDE_USE_SUBSYSTEM_IDS
Definition: video.h:146
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define IRP_MN_QUERY_INTERFACE
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
unsigned int ULONG
Definition: retypes.h:1
PCI_INTERFACE PciDevicePresentInterface
Definition: devhere.c:18
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
NTSTATUS NTAPI IopInitiatePnpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, IN UCHAR MinorFunction, IN PIO_STACK_LOCATION Stack)
#define WARN_(ch,...)
Definition: debug.h:157
#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 1389 of file videoprt.c.

1393 {
1395  PVIDEO_PORT_DEVICE_EXTENSION FirstDeviceExtension, DeviceExtension;
1396  NTSTATUS Status;
1397 
1398  ASSERT(SecondaryDeviceExtension);
1399 
1400  if (Flag != 0)
1401  {
1402  UNIMPLEMENTED;
1403  }
1404 
1405  FirstDeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1406 
1407  if (FirstDeviceExtension->DisplayNumber != 0)
1408  {
1409  DPRINT1("Calling VideoPortCreateSecondaryDisplay for InstanceId %lu\n",
1410  FirstDeviceExtension->DisplayNumber);
1411  }
1412 
1414  FirstDeviceExtension->DriverExtension,
1415  FirstDeviceExtension->PhysicalDeviceObject,
1416  FirstDeviceExtension->AdapterNumber,
1417  FirstDeviceExtension->NumberOfSecondaryDisplays + 1,
1418  &DeviceObject);
1419  if (!NT_SUCCESS(Status))
1420  {
1421  DPRINT1("IntVideoPortCreateAdapterDeviceObject() failed with status 0x%08x\n", Status);
1422  return ERROR_DEV_NOT_EXIST;
1423  }
1424 
1425  DeviceExtension = DeviceObject->DeviceExtension;
1426 
1427  /* Increment secondary display count */
1428  FirstDeviceExtension->NumberOfSecondaryDisplays++;
1429 
1430  *SecondaryDeviceExtension = DeviceExtension->MiniPortDeviceExtension;
1431  return NO_ERROR;
1432 }
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
LONG NTSTATUS
Definition: precomp.h:26
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define NO_ERROR
Definition: dderror.h:5
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
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
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Definition: xml2sdb.h:79
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:86
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: debug.h:115
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8

◆ VideoPortDebugPrint()

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

Definition at line 872 of file videoprt.c.

876 {
877  va_list ap;
878 
879  if (VideoDebugLevel >= DebugPrintLevel)
880  DebugPrintLevel = Error;
881 
882  va_start(ap, DebugMessage);
883  vDbgPrintEx(DPFLTR_IHVVIDEO_ID, DebugPrintLevel, DebugMessage, ap);
884  va_end(ap);
885 }
#define va_end(ap)
Definition: acmsvcex.h:90
char * va_list
Definition: acmsvcex.h:78
ULONG VideoDebugLevel
Definition: videoprt.c:34
va_start(ap, x)
BOOL Error
Definition: chkdsk.c:66
NTSYSAPI ULONG NTAPI vDbgPrintEx(_In_ ULONG ComponentId, _In_ ULONG Level, _In_z_ PCCH Format, _In_ va_list ap)
void int int ULONGLONG int va_list * ap
Definition: winesup.h:32

Referenced by IntLoadRegistryParameters().

◆ VideoPortEnumerateChildren()

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

Definition at line 1366 of file videoprt.c.

1369 {
1370  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1371 
1372  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1373  ASSERT(DeviceExtension);
1374 
1375  if (DeviceExtension->PhysicalDeviceObject)
1376  {
1377  /* Trigger reenumeration by the PnP manager */
1379  }
1380 
1381  return NO_ERROR;
1382 }
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define NO_ERROR
Definition: dderror.h:5
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
#define ASSERT(a)
Definition: mode.c:44
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:2342

Referenced by IntVideoPortDispatchOpen(), and VBEInitialize().

◆ VideoPortGetAssociatedDeviceExtension()

PVOID NTAPI VideoPortGetAssociatedDeviceExtension ( IN PVOID  DeviceObject)

Definition at line 1455 of file videoprt.c.

1457 {
1458  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1459 
1460  TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n");
1461  DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
1462  if (!DeviceExtension)
1463  return NULL;
1464  return DeviceExtension->MiniPortDeviceExtension;
1465 }
struct _DEVICE_OBJECT * PDEVICE_OBJECT
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define TRACE_(x)
Definition: compat.h:76
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
#define NULL
Definition: types.h:112

◆ VideoPortGetCurrentIrql()

UCHAR NTAPI VideoPortGetCurrentIrql ( VOID  )

Definition at line 911 of file videoprt.c.

912 {
913  return KeGetCurrentIrql();
914 }
#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 952 of file videoprt.c.

958 {
961  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
963 
964  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
965 
966  TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n",
967  ParameterName, &DeviceExtension->RegistryPath);
968 
969  Context.HwDeviceExtension = HwDeviceExtension;
970  Context.HwContext = HwContext;
971  Context.HwGetRegistryRoutine = GetRegistryRoutine;
972 
976 
978  DeviceExtension->RegistryPath.Buffer,
979  QueryTable,
980  &Context,
981  NULL);
982  if (!NT_SUCCESS(Status))
983  {
984  WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the "
985  "requested parameter\n");
987  }
988 
989  if (IsParameterFileName)
990  {
991  /* FIXME: need to read the contents of the file */
993  }
994 
995  return NO_ERROR;
996 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
Definition: rtlfuncs.h:4155
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA _In_ PVOID HwContext
Definition: srb.h:897
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define NO_ERROR
Definition: dderror.h:5
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:926
Status
Definition: gdiplustypes.h:24
#define TRACE_(x)
Definition: compat.h:76
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_opt_ PWSTR _In_ PWSTR ParameterName
Definition: cdrom.h:960
#define RTL_REGISTRY_ABSOLUTE
Definition: nt_native.h:161
#define NULL
Definition: types.h:112
struct tagContext Context
Definition: acpixf.h:1034
#define UNIMPLEMENTED
Definition: debug.h:115
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
#define RTL_QUERY_REGISTRY_REQUIRED
Definition: nt_native.h:132
#define WARN_(ch,...)
Definition: debug.h:157

◆ VideoPortGetRomImage()

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

Definition at line 1062 of file videoprt.c.

1067 {
1068  static PVOID RomImageBuffer = NULL;
1069  PKPROCESS CallingProcess;
1071 
1072  TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n",
1073  HwDeviceExtension, Length);
1074 
1075  /* If the length is zero then free the existing buffer. */
1076  if (Length == 0)
1077  {
1078  if (RomImageBuffer != NULL)
1079  {
1080  ExFreePool(RomImageBuffer);
1081  RomImageBuffer = NULL;
1082  }
1083  return NULL;
1084  }
1085  else
1086  {
1087  /*
1088  * The DDK says we shouldn't use the legacy C0000 method but get the
1089  * rom base address from the corresponding pci or acpi register but
1090  * lets ignore that and use C0000 anyway. We have already mapped the
1091  * bios area into memory so we'll copy from there.
1092  */
1093 
1094  /* Copy the bios. */
1095  Length = min(Length, 0x10000);
1096  if (RomImageBuffer != NULL)
1097  {
1098  ExFreePool(RomImageBuffer);
1099  }
1100 
1101  RomImageBuffer = ExAllocatePool(PagedPool, Length);
1102  if (RomImageBuffer == NULL)
1103  {
1104  return NULL;
1105  }
1106 
1107  IntAttachToCSRSS(&CallingProcess, &ApcState);
1108  RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length);
1109  IntDetachFromCSRSS(&CallingProcess, &ApcState);
1110 
1111  return RomImageBuffer;
1112  }
1113 }
KAPC_STATE
Definition: ketypes.h:1285
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
unsigned char * PUCHAR
Definition: retypes.h:3
#define TRACE_(x)
Definition: compat.h:76
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
VOID FASTCALL IntAttachToCSRSS(PKPROCESS *CallingProcess, PKAPC_STATE ApcState)
Definition: videoprt.c:497
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1700
#define min(a, b)
Definition: monoChain.cc:55
#define NULL
Definition: types.h:112
VOID FASTCALL IntDetachFromCSRSS(PKPROCESS *CallingProcess, PKAPC_STATE ApcState)
Definition: videoprt.c:510
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define ExFreePool(addr)
Definition: env_spec_w32.h:352

◆ VideoPortGetVersion()

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

Definition at line 1472 of file videoprt.c.

1475 {
1477 
1478  Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
1479  if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO))
1480  {
1481 #if 1
1483  {
1484  VpOsVersionInfo->MajorVersion = Version.dwMajorVersion;
1485  VpOsVersionInfo->MinorVersion = Version.dwMinorVersion;
1486  VpOsVersionInfo->BuildNumber = Version.dwBuildNumber;
1487  VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor;
1488  VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor;
1489  return NO_ERROR;
1490  }
1491  return ERROR_INVALID_PARAMETER;
1492 #else
1493  VpOsVersionInfo->MajorVersion = 5;
1494  VpOsVersionInfo->MinorVersion = 0;
1495  VpOsVersionInfo->BuildNumber = 2195;
1496  VpOsVersionInfo->ServicePackMajor = 4;
1497  VpOsVersionInfo->ServicePackMinor = 0;
1498  return NO_ERROR;
1499 #endif
1500  }
1501 
1502  return ERROR_INVALID_PARAMETER;
1503 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:158
#define NO_ERROR
Definition: dderror.h:5
struct _OSVERSIONINFOEXW RTL_OSVERSIONINFOEXW
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
IN PVOID IN PVOID IN USHORT Version
Definition: pci.h:361

◆ VideoPortGetVgaStatus()

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

Definition at line 1034 of file videoprt.c.

1037 {
1038  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1039 
1040  TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n");
1041 
1042  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1044  {
1045  if (DeviceExtension->AdapterInterfaceType == PCIBus)
1046  {
1047  /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */
1048  /* Assumed for now */
1049  *VgaStatus = 1;
1050  return NO_ERROR;
1051  }
1052  }
1053 
1054  return ERROR_INVALID_FUNCTION;
1055 }
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define NO_ERROR
Definition: dderror.h:5
#define TRACE_(x)
Definition: compat.h:76
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
INTERFACE_TYPE AdapterInterfaceType
Definition: videoprt.h:98

◆ VideoPortInitialize()

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

Definition at line 662 of file videoprt.c.

667 {
672  BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE;
673  static BOOLEAN FirstInitialization;
674 
675  TRACE_(VIDEOPRT, "VideoPortInitialize\n");
676 
677  if (!FirstInitialization)
678  {
679  FirstInitialization = TRUE;
683  }
684 
685  /* As a first thing do parameter checks. */
686  if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA))
687  {
688  ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
690  }
691 
692  if ((HwInitializationData->HwFindAdapter == NULL) ||
693  (HwInitializationData->HwInitialize == NULL) ||
694  (HwInitializationData->HwStartIO == NULL))
695  {
696  ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
698  }
699 
700  switch (HwInitializationData->HwInitDataSize)
701  {
702  /*
703  * NT4 drivers are special case, because we must use legacy method
704  * of detection instead of the Plug & Play one.
705  */
707  INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n");
708  break;
709 
711  INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n");
712  break;
713 
714  case sizeof(VIDEO_HW_INITIALIZATION_DATA):
715  INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n");
716  break;
717 
718  default:
719  ERR_(VIDEOPRT, "Invalid HwInitializationData size.\n");
720  return STATUS_UNSUCCESSFUL;
721  }
722 
723  /* Set dispatching routines */
726  DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
728  DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =
730  DriverObject->DriverUnload = IntVideoPortUnload;
731 
732  /* Determine type of the miniport driver */
733  if ((HwInitializationData->HwInitDataSize >=
734  FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) &&
735  (HwInitializationData->HwSetPowerState != NULL) &&
736  (HwInitializationData->HwGetPowerState != NULL) &&
737  (HwInitializationData->HwGetVideoChildDescriptor != NULL))
738  {
739  INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n");
740  PnpDriver = TRUE;
741  }
742 
743  /* Check if legacy detection should be applied */
744  if (!PnpDriver || HwContext)
745  {
746  INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n",
747  HwInitializationData->AdapterInterfaceType);
748 
749  /* FIXME: Move the code for legacy detection
750  to another function and call it here */
751  LegacyDetection = TRUE;
752  }
753 
754  /*
755  * NOTE:
756  * The driver extension can be already allocated in case that we were
757  * called by legacy driver and failed detecting device. Some miniport
758  * drivers in that case adjust parameters and call VideoPortInitialize
759  * again.
760  */
762  if (DriverExtension == NULL)
763  {
765  DriverObject,
767  (PVOID *)&DriverExtension);
768  if (!NT_SUCCESS(Status))
769  {
770  ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status);
771  return Status;
772  }
773 
774  /*
775  * Save the registry path. This should be done only once even if
776  * VideoPortInitialize is called multiple times.
777  */
778  if (RegistryPath->Length != 0)
779  {
780  DriverExtension->RegistryPath.Length = 0;
781  DriverExtension->RegistryPath.MaximumLength =
782  RegistryPath->Length + sizeof(UNICODE_NULL);
783  DriverExtension->RegistryPath.Buffer =
785  PagedPool,
786  DriverExtension->RegistryPath.MaximumLength,
787  'RTSU');
788  if (DriverExtension->RegistryPath.Buffer == NULL)
789  {
790  RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
792  }
793 
795 
796  /* There is a bug in Spice guest agent, which searches 'System' case-sensitively.
797  * Replace 'SYSTEM' by 'System' to fix that.
798  * Probably for similar reason, Windows also replaces 'MACHINE' by 'Machine'.
799  */
800  wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\SYSTEM\\"), L"\\System\\", ARRAYSIZE(L"\\SYSTEM\\") - 1);
801  wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\MACHINE\\"), L"\\Machine\\", ARRAYSIZE(L"\\MACHINE\\") - 1);
802 
803  INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath);
804  }
805  else
806  {
807  RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
808  }
809  }
810 
811  /* Copy the correct miniport initialization data to the device extension. */
812  RtlCopyMemory(&DriverExtension->InitializationData,
814  HwInitializationData->HwInitDataSize);
815  if (HwInitializationData->HwInitDataSize <
817  {
818  RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData +
819  HwInitializationData->HwInitDataSize),
821  HwInitializationData->HwInitDataSize);
822  }
823  DriverExtension->HwContext = HwContext;
824 
825  /*
826  * Plug & Play drivers registers the device in AddDevice routine.
827  * For legacy drivers we must do it now.
828  */
829  if (LegacyDetection)
830  {
832 
834  {
835  /* Power management */
837  }
838 
841  NULL,
842  DriverExtension->InitializationData.StartingDeviceNumber,
843  0,
844  &DeviceObject);
845  if (!NT_SUCCESS(Status))
846  {
847  ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status);
848  return Status;
849  }
850 
852  if (!NT_SUCCESS(Status))
853  ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status);
854 
855  return Status;
856  }
857  else
858  {
859  DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice;
863 
864  return STATUS_SUCCESS;
865  }
866 }
VOID FASTCALL IntLoadRegistryParameters(VOID)
Definition: videoprt.c:522
NTSTATUS NTAPI IntVideoPortFindAdapter(IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
Definition: videoprt.c:348
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:325
NTSTATUS NTAPI IntVideoPortDispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1141
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define INFO_(ch,...)
Definition: debug.h:159
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1797
#define IRP_MJ_SHUTDOWN
#define TRUE
Definition: types.h:120
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA _In_ PVOID HwContext
Definition: srb.h:897
KMUTEX VideoPortInt10Mutex
Definition: videoprt.c:42
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
NTSTATUS NTAPI IntVideoPortDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:723
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
uint32_t ULONG_PTR
Definition: typedefs.h:65
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
#define UNICODE_NULL
VOID NTAPI IntVideoPortUnload(PDRIVER_OBJECT DriverObject)
Definition: dispatch.c:1197
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:240
unsigned char BOOLEAN
struct _VIDEO_HW_INITIALIZATION_DATA VIDEO_HW_INITIALIZATION_DATA
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:43
NTSTATUS NTAPI IntVideoPortDispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:436
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
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
Status
Definition: gdiplustypes.h:24
#define TRACE_(x)
Definition: compat.h:76
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA
Definition: video.h:119
NTSTATUS NTAPI IntVideoPortDispatchSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1175
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
Definition: mutex.c:67
#define IRP_MJ_POWER
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
NTSTATUS NTAPI IntVideoPortAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
Definition: dispatch.c:334
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1875
#define IRP_MJ_SYSTEM_CONTROL
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT _In_ PTDI_PNP_CONTEXT Context2
Definition: tdikrnl.h:1094
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT Context1
Definition: tdikrnl.h:1094
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NULL
Definition: types.h:112
NTSTATUS NTAPI IntVideoPortDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1109
NTSTATUS NTAPI IntVideoPortDispatchOpen(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:369
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_SUCCESS
Definition: shellext.h:65
#define SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA
Definition: video.h:120
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA * HwInitializationData
Definition: srb.h:897
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52

Referenced by DriverEntry().

◆ VideoPortIsNoVesa()

BOOLEAN NTAPI VideoPortIsNoVesa ( VOID  )

Definition at line 1660 of file videoprt.c.

1661 {
1662  return VpNoVesa;
1663 }
BOOLEAN VpNoVesa
Definition: videoprt.c:37

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

897 {
899 
900  INFO_(VIDEOPRT, "VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n",
901  ErrorCode, ErrorCode, UniqueId, UniqueId);
902  if (Vrp)
903  INFO_(VIDEOPRT, "Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode);
904 }
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
#define INFO_(ch,...)
Definition: debug.h:159
#define UNIMPLEMENTED
Definition: debug.h:115

◆ VideoPortQueryPerformanceCounter()

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

Definition at line 1586 of file videoprt.c.

1589 {
1591 
1592  TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n");
1593  Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency);
1594  return Result.QuadPart;
1595 }
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:426
#define TRACE_(x)
Definition: compat.h:76

◆ VideoPortQueueDpc()

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

Definition at line 1439 of file videoprt.c.

1443 {
1444  return KeInsertQueueDpc(
1445  &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject,
1447  (PVOID)Context);
1448 }
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:725
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
_Must_inspect_result_ _In_ PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine
Definition: fltkernel.h:1035

◆ VideoPortRegisterBugcheckCallback()

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

Definition at line 1571 of file videoprt.c.

1576 {
1577  UNIMPLEMENTED;
1578  return NO_ERROR;
1579 }
#define NO_ERROR
Definition: dderror.h:5
#define UNIMPLEMENTED
Definition: debug.h:115

◆ VideoPortReleaseDeviceLock()

VOID NTAPI VideoPortReleaseDeviceLock ( IN PVOID  HwDeviceExtension)

Definition at line 1618 of file videoprt.c.

1620 {
1621  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1622 
1623  TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n");
1624  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1625  KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE);
1626  //ASSERT(Status == STATUS_SUCCESS);
1627 }
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
Definition: mutex.c:189
#define FALSE
Definition: types.h:117
#define TRACE_(x)
Definition: compat.h:76

◆ VideoPortScanRom()

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

Definition at line 1120 of file videoprt.c.

1125 {
1126  SIZE_T StringLength;
1127  BOOLEAN Found;
1128  PUCHAR SearchLocation;
1129 
1130  TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String);
1131 
1132  StringLength = strlen((PCHAR)String);
1133  Found = FALSE;
1134  for (SearchLocation = RomBase;
1135  !Found && SearchLocation < RomBase + RomLength - StringLength;
1136  SearchLocation++)
1137  {
1138  Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength);
1139  if (Found)
1140  {
1141  INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation);
1142  }
1143  }
1144 
1145  return Found;
1146 }
signed char * PCHAR
Definition: retypes.h:7
#define INFO_(ch,...)
Definition: debug.h:159
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
unsigned char * PUCHAR
Definition: retypes.h:3
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2430
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
return Found
Definition: dirsup.c:1270
#define TRACE_(x)
Definition: compat.h:76
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465

◆ VideoPortSetRegistryParameters()

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

Definition at line 1003 of file videoprt.c.

1008 {
1009  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1010  VP_STATUS Status;
1011 
1012  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1013  TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1014  ValueName,
1015  &DeviceExtension->RegistryPath);
1018  DeviceExtension->RegistryPath.Buffer,
1019  ValueName,
1020  REG_BINARY,
1021  ValueData,
1022  ValueLength);
1023  if (Status != NO_ERROR)
1024  WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status);
1025 
1026  return Status;
1027 }
#define ASSERT_IRQL_LESS_OR_EQUAL(x)
Definition: debug.h:251
#define REG_BINARY
Definition: nt_native.h:1496
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define NO_ERROR
Definition: dderror.h:5
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
Status
Definition: gdiplustypes.h:24
#define TRACE_(x)
Definition: compat.h:76
_In_ GUID _In_ PVOID ValueData
Definition: hubbusif.h:311
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:240
#define RTL_REGISTRY_ABSOLUTE
Definition: nt_native.h:161
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
LONG VP_STATUS
Definition: video.h:153
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
#define WARN_(ch,...)
Definition: debug.h:157
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
Definition: wdfregistry.h:271

Referenced by 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 1153 of file videoprt.c.

1158 {
1159  BOOLEAN Ret;
1160  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1161  KIRQL OldIrql;
1162 
1163  switch (Priority)
1164  {
1165  case VpLowPriority:
1166  Ret = (*SynchronizeRoutine)(Context);
1167  break;
1168 
1169  case VpMediumPriority:
1170  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1171  if (DeviceExtension->InterruptObject == NULL)
1172  Ret = (*SynchronizeRoutine)(Context);
1173  else
1174  Ret = KeSynchronizeExecution(
1175  DeviceExtension->InterruptObject,
1177  Context);
1178  break;
1179 
1180  case VpHighPriority:
1182  if (OldIrql < SYNCH_LEVEL)
1184 
1185  Ret = (*SynchronizeRoutine)(Context);
1186 
1187  if (OldIrql < SYNCH_LEVEL)
1189  break;
1190 
1191  default:
1192  Ret = FALSE;
1193  }
1194 
1195  return Ret;
1196 }
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
_In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
Definition: kefuncs.h:538
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
Definition: wdfinterrupt.h:651
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:792
#define SYNCH_LEVEL
Definition: env_spec_w32.h:704
#define NULL
Definition: types.h:112
VOID NTAPI KeRaiseIrql(KIRQL NewIrql, PKIRQL OldIrql)
Definition: spinlock.c:27
struct tagContext Context
Definition: acpixf.h:1034
BOOLEAN NTAPI KeSynchronizeExecution(IN OUT PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext OPTIONAL)
Definition: interrupt.c:165
VOID NTAPI KeLowerIrql(KIRQL NewIrql)
Definition: spinlock.c:39

◆ VpNotifyEaData()

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

Definition at line 1634 of file videoprt.c.

1637 {
1638  UNIMPLEMENTED;
1639 }
#define UNIMPLEMENTED
Definition: debug.h:115

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

◆ VpNoVesa

BOOLEAN VpNoVesa = FALSE

Definition at line 37 of file videoprt.c.

Referenced by IntLoadRegistryParameters(), and VideoPortIsNoVesa().