ReactOS 0.4.16-dev-1946-g52006dd
videoprt.c
Go to the documentation of this file.
1/*
2 * VideoPort driver
3 *
4 * Copyright (C) 2002-2004, 2007 ReactOS Team
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 */
21
22#include "videoprt.h"
23
24#include <stdio.h>
25#include <ndk/exfuncs.h>
26#include <ndk/obfuncs.h>
27#include <ndk/rtlfuncs.h>
28
29#define NDEBUG
30#include <debug.h>
31
32/* GLOBAL VARIABLES ***********************************************************/
33
35
38
42
45
46/* PRIVATE FUNCTIONS **********************************************************/
47
53{
54 return STATUS_SUCCESS;
55}
56
57static
60 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
61{
63 WCHAR DeviceBuffer[20];
65 WCHAR SymlinkBuffer[20];
66 UNICODE_STRING SymlinkName;
69
70 /* Create a unicode device name. */
71 DeviceNumber = DeviceExtension->DeviceNumber;
72 swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
73
75 RegistryPath = &DeviceExtension->NewRegistryPath;
76 else
77 RegistryPath = &DeviceExtension->RegistryPath;
78
79 /* Add entry to DEVICEMAP\VIDEO key in registry. */
81 L"VIDEO",
82 DeviceBuffer,
83 REG_SZ,
84 RegistryPath->Buffer,
85 RegistryPath->Length + sizeof(UNICODE_NULL));
86 if (!NT_SUCCESS(Status))
87 {
88 ERR_(VIDEOPRT, "Failed to create DEVICEMAP registry entry: 0x%X\n", Status);
89 return Status;
90 }
91
93 L"VIDEO",
94 L"MaxObjectNumber",
97 sizeof(DeviceNumber));
98 if (!NT_SUCCESS(Status))
99 {
100 ERR_(VIDEOPRT, "Failed to write MaxObjectNumber: 0x%X\n", Status);
101 return Status;
102 }
103
104 /* Create symbolic link "\??\DISPLAYx" */
105 swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
106 RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
107 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
108 Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
109 if (!NT_SUCCESS(Status))
110 {
111 ERR_(VIDEOPRT, "Failed to create symbolic link: 0x%X\n", Status);
112 return Status;
113 }
114
115 /* Update MaxObjectNumber */
117
118 return STATUS_SUCCESS;
119}
120
121PVOID
122NTAPI
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}
143
144VOID
145NTAPI
147 IN PKDPC Dpc,
151{
152 PVOID HwDeviceExtension =
153 &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension;
155}
156
158NTAPI
163 _In_ USHORT AdapterNumber,
164 _In_ USHORT DisplayNumber,
166{
167 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
169 ULONG PciSlotNumber;
171 ULONG Size;
173 WCHAR DeviceBuffer[20];
175 PDEVICE_OBJECT DeviceObject_;
176
177 if (DeviceObject == NULL)
178 DeviceObject = &DeviceObject_;
179
180 /*
181 * Find the first free device number that can be used for video device
182 * object names and symlinks.
183 */
185 if (DeviceNumber == (ULONG)-1)
186 {
187 WARN_(VIDEOPRT, "Can't find free device number\n");
188 return STATUS_UNSUCCESSFUL;
189 }
190
191 /*
192 * Create the device object.
193 */
194
195 /* Create a unicode device name. */
196 swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
197 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
198
199 INFO_(VIDEOPRT, "HwDeviceExtension size is: 0x%x\n",
200 DriverExtension->InitializationData.HwDeviceExtensionSize);
201
202 /* Create the device object. */
204 DriverExtension->InitializationData.HwDeviceExtensionSize;
206 Size,
207 &DeviceName,
209 0,
210 TRUE,
212
213 if (!NT_SUCCESS(Status))
214 {
215 WARN_(VIDEOPRT, "IoCreateDevice call failed with status 0x%08x\n", Status);
216 return Status;
217 }
218
219 /*
220 * Set the buffering strategy here. If you change this, remember
221 * to change VidDispatchDeviceControl too.
222 */
223
224 (*DeviceObject)->Flags |= DO_BUFFERED_IO;
225
226 /* Initialize device extension. */
227 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)((*DeviceObject)->DeviceExtension);
228 DeviceExtension->Common.Fdo = TRUE;
229 DeviceExtension->DeviceNumber = DeviceNumber;
230 DeviceExtension->DriverObject = DriverObject;
232 DeviceExtension->FunctionalDeviceObject = *DeviceObject;
233 DeviceExtension->DriverExtension = DriverExtension;
234 DeviceExtension->SessionId = -1;
235 DeviceExtension->AdapterNumber = AdapterNumber;
236 DeviceExtension->DisplayNumber = DisplayNumber;
237
238 InitializeListHead(&DeviceExtension->ChildDeviceList);
239
240 /* Get the registry path associated with this device. */
242 DeviceExtension->AdapterNumber,
243 &DeviceExtension->RegistryPath);
244 if (!NT_SUCCESS(Status))
245 {
246 WARN_(VIDEOPRT, "IntCreateRegistryPath() call failed with status 0x%08x\n", Status);
247 goto Failure;
248 }
249
251 {
252 /* Get bus number from the upper level bus driver. */
253 Size = sizeof(ULONG);
256 Size,
257 &DeviceExtension->SystemIoBusNumber,
258 &Size);
259 if (!NT_SUCCESS(Status))
260 {
261 WARN_(VIDEOPRT, "Couldn't get an information from bus driver. We will try to\n"
262 "use legacy detection method, but even that doesn't mean that\n"
263 "it will work.\n");
264 DeviceExtension->PhysicalDeviceObject = NULL;
265 }
266 }
267
268 DeviceExtension->AdapterInterfaceType =
269 DriverExtension->InitializationData.AdapterInterfaceType;
270
272 {
273 /* Get bus type from the upper level bus driver. */
274 Size = sizeof(ULONG);
277 Size,
278 &DeviceExtension->AdapterInterfaceType,
279 &Size);
280
281 /* Get bus device address from the upper level bus driver. */
282 Size = sizeof(ULONG);
285 Size,
286 &PciSlotNumber,
287 &Size);
288
289 /* Convert slotnumber to PCI_SLOT_NUMBER */
290 SlotNumber.u.AsULONG = 0;
291 SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF;
292 SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF;
293 DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG;
294 }
295
297 InitializeListHead(&DeviceExtension->DmaAdapterList);
298
299 KeInitializeDpc(&DeviceExtension->DpcObject,
301 DeviceExtension);
302
303 KeInitializeMutex(&DeviceExtension->DeviceLock, 0);
304
305 /* Attach the device. */
306 if ((PhysicalDeviceObject != NULL) && (DisplayNumber == 0))
310
311 Status = IntCreateNewRegistryPath(DeviceExtension);
312 if (!NT_SUCCESS(Status))
313 {
314 ERR_(VIDEOPRT, "IntCreateNewRegistryPath() failed with status 0x%08x\n", Status);
315 goto Failure;
316 }
317
318 IntSetupDeviceSettingsKey(DeviceExtension);
319
320 /* Remove the initializing flag */
321 (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
322
323 /* Set up the VIDEO/DEVICEMAP registry keys */
324 Status = IntVideoPortAddDeviceMapLink(DeviceExtension);
325 if (!NT_SUCCESS(Status))
326 {
327 ERR_(VIDEOPRT, "IntVideoPortAddDeviceMapLink() failed with status 0x%08x\n", Status);
328 goto Failure;
329 }
330
331 if (DisplayNumber == 0)
332 {
333 DriverExtension->InitializationData.StartingDeviceNumber++;
334 }
335
336 return STATUS_SUCCESS;
337
338Failure:
339 if (DeviceExtension->NextDeviceObject)
340 IoDetachDevice(DeviceExtension->NextDeviceObject);
343 return Status;
344}
345
351static NTSTATUS
352NTAPI
355 _In_ PUNICODE_STRING PathName,
359 _In_ CONFIGURATION_TYPE ControllerType,
360 _In_ ULONG ControllerNumber,
361 _In_ PKEY_VALUE_FULL_INFORMATION* ControllerInformation,
362 _In_ CONFIGURATION_TYPE PeripheralType,
363 _In_ ULONG PeripheralNumber,
364 _In_ PKEY_VALUE_FULL_INFORMATION* PeripheralInformation)
365{
367 UNREFERENCED_PARAMETER(PathName);
371 UNREFERENCED_PARAMETER(ControllerType);
372 UNREFERENCED_PARAMETER(ControllerNumber);
373 UNREFERENCED_PARAMETER(ControllerInformation);
374 UNREFERENCED_PARAMETER(PeripheralType);
375 UNREFERENCED_PARAMETER(PeripheralNumber);
376 UNREFERENCED_PARAMETER(PeripheralInformation);
377
378 /* The bus has been found */
379 return STATUS_SUCCESS;
380}
381
386static NTSTATUS
388 _In_ INTERFACE_TYPE AdapterInterfaceType,
390{
391 // TODO: Forward-compatibility with Windows 7+:
392 // In case AdapterInterfaceType == PCIBus, check for the
393 // \Registry\HARDWARE\DESCRIPTION\System\VideoAdapterBusses
394 // key (created by pci.sys) that enumerates the PCI buses that
395 // are known to have video display adapters on them.
396 // This is a handy shortcut for videoprt, that would otherwise
397 // have to enumerate all the PCI buses (PCI_MAX_BRIDGE_NUMBER)
398 // to locate any video adapter.
399 // Otherwise, fall back to the usual method done below.
400
401 /* Find the next bus of the given type */
402 return IoQueryDeviceDescription(&AdapterInterfaceType,
403 BusNumber,
404 NULL,
405 NULL,
406 NULL,
407 NULL,
409 NULL);
410}
411
413NTAPI
418{
419 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
421 VP_STATUS vpStatus;
422 VIDEO_PORT_CONFIG_INFO ConfigInfo;
424 UCHAR Again = FALSE;
425 BOOL LegacyDetection = FALSE;
426
427 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
428
429 /* Setup a ConfigInfo structure that we will pass to HwFindAdapter. */
430 RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO));
431 ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO);
432 ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType;
433 if (ConfigInfo.AdapterInterfaceType == PCIBus)
434 ConfigInfo.InterruptMode = LevelSensitive;
435 else
436 ConfigInfo.InterruptMode = Latched;
437 ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer;
439 ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
440 ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel;
441 ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector;
442
445 sizeof(SystemBasicInfo),
446 NULL);
447 if (NT_SUCCESS(Status))
448 {
451 }
452
453 // FIXME: Check the adapter key and update VideoDebugLevel variable.
454
455 /*
456 * Call miniport HwVidFindAdapter entry point to detect if
457 * particular device is present. There are two possible code
458 * paths. The first one is for Legacy drivers (NT4) and cases
459 * when we don't have information about what bus we're on. The
460 * second case is the standard one for Plug & Play drivers.
461 */
462 if (DeviceExtension->PhysicalDeviceObject == NULL)
463 {
464 LegacyDetection = TRUE;
465 }
466
467 if (LegacyDetection)
468 {
470
471 /* Suppose first we may not find any suitable device */
472 vpStatus = ERROR_DEV_NOT_EXIST; // ERROR_NO_MORE_DEVICES;
473
474 /* Enumerate all buses of the given type, call HwFindAdapter for each
475 * to find whether a video adapter is recognized there. Stop when an
476 * adapter has been found. */
477 for (BusNumber = 0;
478 (BusNumber < MAXULONG) &&
480 &BusNumber));
481 ++BusNumber)
482 {
483 DPRINT("Bus Type %lu, Number %lu\n",
484 DeviceExtension->AdapterInterfaceType, BusNumber);
485
486 DeviceExtension->SystemIoBusNumber =
487 ConfigInfo.SystemIoBusNumber = BusNumber;
488
489 RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension,
490 DriverExtension->InitializationData.HwDeviceExtensionSize);
491
492 /* FIXME: Need to figure out what string to pass as param 3. */
493 // FIXME: Handle the 'Again' parameter for legacy detection.
494 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
495 &DeviceExtension->MiniPortDeviceExtension,
496 DriverExtension->HwContext,
497 NULL,
498 &ConfigInfo,
499 &Again);
500
501 if (vpStatus == ERROR_DEV_NOT_EXIST)
502 {
503 continue;
504 }
505 else
506 {
507 break;
508 }
509 }
510 }
511 else
512 {
513 /* FIXME: Need to figure out what string to pass as param 3. */
514 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
515 &DeviceExtension->MiniPortDeviceExtension,
516 DriverExtension->HwContext,
517 NULL,
518 &ConfigInfo,
519 &Again);
520 }
521
522 if (vpStatus != NO_ERROR)
523 {
524 ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", vpStatus);
526 goto Failure;
527 }
528
529 /*
530 * Now we know the device is present, so let's do all additional tasks
531 * such as creating symlinks or setting up interrupts and timer.
532 */
533
534 /* FIXME: Allocate hardware resources for device. */
535
536 /* Allocate interrupt for device. */
538 {
540 goto Failure;
541 }
542
543 /* Allocate timer for device. */
545 {
546 if (DeviceExtension->InterruptObject != NULL)
547 IoDisconnectInterrupt(DeviceExtension->InterruptObject);
548 ERR_(VIDEOPRT, "IntVideoPortSetupTimer failed\n");
550 goto Failure;
551 }
552
553 /* If the device can be reset, insert it in the list of resettable adapters */
554 InitializeListHead(&DeviceExtension->HwResetListEntry);
555 if (DriverExtension->InitializationData.HwResetHw != NULL)
556 {
558 &DeviceExtension->HwResetListEntry,
560 }
561
562 INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
563 return STATUS_SUCCESS;
564
565Failure:
566 RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
567 if (DeviceExtension->NextDeviceObject)
568 IoDetachDevice(DeviceExtension->NextDeviceObject);
570 return Status;
571}
572
590 _Outptr_ PKPROCESS* CallingProcess,
592{
593 if (!CsrProcess)
594 return FALSE;
595
596 *CallingProcess = (PKPROCESS)PsGetCurrentProcess();
597 if (*CallingProcess != CsrProcess)
599 return TRUE;
600}
601
614VOID
617 _In_ PKPROCESS CallingProcess,
619{
621 if (CallingProcess != CsrProcess)
623}
624
625VOID
628{
631 UNICODE_STRING KeyPath;
632 UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions");
636
637 /* Check if we need to use new registry */
638 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\UseNewKey");
640 &KeyPath,
642 NULL,
643 NULL);
644 Status = ZwOpenKey(&KeyHandle,
647 if (NT_SUCCESS(Status))
648 {
651 }
652
653#ifdef _M_IX86
654 /* Check whether we need to use the 32-bit x86 emulator instead of V86 mode */
655 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\DisableEmulator");
657 &KeyPath,
659 NULL,
660 NULL);
661 Status = ZwOpenKey(&KeyHandle,
664 if (NT_SUCCESS(Status))
665 {
666 VideoPortDisableX86Emulator = TRUE;
668 }
669 DPRINT1("Using %s\n", VideoPortDisableX86Emulator ? "V86 mode" : "x86 emulator");
670#endif // _M_IX86
671
672 /* Initialize object attributes with the path we want */
673 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control");
675 &KeyPath,
677 NULL,
678 NULL);
679
680 /* Open the key */
681 Status = ZwOpenKey(&KeyHandle,
684 if (!NT_SUCCESS(Status))
685 {
686 VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status);
687 return;
688 }
689
690 /* Find out how large our buffer should be */
691 Status = ZwQueryValueKey(KeyHandle,
692 &ValueName,
694 NULL,
695 0,
696 &Length);
698 {
699 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
701 return;
702 }
703
704 /* Allocate it */
706 if (!KeyInfo)
707 {
708 VideoPortDebugPrint(Error, "Out of memory\n");
710 return;
711 }
712
713 /* Now for real this time */
714 Status = ZwQueryValueKey(KeyHandle,
715 &ValueName,
717 KeyInfo,
718 Length,
719 &NewLength);
721
722 if (!NT_SUCCESS(Status))
723 {
724 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
726 return;
727 }
728
729 /* Sanity check */
730 if (KeyInfo->Type != REG_SZ)
731 {
732 VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n");
734 return;
735 }
736
737 /* Check if BASEVIDEO or NOVESA is present in the start options */
738 if (wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO"))
740 if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA"))
741 VpNoVesa = TRUE;
742
744
745 /* FIXME: Old ReactOS-compatibility... */
747
748 if (VpNoVesa)
749 VideoPortDebugPrint(Info, "VESA mode disabled\n");
750 else
751 VideoPortDebugPrint(Info, "VESA mode enabled\n");
752
753 /* If we are in BASEVIDEO, create the volatile registry key for Win32k */
754 if (VpBaseVideo)
755 {
756 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\BaseVideo");
758 &KeyPath,
760 NULL,
761 NULL);
762
763 Status = ZwCreateKey(&KeyHandle,
764 READ_CONTROL, // Non-0 placeholder: no use for this handle.
766 0,
767 NULL,
769 NULL);
770 if (NT_SUCCESS(Status))
772 else
773 ERR_(VIDEOPRT, "Failed to create the BaseVideo key (0x%x)\n", Status);
774 }
775
776 return;
777}
778
779/* PUBLIC FUNCTIONS ***********************************************************/
780
781/*
782 * @implemented
783 */
784ULONG
785NTAPI
791{
796 BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE;
797 static BOOLEAN FirstInitialization;
798
799 TRACE_(VIDEOPRT, "VideoPortInitialize\n");
800
801 if (!FirstInitialization)
802 {
803 FirstInitialization = TRUE;
807 }
808
809 /* As a first thing do parameter checks. */
810 if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA))
811 {
812 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
814 }
815
816 if ((HwInitializationData->HwFindAdapter == NULL) ||
817 (HwInitializationData->HwInitialize == NULL) ||
818 (HwInitializationData->HwStartIO == NULL))
819 {
820 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
822 }
823
824 switch (HwInitializationData->HwInitDataSize)
825 {
826 /*
827 * NT4 drivers are special case, because we must use legacy method
828 * of detection instead of the Plug & Play one.
829 */
831 INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n");
832 break;
833
835 INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n");
836 break;
837
838 case sizeof(VIDEO_HW_INITIALIZATION_DATA):
839 INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n");
840 break;
841
842 default:
843 ERR_(VIDEOPRT, "Invalid HwInitializationData size %lu (expected %lu, %lu or %lu)\n",
844 HwInitializationData->HwInitDataSize,
848 return STATUS_UNSUCCESSFUL;
849 }
850
851 /* Set dispatching routines */
854 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
856 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =
858 DriverObject->DriverUnload = IntVideoPortUnload;
859
860 /* Determine type of the miniport driver */
861 if ((HwInitializationData->HwInitDataSize >=
862 FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) &&
863 (HwInitializationData->HwSetPowerState != NULL) &&
864 (HwInitializationData->HwGetPowerState != NULL) &&
865 (HwInitializationData->HwGetVideoChildDescriptor != NULL))
866 {
867 INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n");
868 PnpDriver = TRUE;
869 }
870
871 /* Check if legacy detection should be applied */
872 if (!PnpDriver || HwContext)
873 {
874 INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n",
875 HwInitializationData->AdapterInterfaceType);
876
877 /* FIXME: Move the code for legacy detection
878 to another function and call it here */
879 LegacyDetection = TRUE;
880 }
881
882 /*
883 * NOTE:
884 * The driver extension can be already allocated in case that we were
885 * called by legacy driver and failed detecting device. Some miniport
886 * drivers in that case adjust parameters and call VideoPortInitialize
887 * again.
888 */
890 if (DriverExtension == NULL)
891 {
896 if (!NT_SUCCESS(Status))
897 {
898 ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status);
899 return Status;
900 }
901
902 /*
903 * Save the registry path. This should be done only once even if
904 * VideoPortInitialize is called multiple times.
905 */
906 if (RegistryPath->Length != 0)
907 {
908 DriverExtension->RegistryPath.Length = 0;
909 DriverExtension->RegistryPath.MaximumLength =
910 RegistryPath->Length + sizeof(UNICODE_NULL);
911 DriverExtension->RegistryPath.Buffer =
913 PagedPool,
914 DriverExtension->RegistryPath.MaximumLength,
915 'RTSU');
916 if (DriverExtension->RegistryPath.Buffer == NULL)
917 {
920 }
921
923
924 /* There is a bug in Spice guest agent, which searches 'System' case-sensitively.
925 * Replace 'SYSTEM' by 'System' to fix that.
926 * Probably for similar reason, Windows also replaces 'MACHINE' by 'Machine'.
927 */
928 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\SYSTEM\\"), L"\\System\\", ARRAYSIZE(L"\\SYSTEM\\") - 1);
929 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\MACHINE\\"), L"\\Machine\\", ARRAYSIZE(L"\\MACHINE\\") - 1);
930
931 INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath);
932 }
933 else
934 {
936 }
937 }
938
939 /* Copy the correct miniport initialization data to the device extension. */
940 RtlCopyMemory(&DriverExtension->InitializationData,
942 HwInitializationData->HwInitDataSize);
943 if (HwInitializationData->HwInitDataSize <
945 {
946 RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData +
947 HwInitializationData->HwInitDataSize),
949 HwInitializationData->HwInitDataSize);
950 }
951 DriverExtension->HwContext = HwContext;
952
953 /*
954 * Plug & Play drivers registers the device in AddDevice routine.
955 * For legacy drivers we must do it now.
956 */
957 if (LegacyDetection)
958 {
960
962 {
963 /* Power management */
965 }
966
969 NULL,
970 DriverExtension->InitializationData.StartingDeviceNumber,
971 0,
972 &DeviceObject);
973 if (!NT_SUCCESS(Status))
974 {
975 ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status);
976 return Status;
977 }
978
980 if (!NT_SUCCESS(Status))
981 ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status);
982
983 return Status;
984 }
985 else
986 {
987 DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice;
991
992 return STATUS_SUCCESS;
993 }
994}
995
996/*
997 * @implemented
998 */
999VOID
1001 IN VIDEO_DEBUG_LEVEL DebugPrintLevel,
1002 IN PCHAR DebugMessage,
1003 ...)
1004{
1005 va_list ap;
1006
1007 if (VideoDebugLevel >= DebugPrintLevel)
1008 DebugPrintLevel = Error;
1009
1010 va_start(ap, DebugMessage);
1011 vDbgPrintEx(DPFLTR_IHVVIDEO_ID, DebugPrintLevel, DebugMessage, ap);
1012 va_end(ap);
1013}
1014
1015/*
1016 * @unimplemented
1017 */
1018VOID
1019NTAPI
1021 IN PVOID HwDeviceExtension,
1024 IN ULONG UniqueId)
1025{
1027
1028 INFO_(VIDEOPRT, "VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n",
1029 ErrorCode, ErrorCode, UniqueId, UniqueId);
1030 if (Vrp)
1031 INFO_(VIDEOPRT, "Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode);
1032}
1033
1034/*
1035 * @implemented
1036 */
1037UCHAR
1038NTAPI
1040{
1041 return KeGetCurrentIrql();
1042}
1043
1045{
1050
1051static
1053NTAPI
1061{
1063
1064 INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n",
1066 return (*(CallbackContext->HwGetRegistryRoutine))(
1067 CallbackContext->HwDeviceExtension,
1068 CallbackContext->HwContext,
1069 ValueName,
1070 ValueData,
1071 ValueLength);
1072}
1073
1074/*
1075 * @unimplemented
1076 */
1077
1079NTAPI
1081 IN PVOID HwDeviceExtension,
1083 IN UCHAR IsParameterFileName,
1084 IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine,
1086{
1089 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1091
1092 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1093
1094 TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1095 ParameterName, &DeviceExtension->RegistryPath);
1096
1097 Context.HwDeviceExtension = HwDeviceExtension;
1098 Context.HwContext = HwContext;
1099 Context.HwGetRegistryRoutine = GetRegistryRoutine;
1100
1104
1106 DeviceExtension->RegistryPath.Buffer,
1107 QueryTable,
1108 &Context,
1109 NULL);
1110 if (!NT_SUCCESS(Status))
1111 {
1112 WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the "
1113 "requested parameter\n");
1115 }
1116
1117 if (IsParameterFileName)
1118 {
1119 /* FIXME: need to read the contents of the file */
1121 }
1122
1123 return NO_ERROR;
1124}
1125
1126/*
1127 * @implemented
1128 */
1130NTAPI
1132 IN PVOID HwDeviceExtension,
1136{
1137 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1139
1140 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1141 TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1142 ValueName,
1143 &DeviceExtension->RegistryPath);
1146 DeviceExtension->RegistryPath.Buffer,
1147 ValueName,
1148 REG_BINARY,
1149 ValueData,
1150 ValueLength);
1151 if (Status != NO_ERROR)
1152 WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status);
1153
1154 return Status;
1155}
1156
1157/*
1158 * @implemented
1159 */
1161NTAPI
1163 IN PVOID HwDeviceExtension,
1164 OUT PULONG VgaStatus)
1165{
1166 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1167
1168 TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n");
1169
1170 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1172 {
1173 if (DeviceExtension->AdapterInterfaceType == PCIBus)
1174 {
1175 /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */
1176 /* Assumed for now */
1177 *VgaStatus = 1;
1178 return NO_ERROR;
1179 }
1180 }
1181
1183}
1184
1185/*
1186 * @implemented
1187 */
1188PVOID
1189NTAPI
1191 IN PVOID HwDeviceExtension,
1192 IN PVOID Unused1,
1193 IN ULONG Unused2,
1194 IN ULONG Length)
1195{
1196 static PVOID RomImageBuffer = NULL;
1197 PKPROCESS CallingProcess;
1199
1200 TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n",
1201 HwDeviceExtension, Length);
1202
1203 /* If the length is zero then free the existing buffer */
1204 if (Length == 0)
1205 {
1206 if (RomImageBuffer != NULL)
1207 {
1208 ExFreePool(RomImageBuffer);
1209 RomImageBuffer = NULL;
1210 }
1211 return NULL;
1212 }
1213 else
1214 {
1215 /*
1216 * The DDK says we shouldn't use the legacy C0000 method but get the
1217 * ROM base address from the corresponding PCI or ACPI register but
1218 * lets ignore that and use C0000 anyway. We have already mapped the
1219 * BIOS area into memory so we'll copy from there.
1220 */
1221
1222 /* Copy the BIOS */
1223 Length = min(Length, 0x10000);
1224 if (RomImageBuffer != NULL)
1225 ExFreePool(RomImageBuffer);
1226
1227 RomImageBuffer = ExAllocatePool(PagedPool, Length);
1228 if (RomImageBuffer == NULL)
1229 return NULL;
1230
1231 /* Perform the copy in the CSRSS context */
1232 if (IntAttachToCSRSS(&CallingProcess, &ApcState))
1233 {
1234 RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length);
1235 IntDetachFromCSRSS(CallingProcess, &ApcState);
1236 }
1237 else
1238 {
1239 ExFreePool(RomImageBuffer);
1240 RomImageBuffer = NULL;
1241 }
1242 return RomImageBuffer;
1243 }
1244}
1245
1246/*
1247 * @implemented
1248 */
1249BOOLEAN
1250NTAPI
1252 IN PVOID HwDeviceExtension,
1253 IN PUCHAR RomBase,
1254 IN ULONG RomLength,
1256{
1257 SIZE_T StringLength;
1258 BOOLEAN Found;
1259 PUCHAR SearchLocation;
1260
1261 TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String);
1262
1263 StringLength = strlen((PCHAR)String);
1264 Found = FALSE;
1265 for (SearchLocation = RomBase;
1266 !Found && SearchLocation < RomBase + RomLength - StringLength;
1267 SearchLocation++)
1268 {
1269 Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength);
1270 if (Found)
1271 {
1272 INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation);
1273 }
1274 }
1275
1276 return Found;
1277}
1278
1279/*
1280 * @implemented
1281 */
1282BOOLEAN
1283NTAPI
1285 IN PVOID HwDeviceExtension,
1289{
1290 BOOLEAN Ret;
1291 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1292 KIRQL OldIrql;
1293
1294 switch (Priority)
1295 {
1296 case VpLowPriority:
1297 Ret = (*SynchronizeRoutine)(Context);
1298 break;
1299
1300 case VpMediumPriority:
1301 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1302 if (DeviceExtension->InterruptObject == NULL)
1303 Ret = (*SynchronizeRoutine)(Context);
1304 else
1306 DeviceExtension->InterruptObject,
1308 Context);
1309 break;
1310
1311 case VpHighPriority:
1313 if (OldIrql < SYNCH_LEVEL)
1315
1316 Ret = (*SynchronizeRoutine)(Context);
1317
1318 if (OldIrql < SYNCH_LEVEL)
1320 break;
1321
1322 default:
1323 Ret = FALSE;
1324 }
1325
1326 return Ret;
1327}
1328
1329/*
1330 * @implemented
1331 */
1335 IN PIRP Irp)
1336{
1337 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1338 ULONG Status;
1339 VIDEO_CHILD_ENUM_INFO ChildEnumInfo;
1340 BOOLEAN bHaveLastMonitorID = FALSE;
1341 UCHAR LastMonitorID[10];
1342 ULONG Unused;
1343 UINT i;
1344 PDEVICE_OBJECT ChildDeviceObject;
1345 PVIDEO_PORT_CHILD_EXTENSION ChildExtension;
1346
1347 INFO_(VIDEOPRT, "Starting child device probe\n");
1348 DeviceExtension = DeviceObject->DeviceExtension;
1350 {
1351 WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n");
1352 return STATUS_SUCCESS;
1353 }
1354
1355 if (!IsListEmpty(&DeviceExtension->ChildDeviceList))
1356 {
1357 ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n");
1358 return STATUS_SUCCESS;
1359 }
1360
1361 /* Enumerate the children */
1362 for (i = 1; ; i++)
1363 {
1364 Status = IoCreateDevice(DeviceExtension->DriverObject,
1367 NULL,
1370 FALSE,
1371 &ChildDeviceObject);
1372 if (!NT_SUCCESS(Status))
1373 return Status;
1374
1375 ChildExtension = ChildDeviceObject->DeviceExtension;
1376
1377 RtlZeroMemory(ChildExtension,
1380
1381 ChildExtension->Common.Fdo = FALSE;
1382 ChildExtension->ChildId = i;
1383 ChildExtension->PhysicalDeviceObject = ChildDeviceObject;
1384 ChildExtension->DriverObject = DeviceExtension->DriverObject;
1385
1386 /* Setup the ChildEnumInfo */
1387 ChildEnumInfo.Size = sizeof(ChildEnumInfo);
1388 ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor);
1389 ChildEnumInfo.ACPIHwId = 0;
1390
1392 ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension);
1393 else
1394 ChildEnumInfo.ChildHwDeviceExtension = NULL;
1395
1396 ChildEnumInfo.ChildIndex = ChildExtension->ChildId;
1397
1398 INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex);
1400 DeviceExtension->MiniPortDeviceExtension,
1401 &ChildEnumInfo,
1402 &ChildExtension->ChildType,
1403 ChildExtension->ChildDescriptor,
1404 &ChildExtension->ChildId,
1405 &Unused);
1407 {
1408 if (ChildExtension->ChildType == Monitor)
1409 {
1410 // Check if the EDID is valid
1411 if (ChildExtension->ChildDescriptor[0] == 0x00 &&
1412 ChildExtension->ChildDescriptor[1] == 0xFF &&
1413 ChildExtension->ChildDescriptor[2] == 0xFF &&
1414 ChildExtension->ChildDescriptor[3] == 0xFF &&
1415 ChildExtension->ChildDescriptor[4] == 0xFF &&
1416 ChildExtension->ChildDescriptor[5] == 0xFF &&
1417 ChildExtension->ChildDescriptor[6] == 0xFF &&
1418 ChildExtension->ChildDescriptor[7] == 0x00)
1419 {
1420 if (bHaveLastMonitorID)
1421 {
1422 // Compare the previous monitor ID with the current one, break the loop if they are identical
1423 if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID))
1424 {
1425 INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n");
1426 IoDeleteDevice(ChildDeviceObject);
1427 break;
1428 }
1429 }
1430
1431 // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor
1432 RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID));
1433 bHaveLastMonitorID = TRUE;
1434
1435 /* Mark it valid */
1436 ChildExtension->EdidValid = TRUE;
1437 }
1438 else
1439 {
1440 /* Mark it invalid */
1441 ChildExtension->EdidValid = FALSE;
1442 }
1443 }
1444 }
1446 {
1447 WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex);
1448 IoDeleteDevice(ChildDeviceObject);
1449 continue;
1450 }
1452 {
1453 INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1);
1454 IoDeleteDevice(ChildDeviceObject);
1455 break;
1456 }
1457 else
1458 {
1459 WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status);
1460 IoDeleteDevice(ChildDeviceObject);
1461 break;
1462 }
1463
1464 if (ChildExtension->ChildType == Monitor)
1465 {
1466 UINT j;
1467 PUCHAR p = ChildExtension->ChildDescriptor;
1468 INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId);
1469 for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8)
1470 {
1471 INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
1472 p[j + 0], p[j + 1], p[j + 2], p[j + 3],
1473 p[j + 4], p[j + 5], p[j + 6], p[j + 7]);
1474 }
1475 }
1476 else if (ChildExtension->ChildType == Other)
1477 {
1478 INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor);
1479 }
1480 else
1481 {
1482 ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType);
1483 }
1484
1485 /* Clear the init flag */
1486 ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
1487
1488 InsertTailList(&DeviceExtension->ChildDeviceList,
1489 &ChildExtension->ListEntry);
1490 }
1491
1492 return STATUS_SUCCESS;
1493}
1494
1496NTAPI
1498 IN PVOID HwDeviceExtension,
1500{
1501 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1502
1503 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1504 ASSERT(DeviceExtension);
1505
1506 if (DeviceExtension->PhysicalDeviceObject)
1507 {
1508 /* Trigger reenumeration by the PnP manager */
1510 }
1511
1512 return NO_ERROR;
1513}
1514
1515/*
1516 * @unimplemented
1517 */
1519NTAPI
1521 IN PVOID HwDeviceExtension,
1522 IN OUT PVOID *SecondaryDeviceExtension,
1523 IN ULONG Flag)
1524{
1526 PVIDEO_PORT_DEVICE_EXTENSION FirstDeviceExtension, DeviceExtension;
1528
1529 ASSERT(SecondaryDeviceExtension);
1530
1531 if (Flag != 0)
1532 {
1534 }
1535
1536 FirstDeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1537
1538 if (FirstDeviceExtension->DisplayNumber != 0)
1539 {
1540 DPRINT1("Calling VideoPortCreateSecondaryDisplay for InstanceId %lu\n",
1541 FirstDeviceExtension->DisplayNumber);
1542 }
1543
1545 FirstDeviceExtension->DriverExtension,
1546 FirstDeviceExtension->PhysicalDeviceObject,
1547 FirstDeviceExtension->AdapterNumber,
1548 FirstDeviceExtension->NumberOfSecondaryDisplays + 1,
1549 &DeviceObject);
1550 if (!NT_SUCCESS(Status))
1551 {
1552 DPRINT1("IntVideoPortCreateAdapterDeviceObject() failed with status 0x%08x\n", Status);
1553 return ERROR_DEV_NOT_EXIST;
1554 }
1555
1556 DeviceExtension = DeviceObject->DeviceExtension;
1557
1558 /* Increment secondary display count */
1559 FirstDeviceExtension->NumberOfSecondaryDisplays++;
1560
1561 *SecondaryDeviceExtension = DeviceExtension->MiniPortDeviceExtension;
1562 return NO_ERROR;
1563}
1564
1565/*
1566 * @implemented
1567 */
1568BOOLEAN
1569NTAPI
1571 IN PVOID HwDeviceExtension,
1574{
1575 return KeInsertQueueDpc(
1576 &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject,
1578 (PVOID)Context);
1579}
1580
1581/*
1582 * @implemented
1583 */
1584PVOID
1585NTAPI
1588{
1589 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1590
1591 TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n");
1592 DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
1593 if (!DeviceExtension)
1594 return NULL;
1595 return DeviceExtension->MiniPortDeviceExtension;
1596}
1597
1598/*
1599 * @implemented
1600 */
1602NTAPI
1604 IN PVOID HwDeviceExtension,
1605 IN OUT PVPOSVERSIONINFO VpOsVersionInfo)
1606{
1608
1609 Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
1610 if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO))
1611 {
1612#if 1
1614 {
1615 VpOsVersionInfo->MajorVersion = Version.dwMajorVersion;
1616 VpOsVersionInfo->MinorVersion = Version.dwMinorVersion;
1617 VpOsVersionInfo->BuildNumber = Version.dwBuildNumber;
1618 VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor;
1619 VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor;
1620 return NO_ERROR;
1621 }
1623#else
1624 VpOsVersionInfo->MajorVersion = 5;
1625 VpOsVersionInfo->MinorVersion = 0;
1626 VpOsVersionInfo->BuildNumber = 2195;
1627 VpOsVersionInfo->ServicePackMajor = 4;
1628 VpOsVersionInfo->ServicePackMinor = 0;
1629 return NO_ERROR;
1630#endif
1631 }
1632
1634}
1635
1636/*
1637 * @implemented
1638 */
1639BOOLEAN
1640NTAPI
1642 IN PVOID HwDeviceExtension,
1643 IN USHORT VendorId,
1644 IN USHORT DeviceId,
1645 IN UCHAR RevisionId,
1646 IN USHORT SubVendorId,
1647 IN USHORT SubSystemId,
1648 IN ULONG Flags)
1649{
1650 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1653 IO_STACK_LOCATION IoStack;
1654 ULONG PciFlags = 0;
1656 BOOL DevicePresent;
1657
1658 TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n");
1659
1661 {
1662 WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS));
1663 return FALSE;
1664 }
1665
1666 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1667
1669 PciDevicePresentInterface.Version = 1;
1671 IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version;
1673 IoStack.Parameters.QueryInterface.InterfaceType =
1674 &GUID_PCI_DEVICE_PRESENT_INTERFACE;
1675 Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject,
1677 if (!NT_SUCCESS(Status))
1678 {
1679 WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status);
1680 return FALSE;
1681 }
1682
1683 if (Flags & CDE_USE_REVISION)
1684 PciFlags |= PCI_USE_REVISION;
1686 PciFlags |= PCI_USE_SUBSYSTEM_IDS;
1687
1688 DevicePresent = PciDevicePresentInterface.IsDevicePresent(
1689 VendorId, DeviceId, RevisionId,
1690 SubVendorId, SubSystemId, PciFlags);
1691
1692 PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context);
1693
1694 return DevicePresent;
1695}
1696
1697/*
1698 * @unimplemented
1699 */
1701NTAPI
1703 IN PVOID HwDeviceExtension,
1704 IN ULONG BugcheckCode,
1706 IN ULONG BugcheckDataSize)
1707{
1709 return NO_ERROR;
1710}
1711
1712/*
1713 * @implemented
1714 */
1716NTAPI
1718 IN PVOID HwDeviceExtension,
1719 OUT PLONGLONG PerformanceFrequency OPTIONAL)
1720{
1722
1723 TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n");
1724 Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency);
1725 return Result.QuadPart;
1726}
1727
1728/*
1729 * @implemented
1730 */
1731VOID
1732NTAPI
1734 IN PVOID HwDeviceExtension)
1735{
1736 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1737
1738 TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n");
1739 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1741 // ASSERT(Status == STATUS_SUCCESS);
1742}
1743
1744/*
1745 * @implemented
1746 */
1747VOID
1748NTAPI
1750 IN PVOID HwDeviceExtension)
1751{
1752 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1753
1754 TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n");
1755 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1756 KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE);
1757 //ASSERT(Status == STATUS_SUCCESS);
1758}
1759
1760/*
1761 * @unimplemented
1762 */
1763VOID
1764NTAPI
1767 IN PVOID Data)
1768{
1770}
1771
1772/*
1773 * @implemented
1774 */
1775PVOID
1776NTAPI
1778 IN PVOID HwDeviceExtension,
1781)
1782{
1784}
1785
1786/*
1787 * @implemented
1788 */
1789BOOLEAN
1790NTAPI
1792{
1793 return VpNoVesa;
1794}
static USHORT USHORT * NewLength
static KSYNCHRONIZE_ROUTINE SynchronizeRoutine
Definition: IoInterrupt.c:30
unsigned char BOOLEAN
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
NTSYSAPI ULONG NTAPI vDbgPrintEx(_In_ ULONG ComponentId, _In_ ULONG Level, _In_z_ PCCH Format, _In_ va_list ap)
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
BOOL Error
Definition: chkdsk.c:66
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
return Found
Definition: dirsup.c:1270
_In_opt_ PWSTR _In_ PWSTR ParameterName
Definition: cdrom.h:961
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1230
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
PVOID NTAPI MmAllocateContiguousMemory(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
Definition: contmem.c:626
wcsncpy
_In_ PIRP Irp
Definition: csq.h:116
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:182
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define TRACE_(x)
Definition: compat.h:76
#define RtlImageNtHeader
Definition: compat.h:806
#define swprintf
Definition: precomp.h:40
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:725
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
@ DPFLTR_IHVVIDEO_ID
Definition: dpfilter.h:106
DRIVER_INITIALIZE DriverEntry
Definition: condrv.c:21
#define L(x)
Definition: resources.c:13
#define ULONG_PTR
Definition: config.h:101
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define SYNCH_LEVEL
Definition: env_spec_w32.h:704
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
UCHAR KIRQL
Definition: env_spec_w32.h:591
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define DO_BUFFERED_IO
Definition: env_spec_w32.h:394
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
struct _DEVICE_OBJECT * PDEVICE_OBJECT
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
#define PagedPool
Definition: env_spec_w32.h:308
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
unsigned int BOOL
Definition: ntddk_ex.h:94
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
@ SystemBasicInformation
Definition: ntddk_ex.h:11
_Must_inspect_result_ _In_ PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine
Definition: fltkernel.h:1035
PVOID NTAPI IntVideoPortGetProcAddress(_In_ PVOID HwDeviceExtension, _In_ PUCHAR FunctionName)
Definition: funclist.c:106
Status
Definition: gdiplustypes.h:25
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
_In_ GUID _In_ PVOID ValueData
Definition: hubbusif.h:312
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
KMUTEX VideoPortInt10Mutex
Definition: int10.c:38
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
PCI_INTERFACE PciDevicePresentInterface
Definition: devhere.c:18
NTSTATUS NTAPI IoQueryDeviceDescription(_In_opt_ PINTERFACE_TYPE BusType, _In_opt_ PULONG BusNumber, _In_opt_ PCONFIGURATION_TYPE ControllerType, _In_opt_ PULONG ControllerNumber, _In_opt_ PCONFIGURATION_TYPE PeripheralType, _In_opt_ PULONG PeripheralNumber, _In_ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, _In_opt_ PVOID Context)
Reads and returns Hardware information from the appropriate hardware registry key.
Definition: iorsrce.c:1213
#define REG_SZ
Definition: layer.c:22
#define Unused(x)
Definition: atlwin.h:28
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
_Out_ PNDIS_HANDLE _Out_ PUINT _In_ PNDIS_STRING _In_ NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
Definition: ndis.h:3230
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
#define KernelMode
Definition: asm.h:38
@ DpcObject
Definition: ketypes.h:425
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
Definition: rtlfuncs.h:4210
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
Definition: rtlfuncs.h:4211
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Outptr_
Definition: no_sal2.h:262
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define REG_BINARY
Definition: nt_native.h:1499
@ KeyValuePartialInformation
Definition: nt_native.h:1185
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RTL_REGISTRY_ABSOLUTE
Definition: nt_native.h:161
#define FASTCALL
Definition: nt_native.h:50
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define RTL_REGISTRY_DEVICEMAP
Definition: nt_native.h:165
#define RTL_QUERY_REGISTRY_REQUIRED
Definition: nt_native.h:132
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define READ_CONTROL
Definition: nt_native.h:58
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1063
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
__GNU_EXTENSION typedef __int64 * PLONGLONG
Definition: ntbasedef.h:394
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
NTSTATUS NTAPI IopInitiatePnpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, IN UCHAR MinorFunction, IN PIO_STACK_LOCATION Stack)
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1768
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:966
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1296
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1916
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1838
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
Definition: irq.c:142
BOOLEAN NTAPI KeSynchronizeExecution(IN OUT PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext OPTIONAL)
Definition: interrupt.c:237
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
Definition: mutex.c:67
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
Definition: mutex.c:189
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:419
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
unsigned short USHORT
Definition: pedump.c:61
SYSTEM_BASIC_INFORMATION SystemBasicInfo
Definition: perfdata.c:30
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:1382
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:1772
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
Definition: procobj.c:704
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
Definition: procobj.c:756
#define FILE_DEVICE_VIDEO
Definition: winioctl.h:80
#define FILE_DEVICE_CONTROLLER
Definition: winioctl.h:49
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
@ PCIBus
Definition: restypes.h:126
enum _INTERFACE_TYPE INTERFACE_TYPE
#define REG_DWORD
Definition: sdbapi.c:615
@ Latched
Definition: miniport.h:81
@ LevelSensitive
Definition: miniport.h:80
struct _INTERFACE * PINTERFACE
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA _In_ PVOID HwContext
Definition: srb.h:907
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA * HwInitializationData
Definition: srb.h:906
#define VIDEO_ENUM_INVALID_DEVICE
Definition: video.h:141
VIDEO_DEBUG_LEVEL
Definition: video.h:587
LONG VP_STATUS
Definition: video.h:153
#define VIDEO_ENUM_NO_MORE_DEVICES
Definition: video.h:140
VOID(NTAPI * PVIDEO_BUGCHECK_CALLBACK)(IN PVOID HwDeviceExtension, IN ULONG BugcheckCode, IN PUCHAR Buffer, IN ULONG BufferSize)
Definition: video.h:527
VIDEO_SYNCHRONIZE_PRIORITY
Definition: video.h:534
@ VpMediumPriority
Definition: video.h:536
@ VpLowPriority
Definition: video.h:535
@ VpHighPriority
Definition: video.h:537
VOID(NTAPI * PMINIPORT_DPC_ROUTINE)(IN PVOID HwDeviceExtension, IN PVOID Context)
Definition: video.h:518
struct _VIDEO_HW_INITIALIZATION_DATA VIDEO_HW_INITIALIZATION_DATA
#define SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA
Definition: video.h:119
#define CDE_USE_REVISION
Definition: video.h:147
@ Monitor
Definition: video.h:270
@ Other
Definition: video.h:273
#define VIDEO_ENUM_MORE_DEVICES
Definition: video.h:139
#define SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA
Definition: video.h:120
struct _VIDEO_PORT_CONFIG_INFO VIDEO_PORT_CONFIG_INFO
#define CDE_USE_SUBSYSTEM_IDS
Definition: video.h:146
VP_STATUS(NTAPI * PMINIPORT_GET_REGISTRY_ROUTINE)(IN PVOID HwDeviceExtension, IN PVOID Context, IN OUT PWSTR ValueName, IN OUT PVOID ValueData, IN ULONG ValueLength)
Definition: video.h:510
BOOLEAN(NTAPI * PMINIPORT_SYNCHRONIZE_ROUTINE)(IN PVOID Context)
Definition: video.h:523
enum _CONFIGURATION_TYPE CONFIGURATION_TYPE
#define ASSERT_IRQL_LESS_OR_EQUAL(x)
Definition: debug.h:251
#define INFO_(ch,...)
Definition: debug.h:159
#define ERR_(ch,...)
Definition: debug.h:156
#define WARN_(ch,...)
Definition: debug.h:157
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
base for all directory entries
Definition: entries.h:138
Definition: xml2sdb.h:97
PMINIPORT_GET_REGISTRY_ROUTINE HwGetRegistryRoutine
Definition: videoprt.c:1048
PVOID DeviceExtension
Definition: env_spec_w32.h:418
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntddk_ex.h:178
struct _IO_STACK_LOCATION::@4278::@4304 QueryInterface
union _IO_STACK_LOCATION::@1694 Parameters
Definition: ketypes.h:751
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
Definition: nt_native.h:109
ULONG ChildDescriptorSize
Definition: video.h:262
PVOID ChildHwDeviceExtension
Definition: video.h:265
PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor
Definition: video.h:685
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:127
VIDEO_CHILD_TYPE ChildType
Definition: videoprt.h:121
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:126
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:118
KINTERRUPT_MODE InterruptMode
Definition: video.h:172
INTERFACE_TYPE AdapterInterfaceType
Definition: video.h:169
PVIDEO_PORT_GET_PROC_ADDRESS VideoPortGetProcAddress
Definition: video.h:193
ULONG BusInterruptVector
Definition: video.h:171
ULONGLONG SystemMemorySize
Definition: video.h:195
PWSTR DriverRegistryPath
Definition: video.h:194
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
INTERFACE_TYPE AdapterInterfaceType
Definition: videoprt.h:98
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
LIST_ENTRY AddressMappingListHead
Definition: videoprt.h:101
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:84
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:86
UNICODE_STRING NewRegistryPath
Definition: videoprt.h:91
PDEVICE_OBJECT FunctionalDeviceObject
Definition: videoprt.h:88
VIDEO_HW_INITIALIZATION_DATA InitializationData
Definition: videoprt.h:72
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT Context1
Definition: tdikrnl.h:1095
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT _In_ PTDI_PNP_CONTEXT Context2
Definition: tdikrnl.h:1096
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
uint16_t * PWSTR
Definition: typedefs.h:56
#define MAXULONG
Definition: typedefs.h:251
uint32_t * PULONG
Definition: typedefs.h:59
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
int64_t LONGLONG
Definition: typedefs.h:68
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint16_t * PWCHAR
Definition: typedefs.h:56
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
VOID NTAPI VpNotifyEaData(IN PDEVICE_OBJECT DeviceObject, IN PVOID Data)
Definition: videoprt.c:1765
VOID NTAPI VideoPortAcquireDeviceLock(IN PVOID HwDeviceExtension)
Definition: videoprt.c:1733
PKPROCESS CsrProcess
Definition: videoprt.c:39
VOID NTAPI IntVideoPortDeferredRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: videoprt.c:146
BOOLEAN VideoPortUseNewKey
Definition: videoprt.c:41
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: videoprt.c:1641
PVOID NTAPI VideoPortAllocateContiguousMemory(IN PVOID HwDeviceExtension, IN ULONG NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
Definition: videoprt.c:1777
VOID NTAPI VideoPortLogError(IN PVOID HwDeviceExtension, IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, IN VP_STATUS ErrorCode, IN ULONG UniqueId)
Definition: videoprt.c:1020
VOID FASTCALL IntDetachFromCSRSS(_In_ PKPROCESS CallingProcess, _In_ PKAPC_STATE ApcState)
Detach the current thread from the CSRSS process. This routine is to be invoked after a previous succ...
Definition: videoprt.c:616
VP_STATUS NTAPI VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension, IN PWSTR ValueName, IN PVOID ValueData, IN ULONG ValueLength)
Definition: videoprt.c:1131
PVOID NTAPI IntVideoPortImageDirectoryEntryToData(PVOID BaseAddress, ULONG Directory)
Definition: videoprt.c:123
VOID FASTCALL IntLoadRegistryParameters(VOID)
Definition: videoprt.c:627
VP_STATUS NTAPI VideoPortRegisterBugcheckCallback(IN PVOID HwDeviceExtension, IN ULONG BugcheckCode, IN PVIDEO_BUGCHECK_CALLBACK Callback, IN ULONG BugcheckDataSize)
Definition: videoprt.c:1702
ULONG VideoDebugLevel
Definition: videoprt.c:34
BOOLEAN NTAPI VideoPortScanRom(IN PVOID HwDeviceExtension, IN PUCHAR RomBase, IN ULONG RomLength, IN PUCHAR String)
Definition: videoprt.c:1251
VP_STATUS NTAPI VideoPortGetVersion(IN PVOID HwDeviceExtension, IN OUT PVPOSVERSIONINFO VpOsVersionInfo)
Definition: videoprt.c:1603
VP_STATUS NTAPI VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, IN PWSTR ParameterName, IN UCHAR IsParameterFileName, IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine, IN PVOID HwContext)
Definition: videoprt.c:1080
struct QueryRegistryCallbackContext * PQUERY_REGISTRY_CALLBACK_CONTEXT
static ULONG VideoPortMaxObjectNumber
Definition: videoprt.c:40
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:1054
BOOLEAN VpNoVesa
Definition: videoprt.c:37
UCHAR NTAPI VideoPortGetCurrentIrql(VOID)
Definition: videoprt.c:1039
VOID VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PCHAR DebugMessage,...)
Definition: videoprt.c:1000
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
NTSTATUS NTAPI IntVideoPortFindAdapter(IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
Definition: videoprt.c:414
VOID NTAPI VideoPortReleaseDeviceLock(IN PVOID HwDeviceExtension)
Definition: videoprt.c:1749
static NTSTATUS IntVideoPortAddDeviceMapLink(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: videoprt.c:59
VP_STATUS NTAPI VideoPortEnumerateChildren(IN PVOID HwDeviceExtension, IN PVOID Reserved)
Definition: videoprt.c:1497
LONGLONG NTAPI VideoPortQueryPerformanceCounter(IN PVOID HwDeviceExtension, OUT PLONGLONG PerformanceFrequency OPTIONAL)
Definition: videoprt.c:1717
ULONG NTAPI VideoPortInitialize(IN PVOID Context1, IN PVOID Context2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext)
Definition: videoprt.c:786
struct QueryRegistryCallbackContext QUERY_REGISTRY_CALLBACK_CONTEXT
BOOLEAN NTAPI VideoPortIsNoVesa(VOID)
Definition: videoprt.c:1791
BOOLEAN VpBaseVideo
Definition: videoprt.c:36
VP_STATUS NTAPI VideoPortCreateSecondaryDisplay(IN PVOID HwDeviceExtension, IN OUT PVOID *SecondaryDeviceExtension, IN ULONG Flag)
Definition: videoprt.c:1520
static NTSTATUS IntVideoPortEnumBuses(_In_ INTERFACE_TYPE AdapterInterfaceType, _Inout_ PULONG BusNumber)
Enumerates all supported buses on the system.
Definition: videoprt.c:387
static NTSTATUS NTAPI IntVideoPortEnumBusCallback(_In_ PVOID Context, _In_ PUNICODE_STRING PathName, _In_ INTERFACE_TYPE BusType, _In_ ULONG BusNumber, _In_ PKEY_VALUE_FULL_INFORMATION *BusInformation, _In_ CONFIGURATION_TYPE ControllerType, _In_ ULONG ControllerNumber, _In_ PKEY_VALUE_FULL_INFORMATION *ControllerInformation, _In_ CONFIGURATION_TYPE PeripheralType, _In_ ULONG PeripheralNumber, _In_ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation)
A PIO_QUERY_DEVICE_ROUTINE callback for IoQueryDeviceDescription() to return success when an enumerat...
Definition: videoprt.c:353
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:43
PVOID NTAPI VideoPortGetAssociatedDeviceExtension(IN PVOID DeviceObject)
Definition: videoprt.c:1586
PVOID NTAPI VideoPortGetRomImage(IN PVOID HwDeviceExtension, IN PVOID Unused1, IN ULONG Unused2, IN ULONG Length)
Definition: videoprt.c:1190
NTSTATUS NTAPI IntVideoPortEnumerateChildren(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: videoprt.c:1333
BOOLEAN FASTCALL IntAttachToCSRSS(_Outptr_ PKPROCESS *CallingProcess, _Out_ PKAPC_STATE ApcState)
Attach the current thread to the CSRSS process. The caller must detach from the process by invoking I...
Definition: videoprt.c:589
BOOLEAN NTAPI VideoPortQueueDpc(IN PVOID HwDeviceExtension, IN PMINIPORT_DPC_ROUTINE CallbackRoutine, IN PVOID Context)
Definition: videoprt.c:1570
VP_STATUS NTAPI VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, OUT PULONG VgaStatus)
Definition: videoprt.c:1162
BOOLEAN NTAPI VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension, IN VIDEO_SYNCHRONIZE_PRIORITY Priority, IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, OUT PVOID Context)
Definition: videoprt.c:1284
LIST_ENTRY HwResetAdaptersList
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:140
#define TAG_VIDEO_PORT
Definition: videoprt.h:38
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
#define VIDEO_PORT_GET_CHILD_EXTENSION(MiniportExtension)
Definition: videoprt.h:134
struct _VIDEO_PORT_DEVICE_EXTENSTION VIDEO_PORT_DEVICE_EXTENSION
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
Definition: wdfdevice.h:3921
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
Definition: wdfinterrupt.h:655
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
Definition: wdfinterrupt.h:458
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
Definition: wdfregistry.h:282
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
Definition: wdfregistry.h:275
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
struct _KPROCESS * PKPROCESS
Definition: wdm.template.h:201
NTSTATUS NTAPI IntVideoPortDispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:434
VOID NTAPI IntVideoPortUnload(PDRIVER_OBJECT DriverObject)
Definition: dispatch.c:1242
NTSTATUS NTAPI IntVideoPortDispatchOpen(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:369
NTSTATUS NTAPI IntVideoPortDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:766
NTSTATUS NTAPI IntVideoPortDispatchSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1220
NTSTATUS NTAPI IntVideoPortDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1154
NTSTATUS NTAPI IntVideoPortAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
Definition: dispatch.c:334
NTSTATUS NTAPI IntVideoPortDispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1186
BOOLEAN NTAPI IntVideoPortSetupInterrupt(IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PVIDEO_PORT_CONFIG_INFO ConfigInfo)
Definition: interrupt.c:45
NTSTATUS NTAPI IntCreateRegistryPath(IN PCUNICODE_STRING DriverRegistryPath, IN ULONG DeviceNumber, OUT PUNICODE_STRING DeviceRegistryPath)
Definition: registry.c:603
NTSTATUS NTAPI IntCreateNewRegistryPath(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:408
NTSTATUS NTAPI IntSetupDeviceSettingsKey(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: registry.c:298
BOOLEAN NTAPI IntVideoPortSetupTimer(IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension)
Definition: timer.c:43
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG _In_opt_ PEVENT_FILTER_DESCRIPTOR _Inout_opt_ PVOID CallbackContext
Definition: wmitypes.h:60
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
Definition: halfuncs.h:160
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE BusType
Definition: halfuncs.h:159
@ BusRelations
Definition: iotypes.h:2154
#define IRP_MN_QUERY_INTERFACE
struct _PCI_DEVICE_PRESENT_INTERFACE PCI_DEVICE_PRESENT_INTERFACE
@ DevicePropertyAddress
Definition: iotypes.h:1211
@ DevicePropertyBusNumber
Definition: iotypes.h:1209
@ DevicePropertyLegacyBusType
Definition: iotypes.h:1208
#define IRP_MJ_SYSTEM_CONTROL
#define PCI_USE_REVISION
Definition: iotypes.h:867
#define IRP_MJ_SHUTDOWN
#define IRP_MJ_POWER
#define PCI_USE_SUBSYSTEM_IDS
Definition: iotypes.h:866
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036
#define KeWaitForMutexObject
Definition: kefuncs.h:543
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
@ Executive
Definition: ketypes.h:467
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:740
* PKAPC_STATE
Definition: ketypes.h:1711
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:739
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:741
KAPC_STATE
Definition: ketypes.h:1711
#define PsGetCurrentProcess
Definition: psfuncs.h:17
#define RTL_STATIC_LIST_HEAD(x)
Definition: rtlfuncs.h:47
struct _OSVERSIONINFOEXW RTL_OSVERSIONINFOEXW
unsigned char UCHAR
Definition: xmlstorage.h:181
__wchar_t WCHAR
Definition: xmlstorage.h:180