ReactOS  0.4.15-dev-1206-g731eddf
resource.c
Go to the documentation of this file.
1 /*
2  * VideoPort driver
3  *
4  * Copyright (C) 2002 - 2005 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 #define NDEBUG
25 #include <debug.h>
26 
27 /* PRIVATE FUNCTIONS **********************************************************/
28 
32  IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension,
33  OUT PVIDEO_ACCESS_RANGE *AccessRanges,
34  OUT PULONG AccessRangeCount)
35 {
36  PCI_COMMON_CONFIG PciConfig;
37  ULONG ReadLength;
38 
39  if (!DriverExtension->InitializationData.HwGetLegacyResources &&
40  !DriverExtension->InitializationData.HwLegacyResourceCount)
41  {
42  /* No legacy resources to report */
43  *AccessRangeCount = 0;
44  return STATUS_SUCCESS;
45  }
46 
47  if (DriverExtension->InitializationData.HwGetLegacyResources)
48  {
49  ReadLength = HalGetBusData(PCIConfiguration,
50  DeviceExtension->SystemIoBusNumber,
51  DeviceExtension->SystemIoSlotNumber,
52  &PciConfig,
53  sizeof(PciConfig));
54  if (ReadLength != sizeof(PciConfig))
55  {
56  /* This device doesn't exist */
57  return STATUS_NO_SUCH_DEVICE;
58  }
59 
60  DriverExtension->InitializationData.HwGetLegacyResources(PciConfig.VendorID,
61  PciConfig.DeviceID,
62  AccessRanges,
63  AccessRangeCount);
64  }
65  else
66  {
67  *AccessRanges = DriverExtension->InitializationData.HwLegacyResourceList;
68  *AccessRangeCount = DriverExtension->InitializationData.HwLegacyResourceCount;
69  }
70 
71  INFO_(VIDEOPRT, "Got %d legacy access ranges\n", *AccessRangeCount);
72 
73  return STATUS_SUCCESS;
74 }
75 
79  IN PIRP Irp)
80 {
83  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
84  PVIDEO_ACCESS_RANGE AccessRanges;
85  ULONG AccessRangeCount, ListSize, i;
86  PIO_RESOURCE_REQUIREMENTS_LIST ResList, OldResList = (PVOID)Irp->IoStatus.Information;
87  PIO_RESOURCE_DESCRIPTOR CurrentDescriptor;
89 
90  DriverObject = DeviceObject->DriverObject;
92  DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
93 
94  Status = IntVideoPortGetLegacyResources(DriverExtension, DeviceExtension, &AccessRanges, &AccessRangeCount);
95  if (!NT_SUCCESS(Status))
96  return Status;
97  if (!AccessRangeCount)
98  {
99  /* No legacy resources to report */
100  return Irp->IoStatus.Information;
101  }
102 
103  /* OK, we've got the access ranges now. Let's set up the resource requirements list */
104 
105  if (OldResList)
106  {
107  /* Already one there so let's add to it */
108  ListSize = OldResList->ListSize + sizeof(IO_RESOURCE_DESCRIPTOR) * AccessRangeCount;
109  ResList = ExAllocatePool(NonPagedPool,
110  ListSize);
111  if (!ResList) return STATUS_NO_MEMORY;
112 
113  RtlCopyMemory(ResList, OldResList, OldResList->ListSize);
114 
115  ASSERT(ResList->AlternativeLists == 1);
116 
117  ResList->ListSize = ListSize;
118  ResList->List[0].Count += AccessRangeCount;
119 
120  CurrentDescriptor = (PIO_RESOURCE_DESCRIPTOR)((PUCHAR)ResList + OldResList->ListSize);
121 
122  ExFreePool(OldResList);
123  Irp->IoStatus.Information = 0;
124  }
125  else
126  {
127  /* We need to make a new one */
128  ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (AccessRangeCount - 1);
129  ResList = ExAllocatePool(NonPagedPool,
130  ListSize);
131  if (!ResList) return STATUS_NO_MEMORY;
132 
133  RtlZeroMemory(ResList, ListSize);
134 
135  /* We need to initialize some fields */
136  ResList->ListSize = ListSize;
137  ResList->InterfaceType = DeviceExtension->AdapterInterfaceType;
138  ResList->BusNumber = DeviceExtension->SystemIoBusNumber;
139  ResList->SlotNumber = DeviceExtension->SystemIoSlotNumber;
140  ResList->AlternativeLists = 1;
141  ResList->List[0].Version = 1;
142  ResList->List[0].Revision = 1;
143  ResList->List[0].Count = AccessRangeCount;
144 
145  CurrentDescriptor = ResList->List[0].Descriptors;
146  }
147 
148  for (i = 0; i < AccessRangeCount; i++)
149  {
150  /* This is a required resource */
151  CurrentDescriptor->Option = 0;
152 
153  if (AccessRanges[i].RangeInIoSpace)
154  CurrentDescriptor->Type = CmResourceTypePort;
155  else
156  CurrentDescriptor->Type = CmResourceTypeMemory;
157 
158  CurrentDescriptor->ShareDisposition =
160 
161  CurrentDescriptor->Flags = 0;
162 
163  if (CurrentDescriptor->Type == CmResourceTypePort)
164  {
165  CurrentDescriptor->u.Port.Length = AccessRanges[i].RangeLength;
166  CurrentDescriptor->u.Port.MinimumAddress =
167  CurrentDescriptor->u.Port.MaximumAddress = AccessRanges[i].RangeStart;
168  CurrentDescriptor->u.Port.Alignment = 1;
169  if (AccessRanges[i].RangePassive & VIDEO_RANGE_PASSIVE_DECODE)
170  CurrentDescriptor->Flags |= CM_RESOURCE_PORT_PASSIVE_DECODE;
171  if (AccessRanges[i].RangePassive & VIDEO_RANGE_10_BIT_DECODE)
172  CurrentDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
173  }
174  else
175  {
176  CurrentDescriptor->u.Memory.Length = AccessRanges[i].RangeLength;
177  CurrentDescriptor->u.Memory.MinimumAddress =
178  CurrentDescriptor->u.Memory.MaximumAddress = AccessRanges[i].RangeStart;
179  CurrentDescriptor->u.Memory.Alignment = 1;
180  CurrentDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
181  }
182 
183  CurrentDescriptor++;
184  }
185 
186  Irp->IoStatus.Information = (ULONG_PTR)ResList;
187 
188  return STATUS_SUCCESS;
189 }
190 
193  IN HANDLE Process,
195  IN ULONG SizeInBytes,
196  IN ULONG Protect,
198 {
199  OBJECT_ATTRIBUTES ObjAttribs;
201  HANDLE hMemObj;
203  SIZE_T Size;
204 
205  /* Initialize object attribs */
206  RtlInitUnicodeString(&UnicodeString, L"\\Device\\PhysicalMemory");
207  InitializeObjectAttributes(&ObjAttribs,
208  &UnicodeString,
210  NULL, NULL);
211 
212  /* Open physical memory section */
213  Status = ZwOpenSection(&hMemObj, SECTION_ALL_ACCESS, &ObjAttribs);
214  if (!NT_SUCCESS(Status))
215  {
216  WARN_(VIDEOPRT, "ZwOpenSection() failed! (0x%x)\n", Status);
217  return Status;
218  }
219 
220  /* Map view of section */
221  Size = SizeInBytes;
222  Status = ZwMapViewOfSection(hMemObj,
223  Process,
225  0,
226  Size,
228  &Size,
229  ViewUnmap,
230  0,
231  Protect);
232  ZwClose(hMemObj);
233  if (!NT_SUCCESS(Status))
234  {
235  WARN_(VIDEOPRT, "ZwMapViewOfSection() failed! (0x%x)\n", Status);
236  }
237 
238  return Status;
239 }
240 
241 
242 PVOID NTAPI
244  IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension,
245  IN PHYSICAL_ADDRESS IoAddress,
246  IN ULONG NumberOfUchars,
247  IN ULONG InIoSpace,
250 {
252  PVIDEO_PORT_ADDRESS_MAPPING AddressMapping;
254  PVOID MappedAddress;
256 
257  INFO_(VIDEOPRT, "- IoAddress: %lx\n", IoAddress.u.LowPart);
258  INFO_(VIDEOPRT, "- NumberOfUchars: %lx\n", NumberOfUchars);
259  INFO_(VIDEOPRT, "- InIoSpace: %x\n", InIoSpace);
260 
261  InIoSpace &= ~VIDEO_MEMORY_SPACE_DENSE;
262  if ((InIoSpace & VIDEO_MEMORY_SPACE_P6CACHE) != 0)
263  {
264  INFO_(VIDEOPRT, "VIDEO_MEMORY_SPACE_P6CACHE not supported, turning off\n");
265  InIoSpace &= ~VIDEO_MEMORY_SPACE_P6CACHE;
266  }
267 
268  if (ProcessHandle != NULL && (InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) == 0)
269  {
270  INFO_(VIDEOPRT, "ProcessHandle is not NULL (0x%x) but InIoSpace does not have "
271  "VIDEO_MEMORY_SPACE_USER_MODE set! Setting "
272  "VIDEO_MEMORY_SPACE_USER_MODE.\n",
273  ProcessHandle);
274  InIoSpace |= VIDEO_MEMORY_SPACE_USER_MODE;
275  }
276  else if (ProcessHandle == NULL && (InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) != 0)
277  {
278  INFO_(VIDEOPRT, "ProcessHandle is NULL (0x%x) but InIoSpace does have "
279  "VIDEO_MEMORY_SPACE_USER_MODE set! Setting ProcessHandle "
280  "to NtCurrentProcess()\n",
281  ProcessHandle);
283  }
284 
285  if ((InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) == 0 &&
286  !IsListEmpty(&DeviceExtension->AddressMappingListHead))
287  {
288  Entry = DeviceExtension->AddressMappingListHead.Flink;
289  while (Entry != &DeviceExtension->AddressMappingListHead)
290  {
291  AddressMapping = CONTAINING_RECORD(
292  Entry,
294  List);
295  if (IoAddress.QuadPart == AddressMapping->IoAddress.QuadPart &&
296  NumberOfUchars <= AddressMapping->NumberOfUchars)
297  {
298  {
299  AddressMapping->MappingCount++;
300  if (Status)
301  *Status = NO_ERROR;
302  return AddressMapping->MappedAddress;
303  }
304  }
305  Entry = Entry->Flink;
306  }
307  }
308 
309  AddressSpace = (ULONG)InIoSpace;
312  DeviceExtension->AdapterInterfaceType,
313  DeviceExtension->SystemIoBusNumber,
314  IoAddress,
315  &AddressSpace,
317  {
318  if (Status)
320 
321  return NULL;
322  }
323 
324  /* I/O space */
325  if (AddressSpace != 0)
326  {
327  ASSERT(0 == TranslatedAddress.u.HighPart);
328  if (Status)
329  *Status = NO_ERROR;
330 
331  return (PVOID)(ULONG_PTR)TranslatedAddress.u.LowPart;
332  }
333 
334  /* user space */
335  if ((InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) != 0)
336  {
337  NTSTATUS NtStatus;
338  MappedAddress = NULL;
341  NumberOfUchars,
342  PAGE_READWRITE/* | PAGE_WRITECOMBINE*/,
343  &MappedAddress);
344  if (!NT_SUCCESS(NtStatus))
345  {
346  WARN_(VIDEOPRT, "IntVideoPortMapPhysicalMemory() failed! (0x%x)\n", NtStatus);
347  if (Status)
348  *Status = NO_ERROR;
349  return NULL;
350  }
351  INFO_(VIDEOPRT, "Mapped user address = 0x%08x\n", MappedAddress);
352  }
353  else /* kernel space */
354  {
355  MappedAddress = MmMapIoSpace(
357  NumberOfUchars,
358  MmNonCached);
359  }
360 
361  if (MappedAddress != NULL)
362  {
363  if (Status)
364  {
365  *Status = NO_ERROR;
366  }
367  if ((InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) == 0)
368  {
369  AddressMapping = ExAllocatePoolWithTag(
370  PagedPool,
373 
374  if (AddressMapping == NULL)
375  return MappedAddress;
376 
377  RtlZeroMemory(AddressMapping, sizeof(VIDEO_PORT_ADDRESS_MAPPING));
378  AddressMapping->NumberOfUchars = NumberOfUchars;
379  AddressMapping->IoAddress = IoAddress;
380  AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
381  AddressMapping->MappedAddress = MappedAddress;
382  AddressMapping->MappingCount = 1;
384  &DeviceExtension->AddressMappingListHead,
385  &AddressMapping->List);
386  }
387 
388  return MappedAddress;
389  }
390 
391  if (Status)
392  *Status = NO_ERROR;
393 
394  return NULL;
395 }
396 
397 VOID NTAPI
399  IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension,
400  IN PVOID MappedAddress)
401 {
402  PVIDEO_PORT_ADDRESS_MAPPING AddressMapping;
405 
406  Entry = DeviceExtension->AddressMappingListHead.Flink;
407  while (Entry != &DeviceExtension->AddressMappingListHead)
408  {
409  AddressMapping = CONTAINING_RECORD(
410  Entry,
412  List);
413  if (AddressMapping->MappedAddress == MappedAddress)
414  {
415  ASSERT(AddressMapping->MappingCount > 0);
416  AddressMapping->MappingCount--;
417  if (AddressMapping->MappingCount == 0)
418  {
420  AddressMapping->MappedAddress,
421  AddressMapping->NumberOfUchars);
423  ExFreePool(AddressMapping);
424  }
425  return;
426  }
427 
428  Entry = Entry->Flink;
429  }
430 
431  /* If there was no kernelmode mapping for the given address found we assume
432  * that the given address is a usermode mapping and try to unmap it.
433  *
434  * FIXME: Is it ok to use NtCurrentProcess?
435  */
436  Status = ZwUnmapViewOfSection(NtCurrentProcess(), MappedAddress);
437  if (!NT_SUCCESS(Status))
438  {
439  WARN_(VIDEOPRT, "Warning: Mapping for address 0x%p not found!\n", MappedAddress);
440  }
441 }
442 
443 /* PUBLIC FUNCTIONS ***********************************************************/
444 
445 /*
446  * @implemented
447  */
448 
449 PVOID NTAPI
451  IN PVOID HwDeviceExtension,
452  IN PHYSICAL_ADDRESS IoAddress,
453  IN ULONG NumberOfUchars,
454  IN UCHAR InIoSpace)
455 {
456  TRACE_(VIDEOPRT, "VideoPortGetDeviceBase\n");
457  return IntVideoPortMapMemory(
458  VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension),
459  IoAddress,
460  NumberOfUchars,
461  InIoSpace,
462  NULL,
463  NULL);
464 }
465 
466 /*
467  * @implemented
468  */
469 
470 VOID NTAPI
472  IN PVOID HwDeviceExtension,
473  IN PVOID MappedAddress)
474 {
475  TRACE_(VIDEOPRT, "VideoPortFreeDeviceBase\n");
477  VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension),
478  MappedAddress);
479 }
480 
481 /*
482  * @unimplemented
483  */
484 
487  IN PVOID HwDeviceExtension,
489  IN PULONG Length,
490  IN PULONG InIoSpace,
492  IN ULONG BankLength,
493  IN UCHAR ReadWriteBank,
494  IN PBANKED_SECTION_ROUTINE BankRoutine,
495  IN PVOID Context)
496 {
497  TRACE_(VIDEOPRT, "VideoPortMapBankedMemory\n");
499  return ERROR_INVALID_FUNCTION;
500 }
501 
502 
503 /*
504  * @implemented
505  */
506 
509  IN PVOID HwDeviceExtension,
511  IN PULONG Length,
512  IN PULONG InIoSpace,
514 {
515  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
517 
518  TRACE_(VIDEOPRT, "VideoPortMapMemory\n");
519  INFO_(VIDEOPRT, "- *VirtualAddress: 0x%x\n", *VirtualAddress);
520 
521  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
523  DeviceExtension,
525  *Length,
526  *InIoSpace,
528  &Status);
529 
530  return Status;
531 }
532 
533 /*
534  * @implemented
535  */
536 
539  IN PVOID HwDeviceExtension,
542 {
543  TRACE_(VIDEOPRT, "VideoPortFreeDeviceBase\n");
544 
546  VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension),
548 
549  return NO_ERROR;
550 }
551 
552 /*
553  * @implemented
554  */
555 
558  IN PVOID HwDeviceExtension,
559  IN ULONG NumRequestedResources,
560  IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL,
561  IN ULONG NumAccessRanges,
562  IN PVIDEO_ACCESS_RANGE AccessRanges,
563  IN PVOID VendorId,
564  IN PVOID DeviceId,
565  OUT PULONG Slot)
566 {
567  PCI_SLOT_NUMBER PciSlotNumber;
569  ULONG FunctionNumber;
573  UINT AssignedCount = 0;
574  CM_FULL_RESOURCE_DESCRIPTOR *FullList;
576  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
578  USHORT VendorIdToFind;
579  USHORT DeviceIdToFind;
581  PVIDEO_ACCESS_RANGE LegacyAccessRanges;
582  ULONG LegacyAccessRangeCount;
584  ULONG ListSize;
586  BOOLEAN DeviceAndVendorFound = FALSE;
587 
588  TRACE_(VIDEOPRT, "VideoPortGetAccessRanges(%d, %p, %d, %p)\n", NumRequestedResources, RequestedResources, NumAccessRanges, AccessRanges);
589 
590  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
591  DriverObject = DeviceExtension->DriverObject;
593 
594  if (NumRequestedResources == 0)
595  {
596  AllocatedResources = DeviceExtension->AllocatedResources;
597  if (AllocatedResources == NULL &&
598  DeviceExtension->AdapterInterfaceType == PCIBus)
599  {
600  if (DeviceExtension->PhysicalDeviceObject != NULL)
601  {
602  PciSlotNumber.u.AsULONG = DeviceExtension->SystemIoSlotNumber;
603 
605  DeviceExtension->SystemIoBusNumber,
606  PciSlotNumber.u.AsULONG,
607  &Config,
608  sizeof(PCI_COMMON_CONFIG));
609 
610  if (ReturnedLength != sizeof(PCI_COMMON_CONFIG))
611  {
613  }
614  }
615  else
616  {
617  VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0;
618  DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0;
619 
620  if (VendorIdToFind == 0 && DeviceIdToFind == 0)
621  {
622  /* We're screwed */
623  return ERROR_DEV_NOT_EXIST;
624  }
625 
626  INFO_(VIDEOPRT, "Looking for VendorId 0x%04x DeviceId 0x%04x\n",
627  VendorIdToFind, DeviceIdToFind);
628 
629  /*
630  * Search for the device id and vendor id on this bus.
631  */
632  PciSlotNumber.u.bits.Reserved = 0;
634  {
635  PciSlotNumber.u.bits.DeviceNumber = DeviceNumber;
636  for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
637  {
638  INFO_(VIDEOPRT, "- Function number: %d\n", FunctionNumber);
639  PciSlotNumber.u.bits.FunctionNumber = FunctionNumber;
641  DeviceExtension->SystemIoBusNumber,
642  PciSlotNumber.u.AsULONG,
643  &Config,
644  sizeof(PCI_COMMON_CONFIG));
645  INFO_(VIDEOPRT, "- Length of data: %x\n", ReturnedLength);
646  if (ReturnedLength == sizeof(PCI_COMMON_CONFIG))
647  {
648  INFO_(VIDEOPRT, "- Slot 0x%02x (Device %d Function %d) VendorId 0x%04x "
649  "DeviceId 0x%04x\n",
650  PciSlotNumber.u.AsULONG,
651  PciSlotNumber.u.bits.DeviceNumber,
652  PciSlotNumber.u.bits.FunctionNumber,
653  Config.VendorID,
654  Config.DeviceID);
655 
656  if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind) &&
657  (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind))
658  {
659  DeviceAndVendorFound = TRUE;
660  break;
661  }
662  }
663  }
664  if (DeviceAndVendorFound) break;
665  }
666  if (FunctionNumber == PCI_MAX_FUNCTION)
667  {
668  WARN_(VIDEOPRT, "Didn't find device.\n");
669  return ERROR_DEV_NOT_EXIST;
670  }
671  }
672 
673  Status = HalAssignSlotResources(&DeviceExtension->RegistryPath,
674  NULL,
675  DeviceExtension->DriverObject,
676  DeviceExtension->DriverObject->DeviceObject,
677  DeviceExtension->AdapterInterfaceType,
678  DeviceExtension->SystemIoBusNumber,
679  PciSlotNumber.u.AsULONG,
681 
682  if (!NT_SUCCESS(Status))
683  {
684  WARN_(VIDEOPRT, "HalAssignSlotResources failed with status %x.\n",Status);
685  return Status;
686  }
687  DeviceExtension->AllocatedResources = AllocatedResources;
688  DeviceExtension->SystemIoSlotNumber = PciSlotNumber.u.AsULONG;
689 
690  /* Add legacy resources to the resources from HAL */
692  &LegacyAccessRanges, &LegacyAccessRangeCount);
693  if (!NT_SUCCESS(Status))
694  return ERROR_DEV_NOT_EXIST;
695 
696  if (NumAccessRanges < LegacyAccessRangeCount)
697  {
698  ERR_(VIDEOPRT, "Too many legacy access ranges found\n");
700  }
701 
702  RtlCopyMemory(AccessRanges, LegacyAccessRanges, LegacyAccessRangeCount * sizeof(VIDEO_ACCESS_RANGE));
703  AssignedCount = LegacyAccessRangeCount;
704  }
705  }
706  else
707  {
708  ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + (NumRequestedResources - 1) * sizeof(IO_RESOURCE_DESCRIPTOR);
709  ResReqList = ExAllocatePool(NonPagedPool, ListSize);
710  if (!ResReqList) return ERROR_NOT_ENOUGH_MEMORY;
711 
712  ResReqList->ListSize = ListSize;
713  ResReqList->InterfaceType = DeviceExtension->AdapterInterfaceType;
714  ResReqList->BusNumber = DeviceExtension->SystemIoBusNumber;
715  ResReqList->SlotNumber = DeviceExtension->SystemIoSlotNumber;
716  ResReqList->AlternativeLists = 1;
717  ResReqList->List[0].Version = 1;
718  ResReqList->List[0].Revision = 1;
719  ResReqList->List[0].Count = NumRequestedResources;
720 
721  /* Copy in the caller's resource list */
722  RtlCopyMemory(ResReqList->List[0].Descriptors,
723  RequestedResources,
724  NumRequestedResources * sizeof(IO_RESOURCE_DESCRIPTOR));
725 
726  Status = IoAssignResources(&DeviceExtension->RegistryPath,
727  NULL,
728  DeviceExtension->DriverObject,
729  DeviceExtension->PhysicalDeviceObject ?
730  DeviceExtension->PhysicalDeviceObject :
731  DeviceExtension->DriverObject->DeviceObject,
732  ResReqList,
734 
735  if (!NT_SUCCESS(Status))
736  return Status;
737 
738  if (!DeviceExtension->AllocatedResources)
739  DeviceExtension->AllocatedResources = AllocatedResources;
740  }
741 
742  if (AllocatedResources == NULL)
744 
745  /* Return the slot number if the caller wants it */
746  if (Slot != NULL) *Slot = DeviceExtension->SystemIoBusNumber;
747 
748  FullList = AllocatedResources->List;
749  ASSERT(AllocatedResources->Count == 1);
750  INFO_(VIDEOPRT, "InterfaceType %u BusNumber List %u Device BusNumber %u Version %u Revision %u\n",
751  FullList->InterfaceType, FullList->BusNumber, DeviceExtension->SystemIoBusNumber, FullList->PartialResourceList.Version, FullList->PartialResourceList.Revision);
752 
753  ASSERT(FullList->InterfaceType == PCIBus);
754  ASSERT(FullList->BusNumber == DeviceExtension->SystemIoBusNumber);
755  ASSERT(1 == FullList->PartialResourceList.Version);
756  ASSERT(1 == FullList->PartialResourceList.Revision);
758  Descriptor < FullList->PartialResourceList.PartialDescriptors + FullList->PartialResourceList.Count;
759  Descriptor++)
760  {
761  if ((Descriptor->Type == CmResourceTypeMemory ||
762  Descriptor->Type == CmResourceTypePort) &&
763  AssignedCount >= NumAccessRanges)
764  {
765  ERR_(VIDEOPRT, "Too many access ranges found\n");
767  }
768  else if (Descriptor->Type == CmResourceTypeMemory)
769  {
770  INFO_(VIDEOPRT, "Memory range starting at 0x%08x length 0x%08x\n",
771  Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.Length);
772  AccessRanges[AssignedCount].RangeStart = Descriptor->u.Memory.Start;
773  AccessRanges[AssignedCount].RangeLength = Descriptor->u.Memory.Length;
774  AccessRanges[AssignedCount].RangeInIoSpace = 0;
775  AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
776  AccessRanges[AssignedCount].RangeShareable =
777  (Descriptor->ShareDisposition == CmResourceShareShared);
778  AccessRanges[AssignedCount].RangePassive = 0;
779  AssignedCount++;
780  }
781  else if (Descriptor->Type == CmResourceTypePort)
782  {
783  INFO_(VIDEOPRT, "Port range starting at 0x%04x length %d\n",
784  Descriptor->u.Port.Start.u.LowPart, Descriptor->u.Port.Length);
785  AccessRanges[AssignedCount].RangeStart = Descriptor->u.Port.Start;
786  AccessRanges[AssignedCount].RangeLength = Descriptor->u.Port.Length;
787  AccessRanges[AssignedCount].RangeInIoSpace = 1;
788  AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
789  AccessRanges[AssignedCount].RangeShareable =
790  (Descriptor->ShareDisposition == CmResourceShareShared);
791  AccessRanges[AssignedCount].RangePassive = 0;
793  AccessRanges[AssignedCount].RangePassive |= VIDEO_RANGE_10_BIT_DECODE;
795  AccessRanges[AssignedCount].RangePassive |= VIDEO_RANGE_PASSIVE_DECODE;
796  AssignedCount++;
797  }
798  else if (Descriptor->Type == CmResourceTypeInterrupt)
799  {
800  DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level;
801  DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector;
802  if (Descriptor->ShareDisposition == CmResourceShareShared)
803  DeviceExtension->InterruptShared = TRUE;
804  else
805  DeviceExtension->InterruptShared = FALSE;
806  }
807  else
808  {
809  ASSERT(FALSE);
811  }
812  }
813 
814  return NO_ERROR;
815 }
816 
817 /*
818  * @implemented
819  */
820 
823  IN PVOID HwDeviceExtension,
824  IN ULONG NumAccessRanges,
825  IN PVIDEO_ACCESS_RANGE AccessRanges)
826 {
827  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
828  BOOLEAN ConflictDetected;
829  ULONG i;
830  PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
832  ULONG ResourceListSize;
834 
835  TRACE_(VIDEOPRT, "VideoPortVerifyAccessRanges\n");
836 
837  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
838 
839  /* Create the resource list */
840  ResourceListSize = sizeof(CM_RESOURCE_LIST)
841  + (NumAccessRanges - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
842  ResourceList = ExAllocatePool(PagedPool, ResourceListSize);
843  if (!ResourceList)
844  {
845  WARN_(VIDEOPRT, "ExAllocatePool() failed\n");
847  }
848 
849  /* Fill resource list */
850  ResourceList->Count = 1;
851  ResourceList->List[0].InterfaceType = DeviceExtension->AdapterInterfaceType;
852  ResourceList->List[0].BusNumber = DeviceExtension->SystemIoBusNumber;
853  ResourceList->List[0].PartialResourceList.Version = 1;
854  ResourceList->List[0].PartialResourceList.Revision = 1;
855  ResourceList->List[0].PartialResourceList.Count = NumAccessRanges;
856  for (i = 0; i < NumAccessRanges; i++, AccessRanges++)
857  {
858  PartialDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
859  if (AccessRanges->RangeInIoSpace)
860  {
861  PartialDescriptor->Type = CmResourceTypePort;
862  PartialDescriptor->u.Port.Start = AccessRanges->RangeStart;
863  PartialDescriptor->u.Port.Length = AccessRanges->RangeLength;
864  }
865  else
866  {
867  PartialDescriptor->Type = CmResourceTypeMemory;
868  PartialDescriptor->u.Memory.Start = AccessRanges->RangeStart;
869  PartialDescriptor->u.Memory.Length = AccessRanges->RangeLength;
870  }
871  if (AccessRanges->RangeShareable)
872  PartialDescriptor->ShareDisposition = CmResourceShareShared;
873  else
875  PartialDescriptor->Flags = 0;
876  if (AccessRanges->RangePassive & VIDEO_RANGE_PASSIVE_DECODE)
877  PartialDescriptor->Flags |= CM_RESOURCE_PORT_PASSIVE_DECODE;
878  if (AccessRanges->RangePassive & VIDEO_RANGE_10_BIT_DECODE)
879  PartialDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
880  }
881 
882  /* Try to acquire all resource ranges */
884  DeviceExtension->DriverObject,
885  NULL, 0, /* Driver List */
886  DeviceExtension->PhysicalDeviceObject,
887  ResourceList, ResourceListSize,
888  &ConflictDetected);
890 
891  if (!NT_SUCCESS(Status) || ConflictDetected)
893  else
894  return NO_ERROR;
895 }
896 
897 /*
898  * @unimplemented
899  */
900 
903  IN PVOID HwDeviceExtension,
904  IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
906  IN PVOID Context)
907 {
908  TRACE_(VIDEOPRT, "VideoPortGetDeviceData\n");
910  return ERROR_INVALID_FUNCTION;
911 }
912 
913 /*
914  * @implemented
915  */
916 
917 PVOID NTAPI
919  IN PVOID HwDeviceExtension,
922  IN ULONG Tag)
923 {
924  TRACE_(VIDEOPRT, "VideoPortAllocatePool\n");
926 }
927 
928 /*
929  * @implemented
930  */
931 
932 VOID NTAPI
934  IN PVOID HwDeviceExtension,
935  IN PVOID Ptr)
936 {
937  ExFreePool(Ptr);
938 }
939 
940 /*
941  * @implemented
942  */
943 
946  IN PVOID HwDeviceExtension,
947  IN ULONG Size,
948  OUT PVOID *Buffer)
949 {
950  TRACE_(VIDEOPRT, "VideoPortAllocateBuffer\n");
953 }
954 
955 /*
956  * @implemented
957  */
958 
959 VOID NTAPI
961  IN PVOID HwDeviceExtension,
962  IN PVOID Ptr)
963 {
964  TRACE_(VIDEOPRT, "VideoPortReleaseBuffer\n");
965  ExFreePool(Ptr);
966 }
967 
968 /*
969  * @implemented
970  */
971 
972 PVOID NTAPI
974  IN PVOID HwDeviceExtension,
976  IN ULONG Length,
978 {
979  PMDL Mdl;
980 
982  if (!Mdl)
983  {
984  return NULL;
985  }
986  /* FIXME use seh */
988  return Mdl;
989 }
990 
991 /*
992  * @implemented
993  */
994 
995 BOOLEAN
996 NTAPI
998  IN PVOID HwDeviceExtension,
1000  IN PEVENT pUEvent,
1001  IN PEVENT pDisplayEvent,
1002  IN DMA_FLAGS DmaFlags)
1003 {
1004  PVOID Buffer;
1005 
1006  /* clear output buffer */
1007  pVrp->OutputBuffer = NULL;
1008 
1009  if (DmaFlags != VideoPortDmaInitOnly)
1010  {
1011  /* VideoPortKeepPagesLocked / VideoPortUnlockAfterDma is no-op */
1012  return FALSE;
1013  }
1014 
1015  /* lock the buffer */
1016  Buffer = VideoPortLockBuffer(HwDeviceExtension, pVrp->InputBuffer, pVrp->InputBufferLength, IoModifyAccess);
1017 
1018  if (Buffer)
1019  {
1020  /* store result buffer & length */
1021  pVrp->OutputBuffer = Buffer;
1022  pVrp->OutputBufferLength = pVrp->InputBufferLength;
1023 
1024  /* operation succeeded */
1025  return TRUE;
1026  }
1027 
1028  /* operation failed */
1029  return FALSE;
1030 }
1031 
1032 
1033 /*
1034  * @implemented
1035  */
1036 
1037 VOID NTAPI
1039  IN PVOID HwDeviceExtension,
1040  IN PVOID Mdl)
1041 {
1042  if (Mdl)
1043  {
1044  MmUnlockPages((PMDL)Mdl);
1045  IoFreeMdl(Mdl);
1046  }
1047 }
1048 
1049 /*
1050  * @unimplemented
1051  */
1052 
1055  IN PVOID HwDeviceExtension,
1056  IN ULONG NumAccessRanges,
1057  IN PVIDEO_ACCESS_RANGE AccessRange)
1058 {
1059  UNIMPLEMENTED;
1060  /* Should store the ranges in the device extension for use by ntvdm. */
1061  return NO_ERROR;
1062 }
1063 
1064 /*
1065  * @implemented
1066  */
1067 
1068 ULONG NTAPI
1070  IN PVOID HwDeviceExtension,
1071  IN BUS_DATA_TYPE BusDataType,
1073  OUT PVOID Buffer,
1074  IN ULONG Offset,
1075  IN ULONG Length)
1076 {
1077  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1078 
1079  TRACE_(VIDEOPRT, "VideoPortGetBusData\n");
1080 
1081  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1082 
1083  if (BusDataType != Cmos)
1084  {
1085  /* Legacy vs. PnP behaviour */
1086  if (DeviceExtension->PhysicalDeviceObject != NULL)
1087  SlotNumber = DeviceExtension->SystemIoSlotNumber;
1088  }
1089 
1090  return HalGetBusDataByOffset(
1091  BusDataType,
1092  DeviceExtension->SystemIoBusNumber,
1093  SlotNumber,
1094  Buffer,
1095  Offset,
1096  Length);
1097 }
1098 
1099 /*
1100  * @implemented
1101  */
1102 
1103 ULONG NTAPI
1105  IN PVOID HwDeviceExtension,
1106  IN BUS_DATA_TYPE BusDataType,
1108  IN PVOID Buffer,
1109  IN ULONG Offset,
1110  IN ULONG Length)
1111 {
1112  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1113 
1114  TRACE_(VIDEOPRT, "VideoPortSetBusData\n");
1115 
1116  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1117 
1118  if (BusDataType != Cmos)
1119  {
1120  /* Legacy vs. PnP behaviour */
1121  if (DeviceExtension->PhysicalDeviceObject != NULL)
1122  SlotNumber = DeviceExtension->SystemIoSlotNumber;
1123  }
1124 
1125  return HalSetBusDataByOffset(
1126  BusDataType,
1127  DeviceExtension->SystemIoBusNumber,
1128  SlotNumber,
1129  Buffer,
1130  Offset,
1131  Length);
1132 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
struct _IO_RESOURCE_REQUIREMENTS_LIST IO_RESOURCE_REQUIREMENTS_LIST
#define VIDEO_MEMORY_SPACE_DENSE
Definition: video.h:135
VP_STATUS NTAPI VideoPortAllocateBuffer(IN PVOID HwDeviceExtension, IN ULONG Size, OUT PVOID *Buffer)
Definition: resource.c:945
#define IN
Definition: typedefs.h:39
#define TAG_VIDEO_PORT
Definition: videoprt.h:38
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
VOID NTAPI VideoPortFreePool(IN PVOID HwDeviceExtension, IN PVOID Ptr)
Definition: resource.c:933
*BytesInUnicodeString PWCH UnicodeString
Definition: rtlfuncs.h:1979
NTSTATUS NTAPI IntVideoPortGetLegacyResources(IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, OUT PVIDEO_ACCESS_RANGE *AccessRanges, OUT PULONG AccessRangeCount)
Definition: resource.c:30
ULONG NTAPI VideoPortGetBusData(IN PVOID HwDeviceExtension, IN BUS_DATA_TYPE BusDataType, IN ULONG SlotNumber, OUT PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: resource.c:1069
#define INFO_(ch,...)
Definition: debug.h:159
struct _Entry Entry
Definition: kefuncs.h:627
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG _In_ ULONG Protect
Definition: zwfuncs.h:214
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PCM_RESOURCE_LIST * AllocatedResources
Definition: ndis.h:4640
_In_ PIRP Irp
Definition: csq.h:116
#define VIDEO_MEMORY_SPACE_P6CACHE
Definition: video.h:136
#define TRUE
Definition: types.h:120
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
Definition: rtlfuncs.h:201
enum _BUS_DATA_TYPE BUS_DATA_TYPE
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2268
VOID NTAPI VideoPortFreeDeviceBase(IN PVOID HwDeviceExtension, IN PVOID MappedAddress)
Definition: resource.c:471
unsigned char * PUCHAR
Definition: retypes.h:3
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
PHYSICAL_ADDRESS IoAddress
Definition: videoprt.h:49
#define ERR_(ch,...)
Definition: debug.h:156
static int Config(const char **args)
Definition: vfdcmd.c:778
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI IoReportResourceForDetection(IN PDRIVER_OBJECT DriverObject, IN PCM_RESOURCE_LIST DriverList OPTIONAL, IN ULONG DriverListSize OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PCM_RESOURCE_LIST DeviceList OPTIONAL, IN ULONG DeviceListSize OPTIONAL, OUT PBOOLEAN ConflictDetected)
Definition: pnpreport.c:411
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
PVOID NTAPI VideoPortLockBuffer(IN PVOID HwDeviceExtension, IN PVOID BaseAddress, IN ULONG Length, IN VP_LOCK_OPERATION Operation)
Definition: resource.c:973
VP_STATUS NTAPI VideoPortMapMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN PULONG Length, IN PULONG InIoSpace, OUT PVOID *VirtualAddress)
Definition: resource.c:508
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
PCM_RESOURCE_LIST AllocatedResources
Definition: videoprt.h:94
struct _PCI_SLOT_NUMBER::@3763::@3764 bits
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
Definition: mdlsup.c:1439
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:137
PVOID NTAPI MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
Definition: iosup.c:47
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG _Out_ PPHYSICAL_ADDRESS TranslatedAddress
Definition: iofuncs.h:2268
#define NO_ERROR
Definition: dderror.h:5
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
const MUI_LANGUAGE_RESOURCE ResourceList[]
Definition: muilanguages.h:414
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR CM_PARTIAL_RESOURCE_DESCRIPTOR
NTSTATUS NTAPI IntVideoPortMapPhysicalMemory(IN HANDLE Process, IN PHYSICAL_ADDRESS PhysicalAddress, IN ULONG SizeInBytes, IN ULONG Protect, IN OUT PVOID *VirtualAddress OPTIONAL)
Definition: resource.c:192
#define CM_RESOURCE_MEMORY_READ_WRITE
Definition: cmtypes.h:120
#define CmResourceTypePort
Definition: hwresource.cpp:123
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@384::@389 Memory
VP_STATUS NTAPI VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, IN ULONG NumRequestedResources, IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL, IN ULONG NumAccessRanges, IN PVIDEO_ACCESS_RANGE AccessRanges, IN PVOID VendorId, IN PVOID DeviceId, OUT PULONG Slot)
Definition: resource.c:557
_Must_inspect_result_ _In_ PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine
Definition: fltkernel.h:1035
CM_PARTIAL_RESOURCE_LIST PartialResourceList
Definition: hwresource.cpp:160
#define SECTION_ALL_ACCESS
Definition: nt_native.h:1293
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
VOID(NTAPI * PBANKED_SECTION_ROUTINE)(IN ULONG ReadBank, IN ULONG WriteBank, IN PVOID Context)
Definition: miniport.h:50
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define TAG_VIDEO_PORT_BUFFER
Definition: videoprt.h:39
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define FALSE
Definition: types.h:117
NTSTATUS NTAPI IntVideoPortFilterResourceRequirements(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: resource.c:77
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:87
union _PCI_SLOT_NUMBER::@3763 u
#define VIDEO_RANGE_PASSIVE_DECODE
Definition: video.h:98
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
static PDRIVER_OBJECT DriverObject
Definition: template.c:42
#define VIDEO_RANGE_10_BIT_DECODE
Definition: video.h:99
Definition: bufpool.h:45
void * PVOID
Definition: retypes.h:9
VP_STATUS(NTAPI * PMINIPORT_QUERY_DEVICE_ROUTINE)(IN PVOID HwDeviceExtension, IN PVOID Context, IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, IN PVOID Identifier, IN ULONG IdentifierLength, IN PVOID ConfigurationData, IN ULONG ConfigurationDataLength, IN OUT PVOID ComponentInformation, IN ULONG ComponentInformationLength)
Definition: video.h:498
VP_STATUS NTAPI VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension, IN ULONG NumAccessRanges, IN PVIDEO_ACCESS_RANGE AccessRange)
Definition: resource.c:1054
NTHALAPI NTSTATUS NTAPI HalAssignSlotResources(PUNICODE_STRING, PUNICODE_STRING, PDRIVER_OBJECT, PDEVICE_OBJECT, INTERFACE_TYPE, ULONG, ULONG, PCM_RESOURCE_LIST *)
#define CM_RESOURCE_PORT_10_BIT_DECODE
Definition: cmtypes.h:110
enum _VP_LOCK_OPERATION VP_LOCK_OPERATION
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
PVOID NTAPI VideoPortAllocatePool(IN PVOID HwDeviceExtension, IN VP_POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
Definition: resource.c:918
#define NtCurrentProcess()
Definition: nt_native.h:1657
struct _IO_RESOURCE_DESCRIPTOR IO_RESOURCE_DESCRIPTOR
#define TRACE_(x)
Definition: compat.h:76
IO_RESOURCE_DESCRIPTOR Descriptors[1]
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
BOOLEAN NTAPI VideoPortLockPages(IN PVOID HwDeviceExtension, IN OUT PVIDEO_REQUEST_PACKET pVrp, IN PEVENT pUEvent, IN PEVENT pDisplayEvent, IN DMA_FLAGS DmaFlags)
Definition: resource.c:997
VP_STATUS NTAPI VideoPortUnmapMemory(IN PVOID HwDeviceExtension, IN PVOID VirtualAddress, IN HANDLE ProcessHandle)
Definition: resource.c:538
Definition: miniport.h:89
LIST_ENTRY List
Definition: psmgr.c:57
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@384::@386 Port
#define PCI_MAX_DEVICES
Definition: iotypes.h:3577
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: cdrom.h:932
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define CM_RESOURCE_PORT_PASSIVE_DECODE
Definition: cmtypes.h:114
VOID NTAPI IoFreeMdl(PMDL Mdl)
Definition: iomdl.c:146
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG _In_ ULONG SlotNumber
Definition: halfuncs.h:156
UCHAR RangeShareable
Definition: video.h:219
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1081
unsigned char UCHAR
Definition: xmlstorage.h:181
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
Definition: hwresource.cpp:119
struct _IO_RESOURCE_DESCRIPTOR * PIO_RESOURCE_DESCRIPTOR
ULONG NTAPI HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:73
Status
Definition: gdiplustypes.h:24
static const WCHAR L[]
Definition: oid.c:1250
ULONG NTAPI VideoPortSetBusData(IN PVOID HwDeviceExtension, IN BUS_DATA_TYPE BusDataType, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: resource.c:1104
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1866
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG _In_ ULONG _Out_ PULONG ReturnedLength
Definition: batclass.h:187
Definition: typedefs.h:119
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3791
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:41
struct _CM_RESOURCE_LIST CM_RESOURCE_LIST
VOID NTAPI VideoPortUnlockBuffer(IN PVOID HwDeviceExtension, IN PVOID Mdl)
Definition: resource.c:1038
enum _VP_POOL_TYPE VP_POOL_TYPE
BOOLEAN NTAPI HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress)
Definition: bus.c:140
#define PCI_MAX_FUNCTION
Definition: iotypes.h:3578
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:86
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
Definition: iomdl.c:22
ULONG_PTR SIZE_T
Definition: typedefs.h:80
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:935
unsigned short USHORT
Definition: pedump.c:61
PVOID NTAPI VideoPortGetDeviceBase(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, IN UCHAR InIoSpace)
Definition: resource.c:450
VOID NTAPI MmUnmapIoSpace(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes)
Definition: iosup.c:193
VOID NTAPI VideoPortReleaseBuffer(IN PVOID HwDeviceExtension, IN PVOID Ptr)
Definition: resource.c:960
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
enum _VIDEO_DEVICE_DATA_TYPE VIDEO_DEVICE_DATA_TYPE
_In_ PDEVICE_OBJECT DeviceObject
Definition: iotypes.h:2464
unsigned int * PULONG
Definition: retypes.h:1
unsigned int UINT
Definition: ndis.h:50
#define CmResourceTypeInterrupt
Definition: hwresource.cpp:124
IN ULONG IN ULONG Tag
Definition: evtlib.h:159
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define VIDEO_MEMORY_SPACE_USER_MODE
Definition: video.h:134
#define OUT
Definition: typedefs.h:40
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1018
unsigned int ULONG
Definition: retypes.h:1
enum _DMA_FLAGS DMA_FLAGS
VP_STATUS NTAPI VideoPortVerifyAccessRanges(IN PVOID HwDeviceExtension, IN ULONG NumAccessRanges, IN PVIDEO_ACCESS_RANGE AccessRanges)
Definition: resource.c:822
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define UNIMPLEMENTED
Definition: debug.h:115
NTHALAPI ULONG NTAPI HalGetBusData(BUS_DATA_TYPE, ULONG, ULONG, PVOID, ULONG)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define ULONG_PTR
Definition: config.h:101
_In_ FLT_SET_CONTEXT_OPERATION Operation
Definition: fltkernel.h:1468
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
LONG VP_STATUS
Definition: video.h:153
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
struct _LARGE_INTEGER::@2267 u
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1229
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@384 u
NTSYSAPI NTSTATUS NTAPI ZwOpenSection(_Out_ PHANDLE SectionHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
#define CmResourceTypeMemory
Definition: hwresource.cpp:125
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:403
INTERFACE_TYPE AdapterInterfaceType
Definition: videoprt.h:98
ULONG NTAPI HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:123
return STATUS_SUCCESS
Definition: btrfs.c:3014
_Must_inspect_result_ _In_ FLT_CONTEXT_TYPE _In_ SIZE_T _In_ POOL_TYPE PoolType
Definition: fltkernel.h:1444
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
#define WARN_(ch,...)
Definition: debug.h:157
VP_STATUS NTAPI VideoPortMapBankedMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN PULONG Length, IN PULONG InIoSpace, OUT PVOID *VirtualAddress, IN ULONG BankLength, IN UCHAR ReadWriteBank, IN PBANKED_SECTION_ROUTINE BankRoutine, IN PVOID Context)
Definition: resource.c:486
ULONG RangeLength
Definition: video.h:216
unsigned short * PUSHORT
Definition: retypes.h:2
base of all file and directory entries
Definition: entries.h:82
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
PDEVICE_OBJECT DeviceObject
Definition: iotypes.h:2257
LONGLONG QuadPart
Definition: typedefs.h:114
NTSTATUS NTAPI IoAssignResources(IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, IN OUT PCM_RESOURCE_LIST *AllocatedResources)
Definition: iorsrce.c:944
PVOID NTAPI IntVideoPortMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, IN ULONG InIoSpace, IN HANDLE ProcessHandle, OUT VP_STATUS *Status)
Definition: resource.c:243
PHYSICAL_ADDRESS RangeStart
Definition: video.h:215
#define PAGE_READWRITE
Definition: nt_native.h:1304
VOID NTAPI IntVideoPortUnmapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, IN PVOID MappedAddress)
Definition: resource.c:398
VP_STATUS NTAPI VideoPortGetDeviceData(IN PVOID HwDeviceExtension, IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine, IN PVOID Context)
Definition: resource.c:902
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68