You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.4 KiB
148 lines
4.4 KiB
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
assign.c
|
|
|
|
Abstract:
|
|
|
|
IoAssignResources
|
|
|
|
Author:
|
|
|
|
Ken Reneris
|
|
|
|
Environment:
|
|
EDIT IN 110 COLUMN MODE
|
|
|
|
Revision History:
|
|
|
|
Add PnP support - shielint
|
|
|
|
Cleanup - SantoshJ
|
|
|
|
--*/
|
|
|
|
#include "pnpmgrp.h"
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma alloc_text(PAGE,IoAssignResources)
|
|
#endif // ALLOC_PRAGMA
|
|
|
|
NTSTATUS
|
|
IoAssignResources (
|
|
IN PUNICODE_STRING RegistryPath,
|
|
IN PUNICODE_STRING DriverClassName OPTIONAL,
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
|
|
IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
|
|
IN OUT PCM_RESOURCE_LIST *pAllocatedResources
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine takes an input request of RequestedResources, and returned
|
|
allocated resources in pAllocatedResources. The allocated resources are
|
|
automatically recorded in the registry under the ResourceMap for the
|
|
DriverClassName/DriverObject/DeviceObject requestor.
|
|
|
|
Arguments:
|
|
|
|
RegistryPath
|
|
For a simple driver, this would be the value passed to the drivers
|
|
initialization function. For drivers call IoAssignResources with
|
|
multiple DeviceObjects are responsible for passing in a unique
|
|
RegistryPath for each object.
|
|
|
|
The registry path is checked for:
|
|
RegitryPath:
|
|
AssignedSystemResources.
|
|
|
|
AssignSystemResources is of type REG_RESOURCE_REQUIREMENTS_LIST
|
|
|
|
If present, IoAssignResources will attempt to use these settings to
|
|
satisify the requested resources. If the listed settings do
|
|
not conform to the resource requirements, then IoAssignResources
|
|
will fail.
|
|
|
|
Note: IoAssignResources may store other internal binary information
|
|
in the supplied RegisteryPath.
|
|
|
|
DriverObject:
|
|
The driver object of the caller.
|
|
|
|
DeviceObject:
|
|
If non-null, then requested resoruce list refers to this device.
|
|
If null, the requested resource list refers to the driver.
|
|
|
|
DriverClassName
|
|
Used to partition allocated resources into different device classes.
|
|
|
|
RequestedResources
|
|
A list of resources to allocate.
|
|
|
|
Allocated resources may be appended or freed by re-invoking
|
|
IoAssignResources with the same RegistryPath, DriverObject and
|
|
DeviceObject. (editing requirements on a resource list by using
|
|
sucessive calls is not preferred driver behaviour).
|
|
|
|
AllocatedResources
|
|
Returns the allocated resources for the requested resource list.
|
|
|
|
Note that the driver is responsible for passing in a pointer to
|
|
an uninitialized pointer. IoAssignResources will initialize the
|
|
pointer to point to the allocated CM_RESOURCE_LIST. The driver
|
|
is responisble for returning the memory back to pool when it is
|
|
done with them structure.
|
|
|
|
Return Value:
|
|
|
|
The status returned is the final completion status of the operation.
|
|
|
|
--*/
|
|
{
|
|
PDEVICE_NODE deviceNode;
|
|
|
|
PAGED_CODE();
|
|
|
|
UNREFERENCED_PARAMETER(RegistryPath);
|
|
UNREFERENCED_PARAMETER(DriverClassName);
|
|
|
|
if (DeviceObject) {
|
|
|
|
deviceNode = (PDEVICE_NODE)DeviceObject->DeviceObjectExtension->DeviceNode;
|
|
if ( deviceNode &&
|
|
!(deviceNode->Flags & DNF_LEGACY_RESOURCE_DEVICENODE)) {
|
|
|
|
PP_SAVE_DRIVEROBJECT_TO_TRIAGE_DUMP(DriverObject);
|
|
PP_SAVE_DEVICEOBJECT_TO_TRIAGE_DUMP(DeviceObject);
|
|
KeBugCheckEx(
|
|
PNP_DETECTED_FATAL_ERROR,
|
|
PNP_ERR_INVALID_PDO,
|
|
(ULONG_PTR)DeviceObject,
|
|
(ULONG_PTR)DriverObject,
|
|
0);
|
|
}
|
|
}
|
|
if (RequestedResources) {
|
|
|
|
if ( RequestedResources->AlternativeLists == 0 ||
|
|
RequestedResources->List[0].Count == 0) {
|
|
|
|
RequestedResources = NULL;
|
|
}
|
|
}
|
|
if (pAllocatedResources) {
|
|
|
|
*pAllocatedResources = NULL;
|
|
}
|
|
return IopLegacyResourceAllocation (
|
|
ArbiterRequestLegacyAssigned,
|
|
DriverObject,
|
|
DeviceObject,
|
|
RequestedResources,
|
|
pAllocatedResources);
|
|
}
|