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;
}
/*