ReactOS 0.4.16-dev-2206-gc56950d
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
49
50/* PRIVATE FUNCTIONS **********************************************************/
51
52static BOOLEAN
54{
55 static const UNICODE_STRING VgaSave = RTL_CONSTANT_STRING(L"\\Driver\\VgaSave");
56 return RtlEqualUnicodeString(&VgaSave, &DriverObject->DriverName, TRUE);
57}
58
64{
65 return STATUS_SUCCESS;
66}
67
68static
71 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
72{
74 WCHAR DeviceBuffer[20];
76 WCHAR SymlinkBuffer[20];
77 UNICODE_STRING SymlinkName;
80
81 /* Create a unicode device name. */
82 DeviceNumber = DeviceExtension->DeviceNumber;
83 swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
84
86 RegistryPath = &DeviceExtension->NewRegistryPath;
87 else
88 RegistryPath = &DeviceExtension->RegistryPath;
89
90 /* Add entry to DEVICEMAP\VIDEO key in registry. */
92 L"VIDEO",
93 DeviceBuffer,
94 REG_SZ,
95 RegistryPath->Buffer,
96 RegistryPath->Length + sizeof(UNICODE_NULL));
97 if (!NT_SUCCESS(Status))
98 {
99 ERR_(VIDEOPRT, "Failed to create DEVICEMAP registry entry: 0x%X\n", Status);
100 return Status;
101 }
102
104 L"VIDEO",
105 L"MaxObjectNumber",
106 REG_DWORD,
108 sizeof(DeviceNumber));
109 if (!NT_SUCCESS(Status))
110 {
111 ERR_(VIDEOPRT, "Failed to write MaxObjectNumber: 0x%X\n", Status);
112 return Status;
113 }
114
115 /* Create symbolic link "\??\DISPLAYx" */
116 swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
117 RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
118 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
119 Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
120 if (!NT_SUCCESS(Status))
121 {
122 ERR_(VIDEOPRT, "Failed to create symbolic link: 0x%X\n", Status);
123 return Status;
124 }
125
126 /* Update MaxObjectNumber */
128
129 return STATUS_SUCCESS;
130}
131
132PVOID
133NTAPI
137{
138 PIMAGE_NT_HEADERS NtHeader;
139 ULONG Va;
140
141 NtHeader = RtlImageNtHeader(BaseAddress);
142 if (NtHeader == NULL)
143 return NULL;
144
146 return NULL;
147
149 if (Va == 0)
150 return NULL;
151
152 return (PVOID)((ULONG_PTR)BaseAddress + Va);
153}
154
155VOID
156NTAPI
158 IN PKDPC Dpc,
162{
163 PVOID HwDeviceExtension =
164 &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension;
166}
167
169NTAPI
174 _In_ USHORT AdapterNumber,
175 _In_ USHORT DisplayNumber,
177{
178 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
180 ULONG PciSlotNumber;
182 ULONG Size;
184 WCHAR DeviceBuffer[20];
186 PDEVICE_OBJECT DeviceObject_;
187
188 if (DeviceObject == NULL)
189 DeviceObject = &DeviceObject_;
190
191 /*
192 * Find the first free device number that can be used for video device
193 * object names and symlinks.
194 */
196 if (DeviceNumber == (ULONG)-1)
197 {
198 WARN_(VIDEOPRT, "Can't find free device number\n");
199 return STATUS_UNSUCCESSFUL;
200 }
201
202 /*
203 * Create the device object.
204 */
205
206 /* Create a unicode device name. */
207 swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
208 RtlInitUnicodeString(&DeviceName, DeviceBuffer);
209
210 INFO_(VIDEOPRT, "HwDeviceExtension size is: 0x%x\n",
211 DriverExtension->InitializationData.HwDeviceExtensionSize);
212
213 /* Create the device object. */
215 DriverExtension->InitializationData.HwDeviceExtensionSize;
217 Size,
218 &DeviceName,
220 0,
221 TRUE,
223
224 if (!NT_SUCCESS(Status))
225 {
226 WARN_(VIDEOPRT, "IoCreateDevice call failed with status 0x%08x\n", Status);
227 return Status;
228 }
229
230 /*
231 * Set the buffering strategy here. If you change this, remember
232 * to change VidDispatchDeviceControl too.
233 */
234
235 (*DeviceObject)->Flags |= DO_BUFFERED_IO;
236
237 /* Initialize device extension. */
238 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)((*DeviceObject)->DeviceExtension);
239 DeviceExtension->Common.Fdo = TRUE;
240 DeviceExtension->DeviceNumber = DeviceNumber;
241 DeviceExtension->DriverObject = DriverObject;
243 DeviceExtension->FunctionalDeviceObject = *DeviceObject;
244 DeviceExtension->DriverExtension = DriverExtension;
245 DeviceExtension->SessionId = -1;
246 DeviceExtension->AdapterNumber = AdapterNumber;
247 DeviceExtension->DisplayNumber = DisplayNumber;
248
249 InitializeListHead(&DeviceExtension->ChildDeviceList);
250
251 /* Get the registry path associated with this device. */
253 DeviceExtension->AdapterNumber,
254 &DeviceExtension->RegistryPath);
255 if (!NT_SUCCESS(Status))
256 {
257 WARN_(VIDEOPRT, "IntCreateRegistryPath() call failed with status 0x%08x\n", Status);
258 goto Failure;
259 }
260
262 {
263 /* Get bus number from the upper level bus driver. */
264 Size = sizeof(ULONG);
267 Size,
268 &DeviceExtension->SystemIoBusNumber,
269 &Size);
270 if (!NT_SUCCESS(Status))
271 {
272 WARN_(VIDEOPRT, "Couldn't get an information from bus driver. We will try to\n"
273 "use legacy detection method, but even that doesn't mean that\n"
274 "it will work.\n");
275 DeviceExtension->PhysicalDeviceObject = NULL;
276 }
277 }
278
279 DeviceExtension->AdapterInterfaceType =
280 DriverExtension->InitializationData.AdapterInterfaceType;
281
283 {
284 /* Get bus type from the upper level bus driver. */
285 Size = sizeof(ULONG);
288 Size,
289 &DeviceExtension->AdapterInterfaceType,
290 &Size);
291
292 /* Get bus device address from the upper level bus driver. */
293 Size = sizeof(ULONG);
296 Size,
297 &PciSlotNumber,
298 &Size);
299
300 /* Convert slotnumber to PCI_SLOT_NUMBER */
301 SlotNumber.u.AsULONG = 0;
302 SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF;
303 SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF;
304 DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG;
305 }
306
308 InitializeListHead(&DeviceExtension->DmaAdapterList);
309
310 KeInitializeDpc(&DeviceExtension->DpcObject,
312 DeviceExtension);
313
314 KeInitializeMutex(&DeviceExtension->DeviceLock, 0);
315
316 /* Attach the device. */
317 if ((PhysicalDeviceObject != NULL) && (DisplayNumber == 0))
321
322 Status = IntCreateNewRegistryPath(DeviceExtension);
323 if (!NT_SUCCESS(Status))
324 {
325 ERR_(VIDEOPRT, "IntCreateNewRegistryPath() failed with status 0x%08x\n", Status);
326 goto Failure;
327 }
328
329 IntSetupDeviceSettingsKey(DeviceExtension);
330
331 /* Remove the initializing flag */
332 (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
333
334 /* Set up the VIDEO/DEVICEMAP registry keys */
335 Status = IntVideoPortAddDeviceMapLink(DeviceExtension);
336 if (!NT_SUCCESS(Status))
337 {
338 ERR_(VIDEOPRT, "IntVideoPortAddDeviceMapLink() failed with status 0x%08x\n", Status);
339 goto Failure;
340 }
341
342 if (DisplayNumber == 0)
343 {
344 DriverExtension->InitializationData.StartingDeviceNumber++;
345 }
346
347 return STATUS_SUCCESS;
348
349Failure:
350 if (DeviceExtension->NextDeviceObject)
351 IoDetachDevice(DeviceExtension->NextDeviceObject);
354 return Status;
355}
356
362static NTSTATUS
363NTAPI
366 _In_ PUNICODE_STRING PathName,
370 _In_ CONFIGURATION_TYPE ControllerType,
371 _In_ ULONG ControllerNumber,
372 _In_ PKEY_VALUE_FULL_INFORMATION* ControllerInformation,
373 _In_ CONFIGURATION_TYPE PeripheralType,
374 _In_ ULONG PeripheralNumber,
375 _In_ PKEY_VALUE_FULL_INFORMATION* PeripheralInformation)
376{
378 UNREFERENCED_PARAMETER(PathName);
382 UNREFERENCED_PARAMETER(ControllerType);
383 UNREFERENCED_PARAMETER(ControllerNumber);
384 UNREFERENCED_PARAMETER(ControllerInformation);
385 UNREFERENCED_PARAMETER(PeripheralType);
386 UNREFERENCED_PARAMETER(PeripheralNumber);
387 UNREFERENCED_PARAMETER(PeripheralInformation);
388
389 /* The bus has been found */
390 return STATUS_SUCCESS;
391}
392
397static NTSTATUS
399 _In_ INTERFACE_TYPE AdapterInterfaceType,
401{
402 // TODO: Forward-compatibility with Windows 7+:
403 // In case AdapterInterfaceType == PCIBus, check for the
404 // \Registry\HARDWARE\DESCRIPTION\System\VideoAdapterBusses
405 // key (created by pci.sys) that enumerates the PCI buses that
406 // are known to have video display adapters on them.
407 // This is a handy shortcut for videoprt, that would otherwise
408 // have to enumerate all the PCI buses (PCI_MAX_BRIDGE_NUMBER)
409 // to locate any video adapter.
410 // Otherwise, fall back to the usual method done below.
411
412 /* Find the next bus of the given type */
413 return IoQueryDeviceDescription(&AdapterInterfaceType,
414 BusNumber,
415 NULL,
416 NULL,
417 NULL,
418 NULL,
420 NULL);
421}
422
424NTAPI
429{
430 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
432 VP_STATUS vpStatus;
433 VIDEO_PORT_CONFIG_INFO ConfigInfo;
435 UCHAR Again = FALSE;
436 BOOL LegacyDetection = FALSE;
437 BOOLEAN VgaResourcesReleased = FALSE;
438
439 DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
441 DeviceExtension->IsVgaDetect = DeviceExtension->IsVgaDriver;
442 DeviceExtension->IsLegacyDetect = FALSE;
443 DeviceExtension->ReportDevice = FALSE;
444
445 /* Setup a ConfigInfo structure that we will pass to HwFindAdapter. */
446 RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO));
447 ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO);
448 ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType;
449 if (ConfigInfo.AdapterInterfaceType == PCIBus)
450 ConfigInfo.InterruptMode = LevelSensitive;
451 else
452 ConfigInfo.InterruptMode = Latched;
453 ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer;
455 ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
456 ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel;
457 ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector;
458
461 sizeof(SystemBasicInfo),
462 NULL);
463 if (NT_SUCCESS(Status))
464 {
467 }
468
469 // FIXME: Check the adapter key and update VideoDebugLevel variable.
470
471 /*
472 * Call miniport HwVidFindAdapter entry point to detect if
473 * particular device is present. There are two possible code
474 * paths. The first one is for Legacy drivers (NT4) and cases
475 * when we don't have information about what bus we're on. The
476 * second case is the standard one for Plug & Play drivers.
477 */
478 if (DeviceExtension->PhysicalDeviceObject == NULL)
479 {
480 LegacyDetection = TRUE;
481 DeviceExtension->IsLegacyDevice = TRUE;
482 DeviceExtension->IsLegacyDetect = TRUE;
483 }
484 else
485 {
486 DeviceExtension->IsLegacyDevice = FALSE;
487 }
488
489 /* If we already have a VGA miniport and are about to probe for additional adapters,
490 * release its resources temporarily so conflicts are visible during detection.
491 * We'll reclaim them later if no new adapter successfully claims them. */
494 {
495 INFO_(VIDEOPRT, "Temporarily releasing VGA resources for adapter probing\n");
497 VgaResourcesReleased = TRUE;
498 }
500
501 if (LegacyDetection)
502 {
504
505 /* Suppose first we may not find any suitable device */
506 vpStatus = ERROR_DEV_NOT_EXIST; // ERROR_NO_MORE_DEVICES;
507
508 /* Enumerate all buses of the given type, call HwFindAdapter for each
509 * to find whether a video adapter is recognized there. Stop when an
510 * adapter has been found. */
511 for (BusNumber = 0;
512 (BusNumber < MAXULONG) &&
514 &BusNumber));
515 ++BusNumber)
516 {
517 DPRINT("Bus Type %lu, Number %lu\n",
518 DeviceExtension->AdapterInterfaceType, BusNumber);
519
520 DeviceExtension->SystemIoBusNumber =
521 ConfigInfo.SystemIoBusNumber = BusNumber;
522
523 RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension,
524 DriverExtension->InitializationData.HwDeviceExtensionSize);
525
526 /* FIXME: Need to figure out what string to pass as param 3. */
527 // FIXME: Handle the 'Again' parameter for legacy detection.
528 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
529 &DeviceExtension->MiniPortDeviceExtension,
530 DriverExtension->HwContext,
531 NULL,
532 &ConfigInfo,
533 &Again);
534
535 if (vpStatus == ERROR_DEV_NOT_EXIST)
536 {
537 continue;
538 }
539 else
540 {
541 break;
542 }
543 }
544 }
545 else
546 {
547 /* FIXME: Need to figure out what string to pass as param 3. */
548 vpStatus = DriverExtension->InitializationData.HwFindAdapter(
549 &DeviceExtension->MiniPortDeviceExtension,
550 DriverExtension->HwContext,
551 NULL,
552 &ConfigInfo,
553 &Again);
554 }
555
556 if (vpStatus != NO_ERROR)
557 {
558 ERR_(VIDEOPRT, "HwFindAdapter failed (vpStatus=0x%X) bus=%u iface=%u legacy=%u vga=%u detect(VGA=%u LEGACY=%u)\n",
559 vpStatus,
560 DeviceExtension->SystemIoBusNumber,
561 DeviceExtension->AdapterInterfaceType,
562 DeviceExtension->IsLegacyDevice,
563 DeviceExtension->IsVgaDriver,
564 DeviceExtension->IsVgaDetect,
565 DeviceExtension->IsLegacyDetect);
566 /* If we released VGA resources, reclaim them so VGA fallback still works */
567 if (VgaResourcesReleased)
568 {
570 {
571 INFO_(VIDEOPRT, "Reclaiming VGA resources after failed probe\n");
575 {
576 WARN_(VIDEOPRT, "Failed to reclaim VGA resources after probe failure\n");
577 }
578 }
579 }
581 goto Failure;
582 }
583
584 /*
585 * Now we know the device is present, so let's do all additional tasks
586 * such as creating symlinks or setting up interrupts and timer.
587 */
588
589 /* FIXME: Allocate hardware resources for device. */
590
591 /* Allocate interrupt for device. */
593 {
595 goto Failure;
596 }
597
598 /* Allocate timer for device. */
600 {
601 if (DeviceExtension->InterruptObject != NULL)
602 IoDisconnectInterrupt(DeviceExtension->InterruptObject);
603 ERR_(VIDEOPRT, "IntVideoPortSetupTimer failed\n");
605 goto Failure;
606 }
607
608 /* If the device can be reset, insert it in the list of resettable adapters */
609 InitializeListHead(&DeviceExtension->HwResetListEntry);
610 if (DriverExtension->InitializationData.HwResetHw != NULL)
611 {
613 &DeviceExtension->HwResetListEntry,
615 }
616
617 if (DeviceExtension->IsVgaDriver)
618 {
621 {
622 VgaDeviceExtension = DeviceExtension;
623 }
625 }
626
627 DeviceExtension->IsVgaDetect = FALSE;
628 DeviceExtension->IsLegacyDetect = FALSE;
629
630 /* For legacy (non-PnP) adapters we should report a detected device so that
631 * a PDO exists for higher layers to enumerate consistently (mirrors ScsiPort).*/
632 if (DeviceExtension->IsLegacyDevice && !DeviceExtension->ReportDevice)
633 {
634 PDEVICE_OBJECT ReportedPdo = NULL;
636 DeviceExtension->AdapterInterfaceType,
637 DeviceExtension->SystemIoBusNumber,
638 DeviceExtension->SystemIoSlotNumber,
639 NULL,
640 NULL,
641 FALSE,
642 &ReportedPdo);
643 if (!NT_SUCCESS(repStatus))
644 {
645 WARN_(VIDEOPRT, "IoReportDetectedDevice failed 0x%08lx (bus=%u slot=%u)\n",
646 repStatus,
647 DeviceExtension->SystemIoBusNumber,
648 DeviceExtension->SystemIoSlotNumber);
649 }
650 else
651 {
652 INFO_(VIDEOPRT, "Reported legacy adapter PDO %p (bus=%u slot=%u)\n",
653 ReportedPdo,
654 DeviceExtension->SystemIoBusNumber,
655 DeviceExtension->SystemIoSlotNumber);
656 DeviceExtension->ReportDevice = TRUE;
657 }
658 }
659
660 /* Attempt to reclaim VGA resources after probing if a VGA device exists */
662 {
663 VP_STATUS vr;
664 INFO_(VIDEOPRT, "Attempt VGA reclaim after probe (ranges=%lu)\n", NumOfVgaRanges);
667 VgaRanges);
668 if (vr != NO_ERROR)
669 {
670 /* Another driver has taken VGA resources; drop fallback state */
671 WARN_(VIDEOPRT, "VGA reclaim failed (vpStatus=0x%X); releasing fallback state\n", vr);
674 VgaRanges = NULL;
675 NumOfVgaRanges = 0;
678
679 }
680 else
681 {
682 INFO_(VIDEOPRT, "VGA reclaim succeeded\n");
683 }
684 }
685
686 INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
687 return STATUS_SUCCESS;
688
689Failure:
690 RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
691 if (DeviceExtension->NextDeviceObject)
692 IoDetachDevice(DeviceExtension->NextDeviceObject);
693
694 /* Explicitly reclaim VGA resources on complete failure */
695 if (VgaResourcesReleased)
696 {
698 {
699 INFO_(VIDEOPRT, "Final reclaim attempt of VGA resources during failure cleanup\n");
703 {
704 WARN_(VIDEOPRT, "VGA reclaim failed during failure cleanup\n");
705 }
706 }
707 }
709 return Status;
710}
711
729 _Outptr_ PKPROCESS* CallingProcess,
731{
732 if (!CsrProcess)
733 return FALSE;
734
735 *CallingProcess = (PKPROCESS)PsGetCurrentProcess();
736 if (*CallingProcess != CsrProcess)
738 return TRUE;
739}
740
753VOID
756 _In_ PKPROCESS CallingProcess,
758{
760 if (CallingProcess != CsrProcess)
762}
763
764VOID
767{
770 UNICODE_STRING KeyPath;
771 UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions");
775
776 /* Check if we need to use new registry */
777 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\UseNewKey");
779 &KeyPath,
781 NULL,
782 NULL);
783 Status = ZwOpenKey(&KeyHandle,
786 if (NT_SUCCESS(Status))
787 {
790 }
791
792#ifdef _M_IX86
793 /* Check whether we need to use the 32-bit x86 emulator instead of V86 mode */
794 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\DisableEmulator");
796 &KeyPath,
798 NULL,
799 NULL);
800 Status = ZwOpenKey(&KeyHandle,
803 if (NT_SUCCESS(Status))
804 {
805 VideoPortDisableX86Emulator = TRUE;
807 }
808 DPRINT1("Using %s\n", VideoPortDisableX86Emulator ? "V86 mode" : "x86 emulator");
809#endif // _M_IX86
810
811 /* Initialize object attributes with the path we want */
812 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control");
814 &KeyPath,
816 NULL,
817 NULL);
818
819 /* Open the key */
820 Status = ZwOpenKey(&KeyHandle,
823 if (!NT_SUCCESS(Status))
824 {
825 VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status);
826 return;
827 }
828
829 /* Find out how large our buffer should be */
830 Status = ZwQueryValueKey(KeyHandle,
831 &ValueName,
833 NULL,
834 0,
835 &Length);
837 {
838 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
840 return;
841 }
842
843 /* Allocate it */
845 if (!KeyInfo)
846 {
847 VideoPortDebugPrint(Error, "Out of memory\n");
849 return;
850 }
851
852 /* Now for real this time */
853 Status = ZwQueryValueKey(KeyHandle,
854 &ValueName,
856 KeyInfo,
857 Length,
858 &NewLength);
860
861 if (!NT_SUCCESS(Status))
862 {
863 VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
865 return;
866 }
867
868 /* Sanity check */
869 if (KeyInfo->Type != REG_SZ)
870 {
871 VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n");
873 return;
874 }
875
876 /* Check if BASEVIDEO or NOVESA is present in the start options */
877 if (wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO"))
879 if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA"))
880 VpNoVesa = TRUE;
881
883
884 /* FIXME: Old ReactOS-compatibility... */
886
887 if (VpNoVesa)
888 VideoPortDebugPrint(Info, "VESA mode disabled\n");
889 else
890 VideoPortDebugPrint(Info, "VESA mode enabled\n");
891
892 /* If we are in BASEVIDEO, create the volatile registry key for Win32k */
893 if (VpBaseVideo)
894 {
895 RtlInitUnicodeString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\BaseVideo");
897 &KeyPath,
899 NULL,
900 NULL);
901
902 Status = ZwCreateKey(&KeyHandle,
903 READ_CONTROL, // Non-0 placeholder: no use for this handle.
905 0,
906 NULL,
908 NULL);
909 if (NT_SUCCESS(Status))
911 else
912 ERR_(VIDEOPRT, "Failed to create the BaseVideo key (0x%x)\n", Status);
913 }
914
915 return;
916}
917
918/* PUBLIC FUNCTIONS ***********************************************************/
919
920/*
921 * @implemented
922 */
923ULONG
924NTAPI
930{
935 BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE;
936 static BOOLEAN FirstInitialization;
937
938 TRACE_(VIDEOPRT, "VideoPortInitialize\n");
939
940 if (!FirstInitialization)
941 {
942 FirstInitialization = TRUE;
947 }
948
949 /* As a first thing do parameter checks. */
950 if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA))
951 {
952 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
954 }
955
956 if ((HwInitializationData->HwFindAdapter == NULL) ||
957 (HwInitializationData->HwInitialize == NULL) ||
958 (HwInitializationData->HwStartIO == NULL))
959 {
960 ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
962 }
963
964 switch (HwInitializationData->HwInitDataSize)
965 {
966 /*
967 * NT4 drivers are special case, because we must use legacy method
968 * of detection instead of the Plug & Play one.
969 */
971 INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n");
972 break;
973
975 INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n");
976 break;
977
978 case sizeof(VIDEO_HW_INITIALIZATION_DATA):
979 INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n");
980 break;
981
982 default:
983 ERR_(VIDEOPRT, "Invalid HwInitializationData size %lu (expected %lu, %lu or %lu)\n",
984 HwInitializationData->HwInitDataSize,
988 return STATUS_UNSUCCESSFUL;
989 }
990
991 /* Set dispatching routines */
994 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
996 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =
998 DriverObject->DriverUnload = IntVideoPortUnload;
999
1000 /* Determine type of the miniport driver */
1001 if ((HwInitializationData->HwInitDataSize >=
1002 FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) &&
1003 (HwInitializationData->HwSetPowerState != NULL) &&
1004 (HwInitializationData->HwGetPowerState != NULL) &&
1005 (HwInitializationData->HwGetVideoChildDescriptor != NULL))
1006 {
1007 INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n");
1008 PnpDriver = TRUE;
1009 }
1010
1011 /* Check if legacy detection should be applied */
1012 if (!PnpDriver || HwContext)
1013 {
1014 INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n",
1015 HwInitializationData->AdapterInterfaceType);
1016
1017 /* FIXME: Move the code for legacy detection
1018 to another function and call it here */
1019 LegacyDetection = TRUE;
1020 }
1021
1022 /*
1023 * NOTE:
1024 * The driver extension can be already allocated in case that we were
1025 * called by legacy driver and failed detecting device. Some miniport
1026 * drivers in that case adjust parameters and call VideoPortInitialize
1027 * again.
1028 */
1030 if (DriverExtension == NULL)
1031 {
1036 if (!NT_SUCCESS(Status))
1037 {
1038 ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status);
1039 return Status;
1040 }
1041
1042 /*
1043 * Save the registry path. This should be done only once even if
1044 * VideoPortInitialize is called multiple times.
1045 */
1046 if (RegistryPath->Length != 0)
1047 {
1048 DriverExtension->RegistryPath.Length = 0;
1049 DriverExtension->RegistryPath.MaximumLength =
1050 RegistryPath->Length + sizeof(UNICODE_NULL);
1051 DriverExtension->RegistryPath.Buffer =
1053 PagedPool,
1054 DriverExtension->RegistryPath.MaximumLength,
1055 'RTSU');
1056 if (DriverExtension->RegistryPath.Buffer == NULL)
1057 {
1058 RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
1060 }
1061
1063
1064 /* There is a bug in Spice guest agent, which searches 'System' case-sensitively.
1065 * Replace 'SYSTEM' by 'System' to fix that.
1066 * Probably for similar reason, Windows also replaces 'MACHINE' by 'Machine'.
1067 */
1068 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\SYSTEM\\"), L"\\System\\", ARRAYSIZE(L"\\SYSTEM\\") - 1);
1069 wcsncpy(wcsstr(DriverExtension->RegistryPath.Buffer, L"\\MACHINE\\"), L"\\Machine\\", ARRAYSIZE(L"\\MACHINE\\") - 1);
1070
1071 INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath);
1072 }
1073 else
1074 {
1075 RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
1076 }
1077 }
1078
1079 /* Copy the correct miniport initialization data to the device extension. */
1080 RtlCopyMemory(&DriverExtension->InitializationData,
1082 HwInitializationData->HwInitDataSize);
1083 if (HwInitializationData->HwInitDataSize <
1085 {
1086 RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData +
1087 HwInitializationData->HwInitDataSize),
1089 HwInitializationData->HwInitDataSize);
1090 }
1091 DriverExtension->HwContext = HwContext;
1092
1093 /*
1094 * Plug & Play drivers registers the device in AddDevice routine.
1095 * For legacy drivers we must do it now.
1096 */
1097 if (LegacyDetection)
1098 {
1100
1102 {
1103 /* Power management */
1105 }
1106
1109 NULL,
1110 DriverExtension->InitializationData.StartingDeviceNumber,
1111 0,
1112 &DeviceObject);
1113 if (!NT_SUCCESS(Status))
1114 {
1115 ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status);
1116 return Status;
1117 }
1118
1120 if (!NT_SUCCESS(Status))
1121 ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status);
1122
1123 return Status;
1124 }
1125 else
1126 {
1127 DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice;
1131
1132 return STATUS_SUCCESS;
1133 }
1134}
1135
1136/*
1137 * @implemented
1138 */
1139VOID
1141 IN VIDEO_DEBUG_LEVEL DebugPrintLevel,
1142 IN PCHAR DebugMessage,
1143 ...)
1144{
1145 va_list ap;
1146
1147 if (VideoDebugLevel >= DebugPrintLevel)
1148 DebugPrintLevel = Error;
1149
1150 va_start(ap, DebugMessage);
1151 vDbgPrintEx(DPFLTR_IHVVIDEO_ID, DebugPrintLevel, DebugMessage, ap);
1152 va_end(ap);
1153}
1154
1155/*
1156 * @unimplemented
1157 */
1158VOID
1159NTAPI
1161 IN PVOID HwDeviceExtension,
1164 IN ULONG UniqueId)
1165{
1167
1168 INFO_(VIDEOPRT, "VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n",
1169 ErrorCode, ErrorCode, UniqueId, UniqueId);
1170 if (Vrp)
1171 INFO_(VIDEOPRT, "Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode);
1172}
1173
1174/*
1175 * @implemented
1176 */
1177UCHAR
1178NTAPI
1180{
1181 return KeGetCurrentIrql();
1182}
1183
1185{
1190
1191static
1193NTAPI
1201{
1203
1204 INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n",
1206 return (*(CallbackContext->HwGetRegistryRoutine))(
1207 CallbackContext->HwDeviceExtension,
1208 CallbackContext->HwContext,
1209 ValueName,
1210 ValueData,
1211 ValueLength);
1212}
1213
1214/*
1215 * @unimplemented
1216 */
1217
1219NTAPI
1221 IN PVOID HwDeviceExtension,
1223 IN UCHAR IsParameterFileName,
1224 IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine,
1226{
1229 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1231
1232 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1233
1234 TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1235 ParameterName, &DeviceExtension->RegistryPath);
1236
1237 Context.HwDeviceExtension = HwDeviceExtension;
1238 Context.HwContext = HwContext;
1239 Context.HwGetRegistryRoutine = GetRegistryRoutine;
1240
1244
1246 DeviceExtension->RegistryPath.Buffer,
1247 QueryTable,
1248 &Context,
1249 NULL);
1250 if (!NT_SUCCESS(Status))
1251 {
1252 WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the "
1253 "requested parameter\n");
1255 }
1256
1257 if (IsParameterFileName)
1258 {
1259 /* FIXME: need to read the contents of the file */
1261 }
1262
1263 return NO_ERROR;
1264}
1265
1266/*
1267 * @implemented
1268 */
1270NTAPI
1272 IN PVOID HwDeviceExtension,
1276{
1277 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1279
1280 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1281 TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n",
1282 ValueName,
1283 &DeviceExtension->RegistryPath);
1286 DeviceExtension->RegistryPath.Buffer,
1287 ValueName,
1288 REG_BINARY,
1289 ValueData,
1290 ValueLength);
1291 if (Status != NO_ERROR)
1292 WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status);
1293
1294 return Status;
1295}
1296
1297/*
1298 * @implemented
1299 */
1301NTAPI
1303 IN PVOID HwDeviceExtension,
1304 OUT PULONG VgaStatus)
1305{
1306 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1307
1308 TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n");
1309
1310 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1312 {
1313 if (DeviceExtension->AdapterInterfaceType == PCIBus)
1314 {
1315 /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */
1316 /* Assumed for now */
1317 *VgaStatus = 1;
1318 return NO_ERROR;
1319 }
1320 }
1321
1323}
1324
1325/*
1326 * @implemented
1327 */
1328PVOID
1329NTAPI
1331 IN PVOID HwDeviceExtension,
1332 IN PVOID Unused1,
1333 IN ULONG Unused2,
1334 IN ULONG Length)
1335{
1336 static PVOID RomImageBuffer = NULL;
1337 PKPROCESS CallingProcess;
1339
1340 TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n",
1341 HwDeviceExtension, Length);
1342
1343 /* If the length is zero then free the existing buffer */
1344 if (Length == 0)
1345 {
1346 if (RomImageBuffer != NULL)
1347 {
1348 ExFreePool(RomImageBuffer);
1349 RomImageBuffer = NULL;
1350 }
1351 return NULL;
1352 }
1353 else
1354 {
1355 /*
1356 * The DDK says we shouldn't use the legacy C0000 method but get the
1357 * ROM base address from the corresponding PCI or ACPI register but
1358 * lets ignore that and use C0000 anyway. We have already mapped the
1359 * BIOS area into memory so we'll copy from there.
1360 */
1361
1362 /* Copy the BIOS */
1363 Length = min(Length, 0x10000);
1364 if (RomImageBuffer != NULL)
1365 ExFreePool(RomImageBuffer);
1366
1367 RomImageBuffer = ExAllocatePool(PagedPool, Length);
1368 if (RomImageBuffer == NULL)
1369 return NULL;
1370
1371 /* Perform the copy in the CSRSS context */
1372 if (IntAttachToCSRSS(&CallingProcess, &ApcState))
1373 {
1374 RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length);
1375 IntDetachFromCSRSS(CallingProcess, &ApcState);
1376 }
1377 else
1378 {
1379 ExFreePool(RomImageBuffer);
1380 RomImageBuffer = NULL;
1381 }
1382 return RomImageBuffer;
1383 }
1384}
1385
1386/*
1387 * @implemented
1388 */
1389BOOLEAN
1390NTAPI
1392 IN PVOID HwDeviceExtension,
1393 IN PUCHAR RomBase,
1394 IN ULONG RomLength,
1396{
1397 SIZE_T StringLength;
1398 BOOLEAN Found;
1399 PUCHAR SearchLocation;
1400
1401 TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String);
1402
1403 StringLength = strlen((PCHAR)String);
1404 Found = FALSE;
1405 for (SearchLocation = RomBase;
1406 !Found && SearchLocation < RomBase + RomLength - StringLength;
1407 SearchLocation++)
1408 {
1409 Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength);
1410 if (Found)
1411 {
1412 INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation);
1413 }
1414 }
1415
1416 return Found;
1417}
1418
1419/*
1420 * @implemented
1421 */
1422BOOLEAN
1423NTAPI
1425 IN PVOID HwDeviceExtension,
1429{
1430 BOOLEAN Ret;
1431 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1432 KIRQL OldIrql;
1433
1434 switch (Priority)
1435 {
1436 case VpLowPriority:
1437 Ret = (*SynchronizeRoutine)(Context);
1438 break;
1439
1440 case VpMediumPriority:
1441 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1442 if (DeviceExtension->InterruptObject == NULL)
1443 Ret = (*SynchronizeRoutine)(Context);
1444 else
1446 DeviceExtension->InterruptObject,
1448 Context);
1449 break;
1450
1451 case VpHighPriority:
1453 if (OldIrql < SYNCH_LEVEL)
1455
1456 Ret = (*SynchronizeRoutine)(Context);
1457
1458 if (OldIrql < SYNCH_LEVEL)
1460 break;
1461
1462 default:
1463 Ret = FALSE;
1464 }
1465
1466 return Ret;
1467}
1468
1469/*
1470 * @implemented
1471 */
1475 IN PIRP Irp)
1476{
1477 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1478 ULONG Status;
1479 VIDEO_CHILD_ENUM_INFO ChildEnumInfo;
1480 BOOLEAN bHaveLastMonitorID = FALSE;
1481 UCHAR LastMonitorID[10];
1482 ULONG Unused;
1483 UINT i;
1484 PDEVICE_OBJECT ChildDeviceObject;
1485 PVIDEO_PORT_CHILD_EXTENSION ChildExtension;
1486
1487 INFO_(VIDEOPRT, "Starting child device probe\n");
1488 DeviceExtension = DeviceObject->DeviceExtension;
1490 {
1491 WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n");
1492 return STATUS_SUCCESS;
1493 }
1494
1495 if (!IsListEmpty(&DeviceExtension->ChildDeviceList))
1496 {
1497 ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n");
1498 return STATUS_SUCCESS;
1499 }
1500
1501 /* Enumerate the children */
1502 for (i = 1; ; i++)
1503 {
1504 Status = IoCreateDevice(DeviceExtension->DriverObject,
1507 NULL,
1510 FALSE,
1511 &ChildDeviceObject);
1512 if (!NT_SUCCESS(Status))
1513 return Status;
1514
1515 ChildExtension = ChildDeviceObject->DeviceExtension;
1516
1517 RtlZeroMemory(ChildExtension,
1520
1521 ChildExtension->Common.Fdo = FALSE;
1522 ChildExtension->ChildId = i;
1523 ChildExtension->PhysicalDeviceObject = ChildDeviceObject;
1524 ChildExtension->DriverObject = DeviceExtension->DriverObject;
1525
1526 /* Setup the ChildEnumInfo */
1527 ChildEnumInfo.Size = sizeof(ChildEnumInfo);
1528 ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor);
1529 ChildEnumInfo.ACPIHwId = 0;
1530
1532 ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension);
1533 else
1534 ChildEnumInfo.ChildHwDeviceExtension = NULL;
1535
1536 ChildEnumInfo.ChildIndex = ChildExtension->ChildId;
1537
1538 INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex);
1540 DeviceExtension->MiniPortDeviceExtension,
1541 &ChildEnumInfo,
1542 &ChildExtension->ChildType,
1543 ChildExtension->ChildDescriptor,
1544 &ChildExtension->ChildId,
1545 &Unused);
1547 {
1548 if (ChildExtension->ChildType == Monitor)
1549 {
1550 // Check if the EDID is valid
1551 if (ChildExtension->ChildDescriptor[0] == 0x00 &&
1552 ChildExtension->ChildDescriptor[1] == 0xFF &&
1553 ChildExtension->ChildDescriptor[2] == 0xFF &&
1554 ChildExtension->ChildDescriptor[3] == 0xFF &&
1555 ChildExtension->ChildDescriptor[4] == 0xFF &&
1556 ChildExtension->ChildDescriptor[5] == 0xFF &&
1557 ChildExtension->ChildDescriptor[6] == 0xFF &&
1558 ChildExtension->ChildDescriptor[7] == 0x00)
1559 {
1560 if (bHaveLastMonitorID)
1561 {
1562 // Compare the previous monitor ID with the current one, break the loop if they are identical
1563 if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID))
1564 {
1565 INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n");
1566 IoDeleteDevice(ChildDeviceObject);
1567 break;
1568 }
1569 }
1570
1571 // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor
1572 RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID));
1573 bHaveLastMonitorID = TRUE;
1574
1575 /* Mark it valid */
1576 ChildExtension->EdidValid = TRUE;
1577 }
1578 else
1579 {
1580 /* Mark it invalid */
1581 ChildExtension->EdidValid = FALSE;
1582 }
1583 }
1584 }
1586 {
1587 WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex);
1588 IoDeleteDevice(ChildDeviceObject);
1589 continue;
1590 }
1592 {
1593 INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1);
1594 IoDeleteDevice(ChildDeviceObject);
1595 break;
1596 }
1597 else
1598 {
1599 WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status);
1600 IoDeleteDevice(ChildDeviceObject);
1601 break;
1602 }
1603
1604 if (ChildExtension->ChildType == Monitor)
1605 {
1606 UINT j;
1607 PUCHAR p = ChildExtension->ChildDescriptor;
1608 INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId);
1609 for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8)
1610 {
1611 INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
1612 p[j + 0], p[j + 1], p[j + 2], p[j + 3],
1613 p[j + 4], p[j + 5], p[j + 6], p[j + 7]);
1614 }
1615 }
1616 else if (ChildExtension->ChildType == Other)
1617 {
1618 INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor);
1619 }
1620 else
1621 {
1622 ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType);
1623 }
1624
1625 /* Clear the init flag */
1626 ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
1627
1628 InsertTailList(&DeviceExtension->ChildDeviceList,
1629 &ChildExtension->ListEntry);
1630 }
1631
1632 return STATUS_SUCCESS;
1633}
1634
1636NTAPI
1638 IN PVOID HwDeviceExtension,
1640{
1641 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1642
1643 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1644 ASSERT(DeviceExtension);
1645
1646 if (DeviceExtension->PhysicalDeviceObject)
1647 {
1648 /* Trigger reenumeration by the PnP manager */
1650 }
1651
1652 return NO_ERROR;
1653}
1654
1655/*
1656 * @unimplemented
1657 */
1659NTAPI
1661 IN PVOID HwDeviceExtension,
1662 IN OUT PVOID *SecondaryDeviceExtension,
1663 IN ULONG Flag)
1664{
1666 PVIDEO_PORT_DEVICE_EXTENSION FirstDeviceExtension, DeviceExtension;
1668
1669 ASSERT(SecondaryDeviceExtension);
1670
1671 if (Flag != 0)
1672 {
1674 }
1675
1676 FirstDeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1677
1678 if (FirstDeviceExtension->DisplayNumber != 0)
1679 {
1680 DPRINT1("Calling VideoPortCreateSecondaryDisplay for InstanceId %lu\n",
1681 FirstDeviceExtension->DisplayNumber);
1682 }
1683
1685 FirstDeviceExtension->DriverExtension,
1686 FirstDeviceExtension->PhysicalDeviceObject,
1687 FirstDeviceExtension->AdapterNumber,
1688 FirstDeviceExtension->NumberOfSecondaryDisplays + 1,
1689 &DeviceObject);
1690 if (!NT_SUCCESS(Status))
1691 {
1692 DPRINT1("IntVideoPortCreateAdapterDeviceObject() failed with status 0x%08x\n", Status);
1693 return ERROR_DEV_NOT_EXIST;
1694 }
1695
1696 DeviceExtension = DeviceObject->DeviceExtension;
1697
1698 /* Increment secondary display count */
1699 FirstDeviceExtension->NumberOfSecondaryDisplays++;
1700
1701 *SecondaryDeviceExtension = DeviceExtension->MiniPortDeviceExtension;
1702 return NO_ERROR;
1703}
1704
1705/*
1706 * @implemented
1707 */
1708BOOLEAN
1709NTAPI
1711 IN PVOID HwDeviceExtension,
1714{
1715 return KeInsertQueueDpc(
1716 &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject,
1718 (PVOID)Context);
1719}
1720
1721/*
1722 * @implemented
1723 */
1724PVOID
1725NTAPI
1728{
1729 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1730
1731 TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n");
1732 DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
1733 if (!DeviceExtension)
1734 return NULL;
1735 return DeviceExtension->MiniPortDeviceExtension;
1736}
1737
1738/*
1739 * @implemented
1740 */
1742NTAPI
1744 IN PVOID HwDeviceExtension,
1745 IN OUT PVPOSVERSIONINFO VpOsVersionInfo)
1746{
1748
1749 Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
1750 if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO))
1751 {
1752#if 1
1754 {
1755 VpOsVersionInfo->MajorVersion = Version.dwMajorVersion;
1756 VpOsVersionInfo->MinorVersion = Version.dwMinorVersion;
1757 VpOsVersionInfo->BuildNumber = Version.dwBuildNumber;
1758 VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor;
1759 VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor;
1760 return NO_ERROR;
1761 }
1763#else
1764 VpOsVersionInfo->MajorVersion = 5;
1765 VpOsVersionInfo->MinorVersion = 0;
1766 VpOsVersionInfo->BuildNumber = 2195;
1767 VpOsVersionInfo->ServicePackMajor = 4;
1768 VpOsVersionInfo->ServicePackMinor = 0;
1769 return NO_ERROR;
1770#endif
1771 }
1772
1774}
1775
1776/*
1777 * @implemented
1778 */
1779BOOLEAN
1780NTAPI
1782 IN PVOID HwDeviceExtension,
1783 IN USHORT VendorId,
1784 IN USHORT DeviceId,
1785 IN UCHAR RevisionId,
1786 IN USHORT SubVendorId,
1787 IN USHORT SubSystemId,
1788 IN ULONG Flags)
1789{
1790 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1793 IO_STACK_LOCATION IoStack;
1794 ULONG PciFlags = 0;
1796 BOOL DevicePresent;
1797
1798 TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n");
1799
1801 {
1802 WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS));
1803 return FALSE;
1804 }
1805
1806 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1807
1809 PciDevicePresentInterface.Version = 1;
1811 IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version;
1813 IoStack.Parameters.QueryInterface.InterfaceType =
1814 &GUID_PCI_DEVICE_PRESENT_INTERFACE;
1815 Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject,
1817 if (!NT_SUCCESS(Status))
1818 {
1819 WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status);
1820 return FALSE;
1821 }
1822
1823 if (Flags & CDE_USE_REVISION)
1824 PciFlags |= PCI_USE_REVISION;
1826 PciFlags |= PCI_USE_SUBSYSTEM_IDS;
1827
1828 DevicePresent = PciDevicePresentInterface.IsDevicePresent(
1829 VendorId, DeviceId, RevisionId,
1830 SubVendorId, SubSystemId, PciFlags);
1831
1832 PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context);
1833
1834 return DevicePresent;
1835}
1836
1837/*
1838 * @unimplemented
1839 */
1841NTAPI
1843 IN PVOID HwDeviceExtension,
1844 IN ULONG BugcheckCode,
1846 IN ULONG BugcheckDataSize)
1847{
1849 return NO_ERROR;
1850}
1851
1852/*
1853 * @implemented
1854 */
1856NTAPI
1858 IN PVOID HwDeviceExtension,
1859 OUT PLONGLONG PerformanceFrequency OPTIONAL)
1860{
1862
1863 TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n");
1864 Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency);
1865 return Result.QuadPart;
1866}
1867
1868/*
1869 * @implemented
1870 */
1871VOID
1872NTAPI
1874 IN PVOID HwDeviceExtension)
1875{
1876 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1877
1878 TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n");
1879 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1881 // ASSERT(Status == STATUS_SUCCESS);
1882}
1883
1884/*
1885 * @implemented
1886 */
1887VOID
1888NTAPI
1890 IN PVOID HwDeviceExtension)
1891{
1892 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1893
1894 TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n");
1895 DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1896 KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE);
1897 //ASSERT(Status == STATUS_SUCCESS);
1898}
1899
1900/*
1901 * @unimplemented
1902 */
1903VOID
1904NTAPI
1907 IN PVOID Data)
1908{
1910}
1911
1912/*
1913 * @implemented
1914 */
1915PVOID
1916NTAPI
1918 IN PVOID HwDeviceExtension,
1921)
1922{
1924}
1925
1926/*
1927 * @implemented
1928 */
1929BOOLEAN
1930NTAPI
1932{
1933 return VpNoVesa;
1934}
static USHORT USHORT * NewLength
static KSYNCHRONIZE_ROUTINE SynchronizeRoutine
Definition: IoInterrupt.c:30
unsigned char BOOLEAN
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
_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
_ACRTIMP wchar_t *__cdecl wcsstr(const wchar_t *, const wchar_t *)
Definition: wcs.c:2993
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
char * va_list
Definition: vadefs.h:50
#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
#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)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#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:1769
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
NTSTATUS NTAPI IoReportDetectedDevice(_In_ PDRIVER_OBJECT DriverObject, _In_ INTERFACE_TYPE LegacyBusType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _In_opt_ PCM_RESOURCE_LIST ResourceList, _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements, _In_ BOOLEAN ResourceAssigned, _Inout_ PDEVICE_OBJECT *DeviceObject)
Definition: pnpreport.c:148
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
VPAPI VP_STATUS NTAPI VideoPortVerifyAccessRanges(_In_ PVOID HwDeviceExtension, _In_opt_ ULONG NumAccessRanges, _In_reads_opt_(NumAccessRanges) PVIDEO_ACCESS_RANGE AccessRanges)
Claims or releases a range of hardware resources and checks for conflicts.
Definition: resource.c:984
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
wcsncpy
#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:1188
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::@4301::@4327 QueryInterface
union _IO_STACK_LOCATION::@1710 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:132
VIDEO_CHILD_TYPE ChildType
Definition: videoprt.h:126
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:131
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:123
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:118
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
ULONG NumOfVgaRanges
Definition: videoprt.c:48
VOID NTAPI VpNotifyEaData(IN PDEVICE_OBJECT DeviceObject, IN PVOID Data)
Definition: videoprt.c:1905
VOID NTAPI VideoPortAcquireDeviceLock(IN PVOID HwDeviceExtension)
Definition: videoprt.c:1873
PKPROCESS CsrProcess
Definition: videoprt.c:39
VOID NTAPI IntVideoPortDeferredRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: videoprt.c:157
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:1781
PVOID NTAPI VideoPortAllocateContiguousMemory(IN PVOID HwDeviceExtension, IN ULONG NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
Definition: videoprt.c:1917
VOID NTAPI VideoPortLogError(IN PVOID HwDeviceExtension, IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, IN VP_STATUS ErrorCode, IN ULONG UniqueId)
Definition: videoprt.c:1160
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:755
VP_STATUS NTAPI VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension, IN PWSTR ValueName, IN PVOID ValueData, IN ULONG ValueLength)
Definition: videoprt.c:1271
PVOID NTAPI IntVideoPortImageDirectoryEntryToData(PVOID BaseAddress, ULONG Directory)
Definition: videoprt.c:134
VOID FASTCALL IntLoadRegistryParameters(VOID)
Definition: videoprt.c:766
VP_STATUS NTAPI VideoPortRegisterBugcheckCallback(IN PVOID HwDeviceExtension, IN ULONG BugcheckCode, IN PVIDEO_BUGCHECK_CALLBACK Callback, IN ULONG BugcheckDataSize)
Definition: videoprt.c:1842
ULONG VideoDebugLevel
Definition: videoprt.c:34
BOOLEAN NTAPI VideoPortScanRom(IN PVOID HwDeviceExtension, IN PUCHAR RomBase, IN ULONG RomLength, IN PUCHAR String)
Definition: videoprt.c:1391
VP_STATUS NTAPI VideoPortGetVersion(IN PVOID HwDeviceExtension, IN OUT PVPOSVERSIONINFO VpOsVersionInfo)
Definition: videoprt.c:1743
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:1220
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:1194
BOOLEAN VpNoVesa
Definition: videoprt.c:37
UCHAR NTAPI VideoPortGetCurrentIrql(VOID)
Definition: videoprt.c:1179
VOID VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PCHAR DebugMessage,...)
Definition: videoprt.c:1140
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:170
NTSTATUS NTAPI IntVideoPortFindAdapter(IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
Definition: videoprt.c:425
VOID NTAPI VideoPortReleaseDeviceLock(IN PVOID HwDeviceExtension)
Definition: videoprt.c:1889
static NTSTATUS IntVideoPortAddDeviceMapLink(PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: videoprt.c:70
VP_STATUS NTAPI VideoPortEnumerateChildren(IN PVOID HwDeviceExtension, IN PVOID Reserved)
Definition: videoprt.c:1637
PVIDEO_PORT_DEVICE_EXTENSION VgaDeviceExtension
Definition: videoprt.c:46
LONGLONG NTAPI VideoPortQueryPerformanceCounter(IN PVOID HwDeviceExtension, OUT PLONGLONG PerformanceFrequency OPTIONAL)
Definition: videoprt.c:1857
ULONG NTAPI VideoPortInitialize(IN PVOID Context1, IN PVOID Context2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext)
Definition: videoprt.c:925
struct QueryRegistryCallbackContext QUERY_REGISTRY_CALLBACK_CONTEXT
BOOLEAN NTAPI VideoPortIsNoVesa(VOID)
Definition: videoprt.c:1931
BOOLEAN VpBaseVideo
Definition: videoprt.c:36
KMUTEX VgaSyncLock
Definition: videoprt.c:45
VP_STATUS NTAPI VideoPortCreateSecondaryDisplay(IN PVOID HwDeviceExtension, IN OUT PVOID *SecondaryDeviceExtension, IN ULONG Flag)
Definition: videoprt.c:1660
static NTSTATUS IntVideoPortEnumBuses(_In_ INTERFACE_TYPE AdapterInterfaceType, _Inout_ PULONG BusNumber)
Enumerates all supported buses on the system.
Definition: videoprt.c:398
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:364
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:43
PVOID NTAPI VideoPortGetAssociatedDeviceExtension(IN PVOID DeviceObject)
Definition: videoprt.c:1726
PVOID NTAPI VideoPortGetRomImage(IN PVOID HwDeviceExtension, IN PVOID Unused1, IN ULONG Unused2, IN ULONG Length)
Definition: videoprt.c:1330
PVIDEO_ACCESS_RANGE VgaRanges
Definition: videoprt.c:47
NTSTATUS NTAPI IntVideoPortEnumerateChildren(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: videoprt.c:1473
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:728
BOOLEAN NTAPI VideoPortQueueDpc(IN PVOID HwDeviceExtension, IN PMINIPORT_DPC_ROUTINE CallbackRoutine, IN PVOID Context)
Definition: videoprt.c:1710
VP_STATUS NTAPI VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, OUT PULONG VgaStatus)
Definition: videoprt.c:1302
BOOLEAN NTAPI VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension, IN VIDEO_SYNCHRONIZE_PRIORITY Priority, IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, OUT PVOID Context)
Definition: videoprt.c:1424
static BOOLEAN IntIsVgaSaveDriverName(_In_ PDRIVER_OBJECT DriverObject)
Definition: videoprt.c:53
LIST_ENTRY HwResetAdaptersList
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:145
#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:139
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
VOID IntVideoPortReleaseResources(_In_ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
Definition: resource.c:206
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