wdm.h) (CM_RESOURCE_LIST 结构
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 结构指定的完整资源描述符的数目。 List 成员是第一个完整资源描述符的标头。 对于 WDM 驱动程序, Count 始终为 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 结构的末尾。
驱动程序代码可以使用指针算术从一个完整的资源描述符单步执行到下一个资源描述符。 例如,如果名为 list 的参数是指向一个完整资源描述符开头的 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
数组中的元素数。 有关 PartialDescriptors 和 Count 成员的详细信息,请参阅 CM_PARTIAL_RESOURCE_LIST。
示例
所有 PnP 驱动程序都必须处理 IRP_MN_START_DEVICE IRP。 通常,此 IRP 的驱动程序处理程序会遍录 IRP 中由 IO_STACK_LOCATION 结构的 Parameters.StartDevice.AllocatedResources 和 Parameters.StartDevice.AllocatedResourcesTranslated 成员指向的已分配资源列表。 下面的代码示例包含一个名为 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) |