CM_RESOURCE_LIST结构 (wdm.h)

CM_RESOURCE_LIST结构指定分配给设备的所有系统硬件资源。

语法

typedef struct _CM_RESOURCE_LIST {
  ULONG                       Count;
  CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;

成员

Count

CM_RESOURCE_LIST 结构指定的完整资源描述符的数目。 列表成员是第一个完整资源描述符的标头。 对于 WDM 驱动程序, 计数 始终为 1。

List[1]

用作第一个完整资源描述符标头的 CM_FULL_RESOURCE_DESCRIPTOR 结构。 如果 CM_RESOURCE_LIST 结构包含多个完整资源描述符,则第二个完整资源描述符将紧跟内存中的第一个描述符等。 每个完整资源描述符的大小取决于它包含 的CM_PARTIAL_RESOURCE_DESCRIPTOR 数组的长度。 有关更多信息,请参见下面的“备注”部分。

备注

此结构描述将硬件资源分配给设备。 IRP_MN_START_DEVICE IRP 使用此结构来指定即插即用管理器分配给设备的资源。 旧设备的驱动程序使用此结构将其资源要求传递给 IoReportResourceForDetection 例程。 有关硬件资源分配的详细信息,请参阅 硬件资源

CM_RESOURCE_LIST结构是较大数据结构的标头,其大小可变,包含一个或多个完整资源描述符。 此较大结构中的所有数据占用连续内存块。 每个完整资源描述符占用较大块内的子块。

完整的资源描述符以 CM_FULL_RESOURCE_DESCRIPTOR 结构开头,该结构充当 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构数组的标头。 此数组的长度确定完整资源描述符的大小。 CM_FULL_RESOURCE_DESCRIPTOR结构中的最后一个成员是一个CM_PARTIAL_RESOURCE_LIST结构,其中包含作为其最后一个成员在此数组中的第一个元素。 如果数组包含多个元素,则剩余元素紧随内存中的 CM_PARTIAL_RESOURCE_LIST 结构的末尾,这也是 CM_FULL_RESOURCE_DESCRIPTOR 结构的末尾。

驱动程序代码可以使用指针算术从一个完整的资源描述符单步执行到下一个资源描述符。 例如,如果命名 列表 的参数是指向一个完整资源描述符开头 的CM_FULL_RESOURCE_DESCRIPTOR 结构的指针,则可以更新 列表 以指向下一个完整资源描述符的开头,如下所示:

    list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
                                          list->PartialResourceList.Count);

在此示例中, list->PartialResourceList.PartialDescriptors 是指向 CM_PARTIAL_RESOURCE_DESCRIPTOR 数组开头的指针,是 list->PartialResourceList.Count 数组中的元素数。 有关 PartialDescriptorsCount 成员的详细信息,请参阅 CM_PARTIAL_RESOURCE_LIST

示例

所有 PnP 驱动程序都必须处理 IRP_MN_START_DEVICE IRP。 通常,此 IRP 的驱动程序处理程序将引导参数.StartDevice.AllocatedResources 和 Parameters.StartDevice.AllocatedResourcesTranslatedIO_STACK_LOCATION 结构的成员指向的已分配资源列表。 下面的代码示例包含一个名为 GetAssignedResources 的函数,该函数在处理程序中调用以遍览每个列表。 此函数验证列表中是否指定了所需的资源,并将设备配置为使用资源。

如果 GetAssignedResources 函数成功,则返回 TRUE 。 否则,它可能会从 switch 语句返回 FALSE (,尽管省略详细信息以简化代码示例) 。

/* Process the assigned hardware resources. */

BOOLEAN GetAssignedResources(PCM_RESOURCE_LIST reslist)
{
    PCM_FULL_RESOURCE_DESCRIPTOR list;

    list = reslist->List;

    for (int ix = 0; ix < reslist->Count; ++ix)
    {
        /* Process resources in CM_FULL_RESOURCE_DESCRIPTOR block number ix. */

        for (int jx = 0; jx < list->PartialResourceList.Count; ++jx)
        {
            PCM_PARTIAL_RESOURCE_DESCRIPTOR desc;

            desc = list->PartialResourceList.PartialDescriptors + jx;

            switch (desc->Type)
            {
                /* Process element jx in PartialDescriptors array. */

                ...

            }
        }

        /* Advance to next CM_FULL_RESOURCE_DESCRIPTOR block in memory. */

        list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors + 
                                              list->PartialResourceList.Count);
    }

    return TRUE;
}

要求

   
Header wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Wudfwdm.h)

另请参阅

CM_FLOPPY_DEVICE_DATA

CM_FULL_RESOURCE_DESCRIPTOR

CM_KEYBOARD_DEVICE_DATA

CM_PARTIAL_RESOURCE_LIST

CM_RESOURCE_LIST

CM_SCSI_DEVICE_DATA

CM_SERIAL_DEVICE_DATA

IRP_MN_START_DEVICE

IoConnectInterrupt

IoGetDeviceProperty

IoReportResourceForDetection