Implement VideoPortVerifyAccessRanges
Modified: trunk/reactos/drivers/video/videoprt/resource.c

Modified: trunk/reactos/drivers/video/videoprt/resource.c
--- trunk/reactos/drivers/video/videoprt/resource.c	2005-08-03 14:45:50 UTC (rev 17000)
+++ trunk/reactos/drivers/video/videoprt/resource.c	2005-08-03 14:46:12 UTC (rev 17001)
@@ -576,7 +576,7 @@
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 
 VP_STATUS STDCALL
@@ -585,8 +585,74 @@
    IN ULONG NumAccessRanges,
    IN PVIDEO_ACCESS_RANGE AccessRanges)
 {
-   DPRINT1("VideoPortVerifyAccessRanges not implemented\n");
-   return NO_ERROR;
+   PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
+   BOOLEAN ConflictDetected;
+   ULONG i;
+   PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
+   PCM_RESOURCE_LIST ResourceList;
+   ULONG ResourceListSize;
+   NTSTATUS Status;
+
+   DPRINT("VideoPortVerifyAccessRanges\n");
+
+   DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
+   
+   /* Create the resource list */
+   ResourceListSize = sizeof(CM_RESOURCE_LIST)
+      + (NumAccessRanges - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
+   ResourceList = ExAllocatePool(PagedPool, ResourceListSize);
+   if (!ResourceList)
+   {
+      DPRINT("ExAllocatePool() failed\n");
+      return ERROR_INVALID_PARAMETER;
+   }
+   
+   /* Fill resource list */
+   ResourceList->Count = 1;
+   ResourceList->List[0].InterfaceType = DeviceExtension->AdapterInterfaceType;
+   ResourceList->List[0].BusNumber = DeviceExtension->SystemIoBusNumber;
+   ResourceList->List[0].PartialResourceList.Version = 1;
+   ResourceList->List[0].PartialResourceList.Revision = 1;
+   ResourceList->List[0].PartialResourceList.Count = NumAccessRanges;
+   for (i = 0; i < NumAccessRanges; i++, AccessRanges++)
+   {
+      PartialDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
+      if (AccessRanges->RangeInIoSpace)
+      {
+         PartialDescriptor->Type = CmResourceTypePort;
+         PartialDescriptor->u.Port.Start = AccessRanges->RangeStart;
+         PartialDescriptor->u.Port.Length = AccessRanges->RangeLength;
+      }
+      else
+      {
+         PartialDescriptor->Type = CmResourceTypeMemory;
+         PartialDescriptor->u.Memory.Start = AccessRanges->RangeStart;
+         PartialDescriptor->u.Memory.Length = AccessRanges->RangeLength;
+      }
+      if (AccessRanges->RangeShareable)
+         PartialDescriptor->ShareDisposition = CmResourceShareShared;
+      else
+         PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+      PartialDescriptor->Flags = 0;
+      if (AccessRanges->RangePassive & VIDEO_RANGE_PASSIVE_DECODE)
+         PartialDescriptor->Flags |= CM_RESOURCE_PORT_PASSIVE_DECODE;
+      if (AccessRanges->RangePassive & VIDEO_RANGE_10_BIT_DECODE)
+         PartialDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
+   }
+   
+   /* Try to acquire all resource ranges */
+   Status = IoReportResourceForDetection(
+      DeviceExtension->DriverObject,
+      NULL, 0, /* Driver List */
+      DeviceExtension->PhysicalDeviceObject,
+      ResourceList, ResourceListSize,
+      &ConflictDetected);
+   ExFreePool(ResourceList);
+   
+   if (!NT_SUCCESS(Status) || ConflictDetected)
+      return ERROR_INVALID_PARAMETER;
+   else
+      return NO_ERROR;
 }
 
 /*