NTSTATUS NTAPI IopLegacyResourceAllocation(IN ARBITER_REQUEST_SOURCE AllocationType, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements, IN OUT PCM_RESOURCE_LIST *AllocatedResources) { NTSTATUS Status; DPRINT1("IopLegacyResourceAllocation is halfplemented!\n"); Status = IopFixupResourceListWithRequirements(ResourceRequirements, AllocatedResources); if (!NT_SUCCESS(Status)) { if (Status == STATUS_CONFLICTING_ADDRESSES) { DPRINT1("Denying an attempt to claim resources currently in use by another device!\n"); } return Status; } /* TODO: Claim resources in registry */ return STATUS_SUCCESS; }
NTSTATUS NTAPI IopAssignDeviceResources( IN PDEVICE_NODE DeviceNode) { NTSTATUS Status; ULONG ListSize; IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); Status = IopFilterResourceRequirements(DeviceNode); if (!NT_SUCCESS(Status)) goto ByeBye; if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) { DeviceNode->Flags |= DNF_NO_RESOURCE_REQUIRED; DeviceNode->Flags &= ~DNF_ASSIGNING_RESOURCES; /* No resource needed for this device */ DeviceNode->ResourceList = NULL; DeviceNode->ResourceListTranslated = NULL; return STATUS_SUCCESS; } if (DeviceNode->BootResources) { ListSize = PnpDetermineResourceListSize(DeviceNode->BootResources); DeviceNode->ResourceList = ExAllocatePool(PagedPool, ListSize); if (!DeviceNode->ResourceList) { Status = STATUS_NO_MEMORY; goto ByeBye; } RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, ListSize); Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); if (!NT_SUCCESS(Status)) { DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); ExFreePool(DeviceNode->ResourceList); DeviceNode->ResourceList = NULL; } } else { /* We'll make this from the requirements */ DeviceNode->ResourceList = NULL; } /* No resources requirements */ if (!DeviceNode->ResourceRequirements) goto Finish; /* Call HAL to fixup our resource requirements list */ HalAdjustResourceList(&DeviceNode->ResourceRequirements); /* Add resource requirements that aren't in the list we already got */ Status = IopFixupResourceListWithRequirements(DeviceNode->ResourceRequirements, &DeviceNode->ResourceList); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to fixup a resource list from supplied resources for %wZ\n", &DeviceNode->InstancePath); DeviceNode->Problem = CM_PROB_NORMAL_CONFLICT; goto ByeBye; } /* IopFixupResourceListWithRequirements should NEVER give us a conflicting list */ ASSERT(IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL) != STATUS_CONFLICTING_ADDRESSES); Finish: Status = IopTranslateDeviceResources(DeviceNode); if (!NT_SUCCESS(Status)) { DeviceNode->Problem = CM_PROB_TRANSLATION_FAILED; DPRINT1("Failed to translate resources for %wZ\n", &DeviceNode->InstancePath); goto ByeBye; } Status = IopUpdateResourceMapForPnPDevice(DeviceNode); if (!NT_SUCCESS(Status)) goto ByeBye; Status = IopUpdateControlKeyWithResources(DeviceNode); if (!NT_SUCCESS(Status)) goto ByeBye; IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED); IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); return STATUS_SUCCESS; ByeBye: if (DeviceNode->ResourceList) { ExFreePool(DeviceNode->ResourceList); DeviceNode->ResourceList = NULL; } DeviceNode->ResourceListTranslated = NULL; IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); return Status; }