/* * @implemented */ 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) { PDEVICE_NODE DeviceNode; /* Do we have a DO? */ if (DeviceObject) { /* Get its device node */ DeviceNode = IopGetDeviceNode(DeviceObject); if ((DeviceNode) && !(DeviceNode->Flags & DNF_LEGACY_RESOURCE_DEVICENODE)) { /* New drivers should not call this API */ KeBugCheckEx(PNP_DETECTED_FATAL_ERROR, 0, 0, (ULONG_PTR)DeviceObject, (ULONG_PTR)DriverObject); } } /* Did the driver supply resources? */ if (RequestedResources) { /* Make sure there's actually something useful in them */ if (!(RequestedResources->AlternativeLists) || !(RequestedResources->List[0].Count)) { /* Empty resources are no resources */ RequestedResources = NULL; } } /* Initialize output if given */ if (AllocatedResources) *AllocatedResources = NULL; /* Call internal helper function */ return IopLegacyResourceAllocation(ArbiterRequestLegacyAssigned, DriverObject, DeviceObject, RequestedResources, AllocatedResources); }
NTSTATUS IoReportResourceUsageInternal( IN ARBITER_REQUEST_SOURCE AllocationType, IN PUNICODE_STRING DriverClassName OPTIONAL, 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, IN BOOLEAN OverrideConflict, OUT PBOOLEAN ConflictDetected ) /*++ Routine Description: This internal routine will do all the work for IoReportResourceUsage. Arguments: AllocationType - Specifies the request type. DriverClassName - Optional pointer to a UNICODE_STRING which describes the class of driver under which the driver information should be stored. A default type is used if none is given. DriverObject - Pointer to the driver's driver object. DriverList - Optional pointer to the driver's resource list. DriverListSize - Optional value determining the size of the driver's resource list. DeviceObject - Optional pointer to driver's device object. DeviceList - Optional pointer to the device's resource list. DriverListSize - Optional value determining the size of the driver's resource list. OverrideConflict - Determines if the information should be reported in the configuration registry eventhough a conflict was found with another driver or device. ConflictDetected - Supplies a pointer to a boolean that is set to TRUE if the resource list conflicts with an already existing resource list in the configuration registry. Return Value: The status returned is the final completion status of the operation. --*/ { NTSTATUS status = STATUS_UNSUCCESSFUL; PCM_RESOURCE_LIST resourceList; PCM_RESOURCE_LIST allocatedResources; PIO_RESOURCE_REQUIREMENTS_LIST resourceRequirements; ULONG attempt; BOOLEAN freeAllocatedResources; ASSERT(DriverObject && ConflictDetected); if (DeviceList) { resourceList = DeviceList; } else if (DriverList) { resourceList = DriverList; } else { resourceList = NULL; } resourceRequirements = NULL; if (resourceList) { if (resourceList->Count && resourceList->List[0].PartialResourceList.Count) { resourceRequirements = IopCmResourcesToIoResources (0, resourceList, LCPRI_NORMAL); if (resourceRequirements == NULL) { return status; } } else { resourceList = NULL; } } *ConflictDetected = TRUE; attempt = 0; allocatedResources = resourceList; freeAllocatedResources = FALSE; do { // // Do the legacy resource allocation. // status = IopLegacyResourceAllocation ( AllocationType, DriverObject, DeviceObject, resourceRequirements, &allocatedResources); if (NT_SUCCESS(status)) { *ConflictDetected = FALSE; break; } // // Change the interface type and try again. // if (!IopChangeInterfaceType(resourceRequirements, &allocatedResources)) { break; } freeAllocatedResources = TRUE; } while (++attempt < 2); if (resourceRequirements) { ExFreePool(resourceRequirements); } if (freeAllocatedResources) { ExFreePool(allocatedResources); } if (NT_SUCCESS(status)) { status = STATUS_SUCCESS; } else { status = STATUS_INSUFFICIENT_RESOURCES; } return status; }