IO_RESOURCE_REQUIREMENTS_LIST结构(miniport.h)
IO_RESOURCE_REQUIREMENTS_LIST 结构描述设备可以使用的资源配置集。 每个配置表示设备可以使用的各种原始资源范围。
语法
typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
ULONG ListSize;
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
ULONG SlotNumber;
ULONG Reserved[3];
ULONG AlternativeLists;
IO_RESOURCE_LIST List[1];
} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
成员
ListSize
构成 IO_RESOURCE_REQUIREMENTS_LIST 结构的字节总数、其 IO_RESOURCE_LIST 数组和后者的 IO_RESOURCE_DESCRIPTOR 数组。
InterfaceType
指定接口类型。 这必须是 Wdm.h 或 Ntddk.h 中 INTERFACE_TYPE定义的类型之一。 (WDM 驱动程序不使用)。
BusNumber
系统分配的从零开始的总线号。 (WDM 驱动程序不使用)。
SlotNumber
系统槽号。 (WDM 驱动程序不使用)。
Reserved[3]
未使用。
AlternativeLists
此 IO_RESOURCE_REQUIREMENTS_LIST 结构描述的硬件资源的备用列表(或配置)的数量。 列表 成员是第一个备用列表的标头。
List[1]
用作硬件资源第一个备用列表标头的 IO_RESOURCE_LIST 结构。 如果 IO_RESOURCE_REQUIREMENTS_LIST 结构描述多个备用列表,则第二个备用列表紧跟内存中的第一个备用列表,依此等。 每个备用列表的大小取决于它所包含的 IO_RESOURCE_DESCRIPTOR 数组的长度。 有关详细信息,请参阅以下“备注”部分。
言论
IRP_MN_FILTER_RESOURCE_REQUIREMENTS 和 IRP_MN_QUERY_RESOURCE_REQUIREMENTS IRP 使用此结构来描述 硬件资源的一个或多个替代配置。
IO_RESOURCE_REQUIREMENTS_LIST 结构是较大数据结构的标头,大小可变,用于指定一个或多个资源替代列表。 此较大结构中的所有数据占用连续内存块,其大小由 ListSize 成员指定。 每个备用列表占用较大块内的子块。
每个备用列表都以 IO_RESOURCE_LIST 结构开头,该结构充当 IO_RESOURCE_DESCRIPTOR 结构的数组的标头。 此数组的长度决定了列表的大小,该大小可能因一个备用列表而异。 驱动程序代码可以使用指针算术从一个备用列表单步执行到下一个列表。 例如,如果名为 列表的参数 是指向替代列表开头 IO_RESOURCE_LIST 结构的指针,则可以更新 列表 指向下一个列表的起点,如下所示:
list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
在此示例中,list->Descriptors
是指向 IO_RESOURCE_DESCRIPTOR 数组开头的指针,list->Count
是数组中的元素数。 有关 描述符 和 计数 成员的详细信息,请参阅 IO_RESOURCE_LIST。
例子
如果驱动程序包含 IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP 的处理程序,该处理程序通常会遍视 IRP 中 IoStatus.Information 字段指向的资源列表。 下面的代码示例包含一个名为 FilterResources 的函数,该函数在处理程序中调用该函数可遍入列表。 此函数验证列表中指定了特定资源,或者更改列表中的资源要求,而不更改列表的大小。 (更改列表大小的函数需要为更新的列表分配缓冲区、将列表写入此缓冲区、更新 IRP 中的 IoStatus.Information 字段,以指向更新的列表,并释放包含原始列表的缓冲区。
FilterResources 函数返回 TRUE(可能来自 开关 语句,尽管省略详细信息以简化代码示例),如果它找到它在列表中查找的资源,或者它是否对不更改列表大小的列表进行更改。 否则,它将返回 FALSE。
/* Modify the resource list in place (without changing its size). */
BOOLEAN FilterResources(PIO_RESOURCE_REQUIREMENTS_LIST reqlist)
{
PIO_RESOURCE_LIST list;
list = reqlist->List;
for (int ix = 0; ix < reqlist->AlternativeLists; ++ix)
{
/* Process resources in IO_RESOURCE_LIST block number ix. */
for (int jx = 0; jx < list->Count; ++jx)
{
PIO_RESOURCE_DESCRIPTOR desc;
desc = list->Descriptors + jx;
switch (desc->Type)
{
/* Process element jx in Descriptors array. */
...
}
}
/* Advance to next IO_RESOURCE_LIST block in memory. */
list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
}
return FALSE;
}
要求
要求 | 价值 |
---|---|
标头 | miniport.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Miniport.h) |