ReactOS  0.4.13-dev-92-gf251225
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;
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  */
633  {
634  PciSlotNumber.u.bits.DeviceNumber = DeviceNumber;
635  for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
636  {
637  INFO_(VIDEOPRT, "- Function number: %d\n", FunctionNumber);
638  PciSlotNumber.u.bits.FunctionNumber = FunctionNumber;
640  DeviceExtension->SystemIoBusNumber,
641  PciSlotNumber.u.AsULONG,
642  &Config,
643  sizeof(PCI_COMMON_CONFIG));
644  INFO_(VIDEOPRT, "- Length of data: %x\n", ReturnedLength);
645  if (ReturnedLength == sizeof(PCI_COMMON_CONFIG))
646  {
647  INFO_(VIDEOPRT, "- Slot 0x%02x (Device %d Function %d) VendorId 0x%04x "
648  "DeviceId 0x%04x\n",
649  PciSlotNumber.u.AsULONG,
650  PciSlotNumber.u.bits.DeviceNumber,
651  PciSlotNumber.u.bits.FunctionNumber,
652  Config.VendorID,
653  Config.DeviceID);
654 
655  if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind) &&
656  (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind))
657  {
658  DeviceAndVendorFound = TRUE;
659  break;
660  }
661  }
662  }
663  if (DeviceAndVendorFound) break;
664  }
665  if (FunctionNumber == PCI_MAX_FUNCTION)
666  {
667  WARN_(VIDEOPRT, "Didn't find device.\n");
668  return ERROR_DEV_NOT_EXIST;
669  }
670  }
671 
672  Status = HalAssignSlotResources(&DeviceExtension->RegistryPath,
673  NULL,
674  DeviceExtension->DriverObject,
675  DeviceExtension->DriverObject->DeviceObject,
676  DeviceExtension->AdapterInterfaceType,
677  DeviceExtension->SystemIoBusNumber,
678  PciSlotNumber.u.AsULONG,
680 
681  if (!NT_SUCCESS(Status))
682  {
683  WARN_(VIDEOPRT, "HalAssignSlotResources failed with status %x.\n",Status);
684  return Status;
685  }
686  DeviceExtension->AllocatedResources = AllocatedResources;
687  DeviceExtension->SystemIoSlotNumber = PciSlotNumber.u.AsULONG;
688 
689  /* Add legacy resources to the resources from HAL */
691  &LegacyAccessRanges, &LegacyAccessRangeCount);
692  if (!NT_SUCCESS(Status))
693  return ERROR_DEV_NOT_EXIST;
694 
695  if (NumAccessRanges < LegacyAccessRangeCount)
696  {
697  ERR_(VIDEOPRT, "Too many legacy access ranges found\n");
699  }
700 
701  RtlCopyMemory(AccessRanges, LegacyAccessRanges, LegacyAccessRangeCount * sizeof(VIDEO_ACCESS_RANGE));
702  AssignedCount = LegacyAccessRangeCount;
703  }
704  }
705  else
706  {
707  ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + (NumRequestedResources - 1) * sizeof(IO_RESOURCE_DESCRIPTOR);
708  ResReqList = ExAllocatePool(NonPagedPool, ListSize);
709  if (!ResReqList) return ERROR_NOT_ENOUGH_MEMORY;
710 
711  ResReqList->ListSize = ListSize;
712  ResReqList->InterfaceType = DeviceExtension->AdapterInterfaceType;
713  ResReqList->BusNumber = DeviceExtension->SystemIoBusNumber;
714  ResReqList->SlotNumber = DeviceExtension->SystemIoSlotNumber;
715  ResReqList->AlternativeLists = 1;
716  ResReqList->List[0].Version = 1;
717  ResReqList->List[0].Revision = 1;
718  ResReqList->List[0].Count = NumRequestedResources;
719 
720  /* Copy in the caller's resource list */
721  RtlCopyMemory(ResReqList->List[0].Descriptors,
722  RequestedResources,
723  NumRequestedResources * sizeof(IO_RESOURCE_DESCRIPTOR));
724 
725  Status = IoAssignResources(&DeviceExtension->RegistryPath,
726  NULL,
727  DeviceExtension->DriverObject,
728  DeviceExtension->PhysicalDeviceObject ?
729  DeviceExtension->PhysicalDeviceObject :
730  DeviceExtension->DriverObject->DeviceObject,
731  ResReqList,
733 
734  if (!NT_SUCCESS(Status))
735  return Status;
736 
737  if (!DeviceExtension->AllocatedResources)
738  DeviceExtension->AllocatedResources = AllocatedResources;
739  }
740 
741  if (AllocatedResources == NULL)
743 
744  /* Return the slot number if the caller wants it */
745  if (Slot != NULL) *Slot = DeviceExtension->SystemIoBusNumber;
746 
747  FullList = AllocatedResources->List;
748  ASSERT(AllocatedResources->Count == 1);
749  INFO_(VIDEOPRT, "InterfaceType %u BusNumber List %u Device BusNumber %u Version %u Revision %u\n",
750  FullList->InterfaceType, FullList->BusNumber, DeviceExtension->SystemIoBusNumber, FullList->PartialResourceList.Version, FullList->PartialResourceList.Revision);
751 
752  ASSERT(FullList->InterfaceType == PCIBus);
753  ASSERT(FullList->BusNumber == DeviceExtension->SystemIoBusNumber);
754  ASSERT(1 == FullList->PartialResourceList.Version);
755  ASSERT(1 == FullList->PartialResourceList.Revision);
757  Descriptor < FullList->PartialResourceList.PartialDescriptors + FullList->PartialResourceList.Count;
758  Descriptor++)
759  {
760  if ((Descriptor->Type == CmResourceTypeMemory ||
761  Descriptor->Type == CmResourceTypePort) &&
762  AssignedCount >= NumAccessRanges)
763  {
764  ERR_(VIDEOPRT, "Too many access ranges found\n");
766  }
767  if (Descriptor->Type == CmResourceTypeMemory)
768  {
769  INFO_(VIDEOPRT, "Memory range starting at 0x%08x length 0x%08x\n",
770  Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.Length);
771  AccessRanges[AssignedCount].RangeStart = Descriptor->u.Memory.Start;
772  AccessRanges[AssignedCount].RangeLength = Descriptor->u.Memory.Length;
773  AccessRanges[AssignedCount].RangeInIoSpace = 0;
774  AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
775  AccessRanges[AssignedCount].RangeShareable =
776  (Descriptor->ShareDisposition == CmResourceShareShared);
777  AccessRanges[AssignedCount].RangePassive = 0;
778  AssignedCount++;
779  }
780  else if (Descriptor->Type == CmResourceTypePort)
781  {
782  INFO_(VIDEOPRT, "Port range starting at 0x%04x length %d\n",
783  Descriptor->u.Port.Start.u.LowPart, Descriptor->u.Port.Length);
784  AccessRanges[AssignedCount].RangeStart = Descriptor->u.Port.Start;
785  AccessRanges[AssignedCount].RangeLength = Descriptor->u.Port.Length;
786  AccessRanges[AssignedCount].RangeInIoSpace = 1;
787  AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
788  AccessRanges[AssignedCount].RangeShareable =
789  (Descriptor->ShareDisposition == CmResourceShareShared);
790  AccessRanges[AssignedCount].RangePassive = 0;
792  AccessRanges[AssignedCount].RangePassive |= VIDEO_RANGE_10_BIT_DECODE;
794  AccessRanges[AssignedCount].RangePassive |= VIDEO_RANGE_PASSIVE_DECODE;
795  AssignedCount++;
796  }
797  else if (Descriptor->Type == CmResourceTypeInterrupt)
798  {
799  DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level;
800  DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector;
801  if (Descriptor->ShareDisposition == CmResourceShareShared)
802  DeviceExtension->InterruptShared = TRUE;
803  else
804  DeviceExtension->InterruptShared = FALSE;
805  }
806  }
807 
808  return NO_ERROR;
809 }
810 
811 /*
812  * @implemented
813  */
814 
817  IN PVOID HwDeviceExtension,
818  IN ULONG NumAccessRanges,
819  IN PVIDEO_ACCESS_RANGE AccessRanges)
820 {
821  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
822  BOOLEAN ConflictDetected;
823  ULONG i;
824  PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
826  ULONG ResourceListSize;
828 
829  TRACE_(VIDEOPRT, "VideoPortVerifyAccessRanges\n");
830 
831  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
832 
833  /* Create the resource list */
834  ResourceListSize = sizeof(CM_RESOURCE_LIST)
835  + (NumAccessRanges - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
836  ResourceList = ExAllocatePool(PagedPool, ResourceListSize);
837  if (!ResourceList)
838  {
839  WARN_(VIDEOPRT, "ExAllocatePool() failed\n");
841  }
842 
843  /* Fill resource list */
844  ResourceList->Count = 1;
845  ResourceList->List[0].InterfaceType = DeviceExtension->AdapterInterfaceType;
846  ResourceList->List[0].BusNumber = DeviceExtension->SystemIoBusNumber;
847  ResourceList->List[0].PartialResourceList.Version = 1;
848  ResourceList->List[0].PartialResourceList.Revision = 1;
849  ResourceList->List[0].PartialResourceList.Count = NumAccessRanges;
850  for (i = 0; i < NumAccessRanges; i++, AccessRanges++)
851  {
852  PartialDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
853  if (AccessRanges->RangeInIoSpace)
854  {
855  PartialDescriptor->Type = CmResourceTypePort;
856  PartialDescriptor->u.Port.Start = AccessRanges->RangeStart;
857  PartialDescriptor->u.Port.Length = AccessRanges->RangeLength;
858  }
859  else
860  {
861  PartialDescriptor->Type = CmResourceTypeMemory;
862  PartialDescriptor->u.Memory.Start = AccessRanges->RangeStart;
863  PartialDescriptor->u.Memory.Length = AccessRanges->RangeLength;
864  }
865  if (AccessRanges->RangeShareable)
866  PartialDescriptor->ShareDisposition = CmResourceShareShared;
867  else
869  PartialDescriptor->Flags = 0;
870  if (AccessRanges->RangePassive & VIDEO_RANGE_PASSIVE_DECODE)
871  PartialDescriptor->Flags |= CM_RESOURCE_PORT_PASSIVE_DECODE;
872  if (AccessRanges->RangePassive & VIDEO_RANGE_10_BIT_DECODE)
873  PartialDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
874  }
875 
876  /* Try to acquire all resource ranges */
878  DeviceExtension->DriverObject,
879  NULL, 0, /* Driver List */
880  DeviceExtension->PhysicalDeviceObject,
881  ResourceList, ResourceListSize,
882  &ConflictDetected);
884 
885  if (!NT_SUCCESS(Status) || ConflictDetected)
887  else
888  return NO_ERROR;
889 }
890 
891 /*
892  * @unimplemented
893  */
894 
897  IN PVOID HwDeviceExtension,
898  IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
900  IN PVOID Context)
901 {
902  TRACE_(VIDEOPRT, "VideoPortGetDeviceData\n");
904  return ERROR_INVALID_FUNCTION;
905 }
906 
907 /*
908  * @implemented
909  */
910 
911 PVOID NTAPI
913  IN PVOID HwDeviceExtension,
916  IN ULONG Tag)
917 {
918  TRACE_(VIDEOPRT, "VideoPortAllocatePool\n");
920 }
921 
922 /*
923  * @implemented
924  */
925 
926 VOID NTAPI
928  IN PVOID HwDeviceExtension,
929  IN PVOID Ptr)
930 {
931  ExFreePool(Ptr);
932 }
933 
934 /*
935  * @implemented
936  */
937 
940  IN PVOID HwDeviceExtension,
941  IN ULONG Size,
942  OUT PVOID *Buffer)
943 {
944  TRACE_(VIDEOPRT, "VideoPortAllocateBuffer\n");
947 }
948 
949 /*
950  * @implemented
951  */
952 
953 VOID NTAPI
955  IN PVOID HwDeviceExtension,
956  IN PVOID Ptr)
957 {
958  TRACE_(VIDEOPRT, "VideoPortReleaseBuffer\n");
959  ExFreePool(Ptr);
960 }
961 
962 /*
963  * @implemented
964  */
965 
966 PVOID NTAPI
968  IN PVOID HwDeviceExtension,
970  IN ULONG Length,
972 {
973  PMDL Mdl;
974 
976  if (!Mdl)
977  {
978  return NULL;
979  }
980  /* FIXME use seh */
982  return Mdl;
983 }
984 
985 /*
986  * @implemented
987  */
988 
989 BOOLEAN
990 NTAPI
992  IN PVOID HwDeviceExtension,
994  IN PEVENT pUEvent,
995  IN PEVENT pDisplayEvent,
996  IN DMA_FLAGS DmaFlags)
997 {
998  PVOID Buffer;
999 
1000  /* clear output buffer */
1001  pVrp->OutputBuffer = NULL;
1002 
1003  if (DmaFlags != VideoPortDmaInitOnly)
1004  {
1005  /* VideoPortKeepPagesLocked / VideoPortUnlockAfterDma is no-op */
1006  return FALSE;
1007  }
1008 
1009  /* lock the buffer */
1010  Buffer = VideoPortLockBuffer(HwDeviceExtension, pVrp->InputBuffer, pVrp->InputBufferLength, IoModifyAccess);
1011 
1012  if (Buffer)
1013  {
1014  /* store result buffer & length */
1015  pVrp->OutputBuffer = Buffer;
1016  pVrp->OutputBufferLength = pVrp->InputBufferLength;
1017 
1018  /* operation succeeded */
1019  return TRUE;
1020  }
1021 
1022  /* operation failed */
1023  return FALSE;
1024 }
1025 
1026 
1027 /*
1028  * @implemented
1029  */
1030 
1031 VOID NTAPI
1033  IN PVOID HwDeviceExtension,
1034  IN PVOID Mdl)
1035 {
1036  if (Mdl)
1037  {
1038  MmUnlockPages((PMDL)Mdl);
1039  IoFreeMdl(Mdl);
1040  }
1041 }
1042 
1043 /*
1044  * @unimplemented
1045  */
1046 
1049  IN PVOID HwDeviceExtension,
1050  IN ULONG NumAccessRanges,
1051  IN PVIDEO_ACCESS_RANGE AccessRange)
1052 {
1053  UNIMPLEMENTED;
1054  /* Should store the ranges in the device extension for use by ntvdm. */
1055  return NO_ERROR;
1056 }
1057 
1058 /*
1059  * @implemented
1060  */
1061 
1062 ULONG NTAPI
1064  IN PVOID HwDeviceExtension,
1065  IN BUS_DATA_TYPE BusDataType,
1067  OUT PVOID Buffer,
1068  IN ULONG Offset,
1069  IN ULONG Length)
1070 {
1071  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1072 
1073  TRACE_(VIDEOPRT, "VideoPortGetBusData\n");
1074 
1075  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1076 
1077  if (BusDataType != Cmos)
1078  {
1079  /* Legacy vs. PnP behaviour */
1080  if (DeviceExtension->PhysicalDeviceObject != NULL)
1081  SlotNumber = DeviceExtension->SystemIoSlotNumber;
1082  }
1083 
1084  return HalGetBusDataByOffset(
1085  BusDataType,
1086  DeviceExtension->SystemIoBusNumber,
1087  SlotNumber,
1088  Buffer,
1089  Offset,
1090  Length);
1091 }
1092 
1093 /*
1094  * @implemented
1095  */
1096 
1097 ULONG NTAPI
1099  IN PVOID HwDeviceExtension,
1100  IN BUS_DATA_TYPE BusDataType,
1102  IN PVOID Buffer,
1103  IN ULONG Offset,
1104  IN ULONG Length)
1105 {
1106  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1107 
1108  TRACE_(VIDEOPRT, "VideoPortSetBusData\n");
1109 
1110  DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
1111 
1112  if (BusDataType != Cmos)
1113  {
1114  /* Legacy vs. PnP behaviour */
1115  if (DeviceExtension->PhysicalDeviceObject != NULL)
1116  SlotNumber = DeviceExtension->SystemIoSlotNumber;
1117  }
1118 
1119  return HalSetBusDataByOffset(
1120  BusDataType,
1121  DeviceExtension->SystemIoBusNumber,
1122  SlotNumber,
1123  Buffer,
1124  Offset,
1125  Length);
1126 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
#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:939
#define IN
Definition: typedefs.h:38
#define TAG_VIDEO_PORT
Definition: videoprt.h:35
#define TRUE
Definition: types.h:120
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:927
*BytesInUnicodeString PWCH UnicodeString
Definition: rtlfuncs.h:1980
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:1063
#define INFO_(ch,...)
Definition: debug.h:159
struct _Entry Entry
Definition: kefuncs.h:640
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@369::@371 Port
_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:4622
_In_ PIRP Irp
Definition: csq.h:116
#define VIDEO_MEMORY_SPACE_P6CACHE
Definition: video.h:136
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:46
#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:415
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@369 u
PVOID NTAPI VideoPortLockBuffer(IN PVOID HwDeviceExtension, IN PVOID BaseAddress, IN ULONG Length, IN VP_LOCK_OPERATION Operation)
Definition: resource.c:967
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:91
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@369::@374 Memory
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
Definition: mdlsup.c:1439
#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension)
Definition: videoprt.h:133
struct _IO_RESOURCE_REQUIREMENTS_LIST IO_RESOURCE_REQUIREMENTS_LIST
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
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
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:36
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
NTSTATUS NTAPI IntVideoPortFilterResourceRequirements(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: resource.c:77
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:84
#define VIDEO_RANGE_PASSIVE_DECODE
Definition: video.h:98
INTERFACE_TYPE InterfaceType
Definition: iotypes.h:2387
PVOID DeviceExtension
Definition: env_spec_w32.h:418
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:1048
#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
union _PCI_SLOT_NUMBER::@3627 u
PVOID NTAPI VideoPortAllocatePool(IN PVOID HwDeviceExtension, IN VP_POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
Definition: resource.c:912
#define NtCurrentProcess()
Definition: nt_native.h:1657
#define TRACE_(x)
Definition: compat.h:66
_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:991
struct _IO_RESOURCE_DESCRIPTOR * PIO_RESOURCE_DESCRIPTOR
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 _PCI_SLOT_NUMBER::@3627::@3628 bits
#define PCI_MAX_DEVICES
Definition: iotypes.h:3241
NTHALAPI ULONG NTAPI HalGetBusData(BUS_DATA_TYPE, ULONG, ULONG, PVOID, ULONG)
_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
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
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:1060
unsigned char UCHAR
Definition: xmlstorage.h:181
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
Definition: hwresource.cpp:119
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
IO_RESOURCE_LIST List[1]
Definition: iotypes.h:2392
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:1098
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1833
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG _In_ ULONG _Out_ PULONG ReturnedLength
Definition: batclass.h:187
IO_RESOURCE_DESCRIPTOR Descriptors[1]
Definition: iotypes.h:2382
Definition: typedefs.h:117
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3773
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
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:1032
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
Status
Definition: gdiplustypes.h:24
struct _IO_RESOURCE_DESCRIPTOR IO_RESOURCE_DESCRIPTOR
#define PCI_MAX_FUNCTION
Definition: iotypes.h:3242
PDRIVER_OBJECT DriverObject
Definition: videoprt.h:83
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
Definition: iomdl.c:22
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
ULONG_PTR SIZE_T
Definition: typedefs.h:78
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:954
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
enum _VIDEO_DEVICE_DATA_TYPE VIDEO_DEVICE_DATA_TYPE
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
struct _LARGE_INTEGER::@2192 u
#define OUT
Definition: typedefs.h:39
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:997
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:816
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define UNIMPLEMENTED
Definition: debug.h:114
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#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:87
NTHALAPI NTSTATUS NTAPI HalAssignSlotResources(PUNICODE_STRING, PUNICODE_STRING, PDRIVER_OBJECT, PDEVICE_OBJECT, INTERFACE_TYPE, ULONG, ULONG, PCM_RESOURCE_LIST *)
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1036
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:95
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:2725
_Must_inspect_result_ _In_ FLT_CONTEXT_TYPE _In_ SIZE_T _In_ POOL_TYPE PoolType
Definition: fltkernel.h:1444
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#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:2168
LONGLONG QuadPart
Definition: typedefs.h:112
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:896
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: classpnp.h:966
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68