ReactOS  0.4.15-dev-3291-gea4c1a0
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)
 
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
 
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 49 of file videoprt.c.

52 {
53  return STATUS_SUCCESS;
54 }
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ IntAttachToCSRSS()

VOID FASTCALL IntAttachToCSRSS ( PKPROCESS CallingProcess,
PKAPC_STATE  ApcState 
)

Definition at line 493 of file videoprt.c.

496 {
497  *CallingProcess = (PKPROCESS)PsGetCurrentProcess();
498  if (*CallingProcess != CsrProcess)
499  {
501  }
502 }
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:206
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1679

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

◆ IntDetachFromCSRSS()

VOID FASTCALL IntDetachFromCSRSS ( PKPROCESS CallingProcess,
PKAPC_STATE  ApcState 
)

Definition at line 506 of file videoprt.c.

509 {
510  if (*CallingProcess != CsrProcess)
511  {
513  }
514 }
PKPROCESS CsrProcess
Definition: videoprt.c:39
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
Definition: procobj.c:756
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1679

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

◆ IntLoadRegistryParameters()

VOID FASTCALL IntLoadRegistryParameters ( VOID  )

Definition at line 518 of file videoprt.c.

519 {
522  UNICODE_STRING Path = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control");
523  UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions");
527 
528  /* Initialize object attributes with the path we want */
530  &Path,
532  NULL,
533  NULL);
534 
535  /* Open the key */
536  Status = ZwOpenKey(&KeyHandle,
539  if (!NT_SUCCESS(Status))
540  {
541  VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status);
542  return;
543  }
544 
545  /* Find out how large our buffer should be */
546  Status = ZwQueryValueKey(KeyHandle,
547  &ValueName,
549  NULL,
550  0,
551  &Length);
553  {
554  VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
556  return;
557  }
558 
559  /* Allocate it */
561  if (!KeyInfo)
562  {
563  VideoPortDebugPrint(Error, "Out of memory\n");
565  return;
566  }
567 
568  /* Now for real this time */
569  Status = ZwQueryValueKey(KeyHandle,
570  &ValueName,
572  KeyInfo,
573  Length,
574  &NewLength);
576 
577  if (!NT_SUCCESS(Status))
578  {
579  VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
581  return;
582  }
583 
584  /* Sanity check */
585  if (KeyInfo->Type != REG_SZ)
586  {
587  VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n");
589  return;
590  }
591 
592  /* Check if BASEVIDEO or NOVESA is present in the start options */
593  if (wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO"))
594  VpBaseVideo = TRUE;
595  if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA"))
596  VpNoVesa = TRUE;
597 
599 
600  /* FIXME: Old ReactOS-compatibility... */
601  if (VpBaseVideo) VpNoVesa = TRUE;
602 
603  if (VpNoVesa)
604  VideoPortDebugPrint(Info, "VESA mode disabled\n");
605  else
606  VideoPortDebugPrint(Info, "VESA mode enabled\n");
607 
608  /* If we are in BASEVIDEO, create the volatile registry key for Win32k */
609  if (VpBaseVideo)
610  {
611  RtlInitUnicodeString(&Path, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\BaseVideo");
612 
614  &Path,
616  NULL,
617  NULL);
618 
619  Status = ZwCreateKey(&KeyHandle,
620  KEY_WRITE,
622  0,
623  NULL,
625  NULL);
626  if (NT_SUCCESS(Status))
628  else
629  ERR_(VIDEOPRT, "Failed to create the BaseVideo key (0x%x)\n", Status);
630  }
631 
632  return;
633 }
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)
#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
Status
Definition: gdiplustypes.h:24
#define KEY_WRITE
Definition: nt_native.h:1031
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
BOOL Error
Definition: chkdsk.c:66
#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:3375
static const WCHAR L[]
Definition: oid.c:1250
VOID VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PCHAR DebugMessage,...)
Definition: videoprt.c:844
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 58 of file videoprt.c.

60 {
61  WCHAR DeviceBuffer[20];
63  WCHAR SymlinkBuffer[20];
64  UNICODE_STRING SymlinkName;
67 
68  /* Create a unicode device name. */
69  DeviceNumber = DeviceExtension->DeviceNumber;
70  swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
71 
72  /* Add entry to DEVICEMAP\VIDEO key in registry. */
74  L"VIDEO",
75  DeviceBuffer,
76  REG_SZ,
77  DeviceExtension->NewRegistryPath.Buffer,
78  DeviceExtension->NewRegistryPath.Length + sizeof(UNICODE_NULL));
79  if (!NT_SUCCESS(Status))
80  {
81  ERR_(VIDEOPRT, "Failed to create DEViCEMAP registry entry: 0x%X\n", Status);
82  return Status;
83  }
84 
86  L"VIDEO",
87  L"MaxObjectNumber",
88  REG_DWORD,
89  &DeviceNumber,
90  sizeof(DeviceNumber));
91  if (!NT_SUCCESS(Status))
92  {
93  ERR_(VIDEOPRT, "Failed to write MaxObjectNumber: 0x%X\n", Status);
94  return Status;
95  }
96 
97  /* Create symbolic link "\??\DISPLAYx" */
98  swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
99  RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
100  RtlInitUnicodeString(&DeviceName, DeviceBuffer);
101  Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
102  if (!NT_SUCCESS(Status))
103  {
104  ERR_(VIDEOPRT, "Failed to create symbolic link: 0x%X\n", Status);
105  return Status;
106  }
107 
108  /* Update MaxObjectNumber */
110 
111  return STATUS_SUCCESS;
112 }
UNICODE_STRING NewRegistryPath
Definition: videoprt.h:91
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
#define swprintf
Definition: precomp.h:40
_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
static const WCHAR L[]
Definition: oid.c:1250
unsigned int ULONG
Definition: retypes.h:1
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#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 152 of file videoprt.c.

159 {
160  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
162  ULONG PciSlotNumber;
164  ULONG Size;
166  WCHAR DeviceBuffer[20];
168  PDEVICE_OBJECT DeviceObject_;
169 
170  if (DeviceObject == NULL)
171  DeviceObject = &DeviceObject_;
172 
173  /*
174  * Find the first free device number that can be used for video device
175  * object names and symlinks.
176  */
178  if (DeviceNumber == (ULONG)-1)
179  {
180  WARN_(VIDEOPRT, "Can't find free device number\n");
181  return STATUS_UNSUCCESSFUL;
182  }
183 
184  /*
185  * Create the device object.
186  */
187 
188  /* Create a unicode device name. */
189  swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
190  RtlInitUnicodeString(&DeviceName, DeviceBuffer);
191 
192  INFO_(VIDEOPRT, "HwDeviceExtension size is: 0x%x\n",
193  DriverExtension->InitializationData.HwDeviceExtensionSize);
194 
195  /* Create the device object. */
197  DriverExtension->InitializationData.HwDeviceExtensionSize;
199  Size,
200  &DeviceName,
202  0,
203  TRUE,
204  DeviceObject);
205 
206  if (!NT_SUCCESS(Status))
207  {
208  WARN_(VIDEOPRT, "IoCreateDevice call failed with status 0x%08x\n", Status);
209  return Status;
210  }
211 
212  /*
213  * Set the buffering strategy here. If you change this, remember
214  * to change VidDispatchDeviceControl too.
215  */
216 
217  (*DeviceObject)->Flags |= DO_BUFFERED_IO;
218 
219  /* Initialize device extension. */
220  DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)((*DeviceObject)->DeviceExtension);
221  DeviceExtension->Common.Fdo = TRUE;
222  DeviceExtension->DeviceNumber = DeviceNumber;
223  DeviceExtension->DriverObject = DriverObject;
224  DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
225  DeviceExtension->FunctionalDeviceObject = *DeviceObject;
226  DeviceExtension->DriverExtension = DriverExtension;
227  DeviceExtension->SessionId = -1;
228  DeviceExtension->AdapterNumber = AdapterNumber;
229  DeviceExtension->DisplayNumber = DisplayNumber;
230 
231  InitializeListHead(&DeviceExtension->ChildDeviceList);
232 
233  /* Get the registry path associated with this device. */
235  DeviceExtension->AdapterNumber,
236  &DeviceExtension->RegistryPath);
237  if (!NT_SUCCESS(Status))
238  {
239  WARN_(VIDEOPRT, "IntCreateRegistryPath() call failed with status 0x%08x\n", Status);
241  *DeviceObject = NULL;
242  return Status;
243  }
244 
245  if (PhysicalDeviceObject != NULL)
246  {
247  /* Get bus number from the upper level bus driver. */
248  Size = sizeof(ULONG);
251  Size,
252  &DeviceExtension->SystemIoBusNumber,
253  &Size);
254  if (!NT_SUCCESS(Status))
255  {
256  WARN_(VIDEOPRT, "Couldn't get an information from bus driver. We will try to\n"
257  "use legacy detection method, but even that doesn't mean that\n"
258  "it will work.\n");
259  DeviceExtension->PhysicalDeviceObject = NULL;
260  }
261  }
262 
263  DeviceExtension->AdapterInterfaceType =
264  DriverExtension->InitializationData.AdapterInterfaceType;
265 
266  if (PhysicalDeviceObject != NULL)
267  {
268  /* Get bus type from the upper level bus driver. */
269  Size = sizeof(ULONG);
272  Size,
273  &DeviceExtension->AdapterInterfaceType,
274  &Size);
275 
276  /* Get bus device address from the upper level bus driver. */
277  Size = sizeof(ULONG);
280  Size,
281  &PciSlotNumber,
282  &Size);
283 
284  /* Convert slotnumber to PCI_SLOT_NUMBER */
285  SlotNumber.u.AsULONG = 0;
286  SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF;
287  SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF;
288  DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG;
289  }
290 
291  InitializeListHead(&DeviceExtension->AddressMappingListHead);
292  InitializeListHead(&DeviceExtension->DmaAdapterList);
293 
294  KeInitializeDpc(&DeviceExtension->DpcObject,
296  DeviceExtension);
297 
298  KeInitializeMutex(&DeviceExtension->DeviceLock, 0);
299 
300  /* Attach the device. */
301  if ((PhysicalDeviceObject != NULL) && (DisplayNumber == 0))
303  *DeviceObject,
305 
306  Status = IntCreateNewRegistryPath(DeviceExtension);
307  if (!NT_SUCCESS(Status))
308  {
309  ERR_(VIDEOPRT, "IntCreateNewRegistryPath() failed with status 0x%08x\n", Status);
311  *DeviceObject = NULL;
312  return Status;
313  }
314 
315  IntSetupDeviceSettingsKey(DeviceExtension);
316 
317  /* Remove the initailizing flag */
318  (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
319 
320  /* Set up the VIDEO/DEVICEMAP registry keys */
321  Status = IntVideoPortAddDeviceMapLink(DeviceExtension);
322  if (!NT_SUCCESS(Status))
323  {
324  ERR_(VIDEOPRT, "IntVideoPortAddDeviceMapLink() failed with status 0x%08x\n", Status);
326  *DeviceObject = NULL;
327  return Status;
328  }
329 
330  if (DisplayNumber == 0)
331  {
332  DriverExtension->InitializationData.StartingDeviceNumber++;
333  }
334 
335  return STATUS_SUCCESS;
336 }
#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:139
#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
#define swprintf
Definition: precomp.h:40
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1155
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_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
static const WCHAR L[]
Definition: oid.c:1250
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
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:58
#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 139 of file videoprt.c.

144 {
145  PVOID HwDeviceExtension =
146  &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension;
148 }
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().

◆ IntVideoPortFindAdapter()

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

Definition at line 341 of file videoprt.c.

345 {
346  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
348  VP_STATUS vpStatus;
349  VIDEO_PORT_CONFIG_INFO ConfigInfo;
351  UCHAR Again = FALSE;
352  BOOL LegacyDetection = FALSE;
353 
354  DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
355 
356  /* Setup a ConfigInfo structure that we will pass to HwFindAdapter. */
357  RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO));
358  ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO);
359  ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType;
360  if (ConfigInfo.AdapterInterfaceType == PCIBus)
361  ConfigInfo.InterruptMode = LevelSensitive;
362  else
363  ConfigInfo.InterruptMode = Latched;
364  ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer;
366  ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
367  ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel;
368  ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector;
369 
372  sizeof(SystemBasicInfo),
373  NULL);
374  if (NT_SUCCESS(Status))
375  {
378  }
379 
380  // FIXME: Check the adapter key and update VideoDebugLevel variable.
381 
382  /*
383  * Call miniport HwVidFindAdapter entry point to detect if
384  * particular device is present. There are two possible code
385  * paths. The first one is for Legacy drivers (NT4) and cases
386  * when we don't have information about what bus we're on. The
387  * second case is the standard one for Plug & Play drivers.
388  */
389  if (DeviceExtension->PhysicalDeviceObject == NULL)
390  {
391  LegacyDetection = TRUE;
392  }
393 
394  if (LegacyDetection)
395  {
396  ULONG BusNumber, MaxBuses;
397 
398  MaxBuses = DeviceExtension->AdapterInterfaceType == PCIBus ? PCI_MAX_BRIDGE_NUMBER : 1;
399 
400  for (BusNumber = 0; BusNumber < MaxBuses; BusNumber++)
401  {
402  DeviceExtension->SystemIoBusNumber =
403  ConfigInfo.SystemIoBusNumber = BusNumber;
404 
405  RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension,
406  DriverExtension->InitializationData.HwDeviceExtensionSize);
407 
408  /* FIXME: Need to figure out what string to pass as param 3. */
409  vpStatus = DriverExtension->InitializationData.HwFindAdapter(
410  &DeviceExtension->MiniPortDeviceExtension,
411  DriverExtension->HwContext,
412  NULL,
413  &ConfigInfo,
414  &Again);
415 
416  if (vpStatus == ERROR_DEV_NOT_EXIST)
417  {
418  continue;
419  }
420  else
421  {
422  break;
423  }
424  }
425  }
426  else
427  {
428  /* FIXME: Need to figure out what string to pass as param 3. */
429  vpStatus = DriverExtension->InitializationData.HwFindAdapter(
430  &DeviceExtension->MiniPortDeviceExtension,
431  DriverExtension->HwContext,
432  NULL,
433  &ConfigInfo,
434  &Again);
435  }
436 
437  if (vpStatus != NO_ERROR)
438  {
439  ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", vpStatus);
441  goto Failure;
442  }
443 
444  /*
445  * Now we know the device is present, so let's do all additional tasks
446  * such as creating symlinks or setting up interrupts and timer.
447  */
448 
449  /* FIXME: Allocate hardware resources for device. */
450 
451  /* Allocate interrupt for device. */
453  {
455  goto Failure;
456  }
457 
458  /* Allocate timer for device. */
460  {
461  if (DeviceExtension->InterruptObject != NULL)
462  IoDisconnectInterrupt(DeviceExtension->InterruptObject);
463  ERR_(VIDEOPRT, "IntVideoPortSetupTimer failed\n");
465  goto Failure;
466  }
467 
468  /* If the device can be reset, insert it in the list of resettable adapters */
469  InitializeListHead(&DeviceExtension->HwResetListEntry);
470  if (DriverExtension->InitializationData.HwResetHw != NULL)
471  {
473  &DeviceExtension->HwResetListEntry,
475  }
476 
477  /* Query children of the device. */
479 
480  INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
481  return STATUS_SUCCESS;
482 
483 Failure:
484  RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
485  if (DeviceExtension->NextDeviceObject)
486  IoDetachDevice(DeviceExtension->NextDeviceObject);
488  return Status;
489 }
#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
VP_STATUS NTAPI VideoPortEnumerateChildren(IN PVOID HwDeviceExtension, IN PVOID Reserved)
Definition: videoprt.c:1175
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:42
_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 116 of file videoprt.c.

119 {
120  PIMAGE_NT_HEADERS NtHeader;
121  ULONG Va;
122 
123  NtHeader = RtlImageNtHeader(BaseAddress);
124  if (NtHeader == NULL)
125  return NULL;
126 
128  return NULL;
129 
131  if (Va == 0)
132  return NULL;
133 
134  return (PVOID)((ULONG_PTR)BaseAddress + Va);
135 }
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 898 of file videoprt.c.

905 {
907 
908  INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n",
910  return (*(CallbackContext->HwGetRegistryRoutine))(
911  CallbackContext->HwDeviceExtension,
912  CallbackContext->HwContext,
913  ValueName,
914  ValueData,
915  ValueLength);
916 }
_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 1558 of file videoprt.c.

1560 {
1561  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1562 
1563  TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n");
1564  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1566  // ASSERT(Status == STATUS_SUCCESS);
1567 }
#define KeWaitForMutexObject
Definition: kefuncs.h:555
#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 1602 of file videoprt.c.

1607 {
1609 }
_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 1466 of file videoprt.c.

1474 {
1475  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1478  IO_STACK_LOCATION IoStack;
1479  ULONG PciFlags = 0;
1480  NTSTATUS Status;
1481  BOOL DevicePresent;
1482 
1483  TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n");
1484 
1486  {
1487  WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS));
1488  return FALSE;
1489  }
1490 
1491  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1492 
1494  PciDevicePresentInterface.Version = 1;
1496  IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version;
1498  IoStack.Parameters.QueryInterface.InterfaceType =
1499  &GUID_PCI_DEVICE_PRESENT_INTERFACE;
1500  Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject,
1502  if (!NT_SUCCESS(Status))
1503  {
1504  WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status);
1505  return FALSE;
1506  }
1507 
1508  if (Flags & CDE_USE_REVISION)
1509  PciFlags |= PCI_USE_REVISION;
1511  PciFlags |= PCI_USE_SUBSYSTEM_IDS;
1512 
1513  DevicePresent = PciDevicePresentInterface.IsDevicePresent(
1514  VendorId, DeviceId, RevisionId,
1515  SubVendorId, SubSystemId, PciFlags);
1516 
1517  PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context);
1518 
1519  return DevicePresent;
1520 }
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 1345 of file videoprt.c.

1349 {
1351  PVIDEO_PORT_DEVICE_EXTENSION FirstDeviceExtension, DeviceExtension;
1352  NTSTATUS Status;
1353 
1354  ASSERT(SecondaryDeviceExtension);
1355 
1356  if (Flag != 0)
1357  {
1358  UNIMPLEMENTED;
1359  }
1360 
1361  FirstDeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1362 
1363  if (FirstDeviceExtension->DisplayNumber != 0)
1364  {
1365  DPRINT1("Calling VideoPortCreateSecondaryDisplay for InstanceId %lu\n",
1366  FirstDeviceExtension->DisplayNumber);
1367  }
1368 
1370  FirstDeviceExtension->DriverExtension,
1371  FirstDeviceExtension->PhysicalDeviceObject,
1372  FirstDeviceExtension->AdapterNumber,
1373  FirstDeviceExtension->NumberOfSecondaryDisplays + 1,
1374  &DeviceObject);
1375  if (!NT_SUCCESS(Status))
1376  {
1377  DPRINT1("IntVideoPortCreateAdapterDeviceObject() failed with status 0x%08x\n", Status);
1378  return ERROR_DEV_NOT_EXIST;
1379  }
1380 
1381  DeviceExtension = DeviceObject->DeviceExtension;
1382 
1383  /* Increment secondary display count */
1384  FirstDeviceExtension->NumberOfSecondaryDisplays++;
1385 
1386  *SecondaryDeviceExtension = DeviceExtension->MiniPortDeviceExtension;
1387  return NO_ERROR;
1388 }
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:152
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 844 of file videoprt.c.

848 {
849  va_list ap;
850 
851  if (VideoDebugLevel >= DebugPrintLevel)
852  DebugPrintLevel = Error;
853 
854  va_start(ap, DebugMessage);
855  vDbgPrintEx(DPFLTR_IHVVIDEO_ID, DebugPrintLevel, DebugMessage, ap);
856  va_end(ap);
857 }
#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 1175 of file videoprt.c.

1178 {
1179  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1180  ULONG Status;
1181  VIDEO_CHILD_ENUM_INFO ChildEnumInfo;
1182  BOOLEAN bHaveLastMonitorID = FALSE;
1183  UCHAR LastMonitorID[10];
1184  ULONG Unused;
1185  UINT i;
1186  PDEVICE_OBJECT ChildDeviceObject;
1187  PVIDEO_PORT_CHILD_EXTENSION ChildExtension;
1188 
1189  INFO_(VIDEOPRT, "Starting child device probe\n");
1190  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1192  {
1193  WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n");
1194  return NO_ERROR;
1195  }
1196 
1197  if (!IsListEmpty(&DeviceExtension->ChildDeviceList))
1198  {
1199  ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n");
1200  return NO_ERROR;
1201  }
1202 
1203  /* Enumerate the children */
1204  for (i = 1; ; i++)
1205  {
1206  Status = IoCreateDevice(DeviceExtension->DriverObject,
1207  sizeof(VIDEO_PORT_CHILD_EXTENSION) +
1209  NULL,
1212  FALSE,
1213  &ChildDeviceObject);
1214  if (!NT_SUCCESS(Status))
1215  return Status;
1216 
1217  ChildExtension = ChildDeviceObject->DeviceExtension;
1218 
1219  RtlZeroMemory(ChildExtension,
1220  sizeof(VIDEO_PORT_CHILD_EXTENSION) +
1222 
1223  ChildExtension->Common.Fdo = FALSE;
1224  ChildExtension->ChildId = i;
1225  ChildExtension->PhysicalDeviceObject = ChildDeviceObject;
1226  ChildExtension->DriverObject = DeviceExtension->DriverObject;
1227 
1228  /* Setup the ChildEnumInfo */
1229  ChildEnumInfo.Size = sizeof(ChildEnumInfo);
1230  ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor);
1231  ChildEnumInfo.ACPIHwId = 0;
1232 
1234  ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension);
1235  else
1236  ChildEnumInfo.ChildHwDeviceExtension = NULL;
1237 
1238  ChildEnumInfo.ChildIndex = ChildExtension->ChildId;
1239 
1240  INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex);
1242  HwDeviceExtension,
1243  &ChildEnumInfo,
1244  &ChildExtension->ChildType,
1245  ChildExtension->ChildDescriptor,
1246  &ChildExtension->ChildId,
1247  &Unused);
1249  {
1250  if (ChildExtension->ChildType == Monitor)
1251  {
1252  // Check if the EDID is valid
1253  if (ChildExtension->ChildDescriptor[0] == 0x00 &&
1254  ChildExtension->ChildDescriptor[1] == 0xFF &&
1255  ChildExtension->ChildDescriptor[2] == 0xFF &&
1256  ChildExtension->ChildDescriptor[3] == 0xFF &&
1257  ChildExtension->ChildDescriptor[4] == 0xFF &&
1258  ChildExtension->ChildDescriptor[5] == 0xFF &&
1259  ChildExtension->ChildDescriptor[6] == 0xFF &&
1260  ChildExtension->ChildDescriptor[7] == 0x00)
1261  {
1262  if (bHaveLastMonitorID)
1263  {
1264  // Compare the previous monitor ID with the current one, break the loop if they are identical
1265  if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID))
1266  {
1267  INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n");
1268  IoDeleteDevice(ChildDeviceObject);
1269  break;
1270  }
1271  }
1272 
1273  // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor
1274  RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID));
1275  bHaveLastMonitorID = TRUE;
1276 
1277  /* Mark it valid */
1278  ChildExtension->EdidValid = TRUE;
1279  }
1280  else
1281  {
1282  /* Mark it invalid */
1283  ChildExtension->EdidValid = FALSE;
1284  }
1285  }
1286  }
1287  else if (Status == VIDEO_ENUM_INVALID_DEVICE)
1288  {
1289  WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex);
1290  IoDeleteDevice(ChildDeviceObject);
1291  continue;
1292  }
1293  else if (Status == VIDEO_ENUM_NO_MORE_DEVICES)
1294  {
1295  INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1);
1296  IoDeleteDevice(ChildDeviceObject);
1297  break;
1298  }
1299  else
1300  {
1301  WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status);
1302  IoDeleteDevice(ChildDeviceObject);
1303  break;
1304  }
1305 
1306  if (ChildExtension->ChildType == Monitor)
1307  {
1308  UINT j;
1309  PUCHAR p = ChildExtension->ChildDescriptor;
1310  INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId);
1311  for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8)
1312  {
1313  INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
1314  p[j + 0], p[j + 1], p[j + 2], p[j + 3],
1315  p[j + 4], p[j + 5], p[j + 6], p[j + 7]);
1316  }
1317  }
1318  else if (ChildExtension->ChildType == Other)
1319  {
1320  INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor);
1321  }
1322  else
1323  {
1324  ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType);
1325  }
1326 
1327  /* Clear the init flag */
1328  ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
1329 
1330  InsertTailList(&DeviceExtension->ChildDeviceList,
1331  &ChildExtension->ListEntry);
1332  }
1333 
1334  /* Trigger reenumeration by the PnP manager */
1336 
1337  return NO_ERROR;
1338 }
#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 VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define InsertTailList(ListHead, Entry)
#define NO_ERROR
Definition: dderror.h:5
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define FILE_DEVICE_CONTROLLER
Definition: winioctl.h:110
#define FALSE
Definition: types.h:117
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
#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
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
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:2342
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
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 IntVideoPortFindAdapter(), and VBEInitialize().

◆ VideoPortGetAssociatedDeviceExtension()

PVOID NTAPI VideoPortGetAssociatedDeviceExtension ( IN PVOID  DeviceObject)

Definition at line 1411 of file videoprt.c.

1413 {
1414  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1415 
1416  TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n");
1417  DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
1418  if (!DeviceExtension)
1419  return NULL;
1420  return DeviceExtension->MiniPortDeviceExtension;
1421 }
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 883 of file videoprt.c.

884 {
885  return KeGetCurrentIrql();
886 }
#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 924 of file videoprt.c.

930 {
933  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
935 
936  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
937 
938  TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n",
939  ParameterName, &DeviceExtension->RegistryPath);
940 
941  Context.HwDeviceExtension = HwDeviceExtension;
942  Context.HwContext = HwContext;
943  Context.HwGetRegistryRoutine = GetRegistryRoutine;
944 
948 
950  DeviceExtension->RegistryPath.Buffer,
951  QueryTable,
952  &Context,
953  NULL);
954  if (!NT_SUCCESS(Status))
955  {
956  WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the "
957  "requested parameter\n");
959  }
960 
961  if (IsParameterFileName)
962  {
963  /* FIXME: need to read the contents of the file */
965  }
966 
967  return NO_ERROR;
968 }
#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:898
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 1034 of file videoprt.c.

1039 {
1040  static PVOID RomImageBuffer = NULL;
1041  PKPROCESS CallingProcess;
1043 
1044  TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n",
1045  HwDeviceExtension, Length);
1046 
1047  /* If the length is zero then free the existing buffer. */
1048  if (Length == 0)
1049  {
1050  if (RomImageBuffer != NULL)
1051  {
1052  ExFreePool(RomImageBuffer);
1053  RomImageBuffer = NULL;
1054  }
1055  return NULL;
1056  }
1057  else
1058  {
1059  /*
1060  * The DDK says we shouldn't use the legacy C0000 method but get the
1061  * rom base address from the corresponding pci or acpi register but
1062  * lets ignore that and use C0000 anyway. We have already mapped the
1063  * bios area into memory so we'll copy from there.
1064  */
1065 
1066  /* Copy the bios. */
1067  Length = min(Length, 0x10000);
1068  if (RomImageBuffer != NULL)
1069  {
1070  ExFreePool(RomImageBuffer);
1071  }
1072 
1073  RomImageBuffer = ExAllocatePool(PagedPool, Length);
1074  if (RomImageBuffer == NULL)
1075  {
1076  return NULL;
1077  }
1078 
1079  IntAttachToCSRSS(&CallingProcess, &ApcState);
1080  RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length);
1081  IntDetachFromCSRSS(&CallingProcess, &ApcState);
1082 
1083  return RomImageBuffer;
1084  }
1085 }
KAPC_STATE
Definition: ketypes.h:1280
_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:493
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1679
#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:506
#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 1428 of file videoprt.c.

1431 {
1433 
1434  Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
1435  if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO))
1436  {
1437 #if 1
1439  {
1440  VpOsVersionInfo->MajorVersion = Version.dwMajorVersion;
1441  VpOsVersionInfo->MinorVersion = Version.dwMinorVersion;
1442  VpOsVersionInfo->BuildNumber = Version.dwBuildNumber;
1443  VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor;
1444  VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor;
1445  return NO_ERROR;
1446  }
1447  return ERROR_INVALID_PARAMETER;
1448 #else
1449  VpOsVersionInfo->MajorVersion = 5;
1450  VpOsVersionInfo->MinorVersion = 0;
1451  VpOsVersionInfo->BuildNumber = 2195;
1452  VpOsVersionInfo->ServicePackMajor = 4;
1453  VpOsVersionInfo->ServicePackMinor = 0;
1454  return NO_ERROR;
1455 #endif
1456  }
1457 
1458  return ERROR_INVALID_PARAMETER;
1459 }
#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 1006 of file videoprt.c.

1009 {
1010  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1011 
1012  TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n");
1013 
1014  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1016  {
1017  if (DeviceExtension->AdapterInterfaceType == PCIBus)
1018  {
1019  /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */
1020  /* Assumed for now */
1021  *VgaStatus = 1;
1022  return NO_ERROR;
1023  }
1024  }
1025 
1026  return ERROR_INVALID_FUNCTION;
1027 }
#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 642 of file videoprt.c.

647 {
652  BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE;
653  static BOOLEAN FirstInitialization;
654 
655  TRACE_(VIDEOPRT, "VideoPortInitialize\n");
656 
657  if (!FirstInitialization)
658  {
659  FirstInitialization = TRUE;
663  }
664 
665  /* As a first thing do parameter checks. */
666  if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA))
667  {
668  ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
670  }
671 
672  if ((HwInitializationData->HwFindAdapter == NULL) ||
673  (HwInitializationData->HwInitialize == NULL) ||
674  (HwInitializationData->HwStartIO == NULL))
675  {
676  ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
678  }
679 
680  switch (HwInitializationData->HwInitDataSize)
681  {
682  /*
683  * NT4 drivers are special case, because we must use legacy method
684  * of detection instead of the Plug & Play one.
685  */
687  INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n");
688  break;
689 
691  INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n");
692  break;
693 
694  case sizeof(VIDEO_HW_INITIALIZATION_DATA):
695  INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n");
696  break;
697 
698  default:
699  ERR_(VIDEOPRT, "Invalid HwInitializationData size.\n");
700  return STATUS_UNSUCCESSFUL;
701  }
702 
703  /* Set dispatching routines */
706  DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
708  DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =
710  DriverObject->DriverUnload = IntVideoPortUnload;
711 
712  /* Determine type of the miniport driver */
713  if ((HwInitializationData->HwInitDataSize >=
714  FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) &&
715  (HwInitializationData->HwSetPowerState != NULL) &&
716  (HwInitializationData->HwGetPowerState != NULL) &&
717  (HwInitializationData->HwGetVideoChildDescriptor != NULL))
718  {
719  INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n");
720  PnpDriver = TRUE;
721  }
722 
723  /* Check if legacy detection should be applied */
724  if (!PnpDriver || HwContext)
725  {
726  INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n",
727  HwInitializationData->AdapterInterfaceType);
728 
729  /* FIXME: Move the code for legacy detection
730  to another function and call it here */
731  LegacyDetection = TRUE;
732  }
733 
734  /*
735  * NOTE:
736  * The driver extension can be already allocated in case that we were
737  * called by legacy driver and failed detecting device. Some miniport
738  * drivers in that case adjust parameters and call VideoPortInitialize
739  * again.
740  */
742  if (DriverExtension == NULL)
743  {
745  DriverObject,
747  (PVOID *)&DriverExtension);
748  if (!NT_SUCCESS(Status))
749  {
750  ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status);
751  return Status;
752  }
753 
754  /*
755  * Save the registry path. This should be done only once even if
756  * VideoPortInitialize is called multiple times.
757  */
758  if (RegistryPath->Length != 0)
759  {
760  DriverExtension->RegistryPath.Length = 0;
761  DriverExtension->RegistryPath.MaximumLength =
762  RegistryPath->Length + sizeof(UNICODE_NULL);
763  DriverExtension->RegistryPath.Buffer =
765  PagedPool,
766  DriverExtension->RegistryPath.MaximumLength,
767  'RTSU');
768  if (DriverExtension->RegistryPath.Buffer == NULL)
769  {
770  RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
772  }
773 
775  INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath);
776  }
777  else
778  {
779  RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
780  }
781  }
782 
783  /* Copy the correct miniport initialization data to the device extension. */
784  RtlCopyMemory(&DriverExtension->InitializationData,
786  HwInitializationData->HwInitDataSize);
787  if (HwInitializationData->HwInitDataSize <
789  {
790  RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData +
791  HwInitializationData->HwInitDataSize),
793  HwInitializationData->HwInitDataSize);
794  }
795  DriverExtension->HwContext = HwContext;
796 
797  /*
798  * Plug & Play drivers registers the device in AddDevice routine.
799  * For legacy drivers we must do it now.
800  */
801  if (LegacyDetection)
802  {
804 
806  {
807  /* Power management */
809  }
810 
813  NULL,
814  DriverExtension->InitializationData.StartingDeviceNumber,
815  0,
816  &DeviceObject);
817  if (!NT_SUCCESS(Status))
818  {
819  ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status);
820  return Status;
821  }
822 
824  if (!NT_SUCCESS(Status))
825  ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status);
826 
827  return Status;
828  }
829  else
830  {
831  DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice;
835 
836  return STATUS_SUCCESS;
837  }
838 }
VOID FASTCALL IntLoadRegistryParameters(VOID)
Definition: videoprt.c:518
NTSTATUS NTAPI IntVideoPortFindAdapter(IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
Definition: videoprt.c:341
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:325
NTSTATUS NTAPI IntVideoPortDispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1119
#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:1799
#define IRP_MJ_SHUTDOWN
#define TRUE
Definition: types.h:120
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#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:41
NTSTATUS NTAPI IntVideoPortDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:718
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 FALSE
Definition: types.h:117
#define UNICODE_NULL
VOID NTAPI IntVideoPortUnload(PDRIVER_OBJECT DriverObject)
Definition: dispatch.c:1175
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:238
unsigned char BOOLEAN
struct _VIDEO_HW_INITIALIZATION_DATA VIDEO_HW_INITIALIZATION_DATA
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:42
NTSTATUS NTAPI IntVideoPortDispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:433
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:152
_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:1153
#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:1877
#define IRP_MJ_SYSTEM_CONTROL
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT _In_ PTDI_PNP_CONTEXT Context2
Definition: tdikrnl.h:1094
_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:1087
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 1616 of file videoprt.c.

1617 {
1618  return VpNoVesa;
1619 }
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 864 of file videoprt.c.

869 {
871 
872  INFO_(VIDEOPRT, "VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n",
873  ErrorCode, ErrorCode, UniqueId, UniqueId);
874  if (Vrp)
875  INFO_(VIDEOPRT, "Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode);
876 }
_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 1542 of file videoprt.c.

1545 {
1547 
1548  TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n");
1549  Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency);
1550  return Result.QuadPart;
1551 }
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 1395 of file videoprt.c.

1399 {
1400  return KeInsertQueueDpc(
1401  &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject,
1403  (PVOID)Context);
1404 }
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 1527 of file videoprt.c.

1532 {
1533  UNIMPLEMENTED;
1534  return NO_ERROR;
1535 }
#define NO_ERROR
Definition: dderror.h:5
#define UNIMPLEMENTED
Definition: debug.h:115

◆ VideoPortReleaseDeviceLock()

VOID NTAPI VideoPortReleaseDeviceLock ( IN PVOID  HwDeviceExtension)

Definition at line 1574 of file videoprt.c.

1576 {
1577  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1578 
1579  TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n");
1580  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1581  KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE);
1582  //ASSERT(Status == STATUS_SUCCESS);
1583 }
#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 1092 of file videoprt.c.

1097 {
1098  SIZE_T StringLength;
1099  BOOLEAN Found;
1100  PUCHAR SearchLocation;
1101 
1102  TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String);
1103 
1104  StringLength = strlen((PCHAR)String);
1105  Found = FALSE;
1106  for (SearchLocation = RomBase;
1107  !Found && SearchLocation < RomBase + RomLength - StringLength;
1108  SearchLocation++)
1109  {
1110  Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength);
1111  if (Found)
1112  {
1113  INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation);
1114  }
1115  }
1116 
1117  return Found;
1118 }
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 975 of file videoprt.c.

980 {
981  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
983 
984  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
985  TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n",
986  ValueName,
987  &DeviceExtension->RegistryPath);
990  DeviceExtension->RegistryPath.Buffer,
991  ValueName,
992  REG_BINARY,
993  ValueData,
994  ValueLength);
995  if (Status != NO_ERROR)
996  WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status);
997 
998  return Status;
999 }
#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 1125 of file videoprt.c.

1130 {
1131  BOOLEAN Ret;
1132  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1133  KIRQL OldIrql;
1134 
1135  switch (Priority)
1136  {
1137  case VpLowPriority:
1138  Ret = (*SynchronizeRoutine)(Context);
1139  break;
1140 
1141  case VpMediumPriority:
1142  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1143  if (DeviceExtension->InterruptObject == NULL)
1144  Ret = (*SynchronizeRoutine)(Context);
1145  else
1146  Ret = KeSynchronizeExecution(
1147  DeviceExtension->InterruptObject,
1149  Context);
1150  break;
1151 
1152  case VpHighPriority:
1154  if (OldIrql < SYNCH_LEVEL)
1156 
1157  Ret = (*SynchronizeRoutine)(Context);
1158 
1159  if (OldIrql < SYNCH_LEVEL)
1161  break;
1162 
1163  default:
1164  Ret = FALSE;
1165  }
1166 
1167  return Ret;
1168 }
#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
KIRQL OldIrql
Definition: mm.h:1502
_In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
Definition: kefuncs.h:536
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
Definition: wdfinterrupt.h:651
#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 1590 of file videoprt.c.

1593 {
1594  UNIMPLEMENTED;
1595 }
#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 41 of file videoprt.c.

Referenced by IntInt10CallBios(), and VideoPortInitialize().

◆ VideoPortMaxObjectNumber

ULONG VideoPortMaxObjectNumber = -1
static

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