wdm.h) (IO_RESOURCE_REQUIREMENTS_LIST 结构
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
指定接口类型。 这必须是 INTERFACE_TYPE 在 Wdm.h 或 Ntddk.h 中定义的类型之一。 (WDM 驱动程序未使用。)
BusNumber
系统分配的从零开始的总线编号。 (WDM 驱动程序未使用。)
SlotNumber
系统槽号。 (WDM 驱动程序未使用。)
Reserved[3]
保留。
AlternativeLists
此IO_RESOURCE_REQUIREMENTS_LIST结构描述的硬件资源 (或配置 ) 替代列表的数目。 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 结构数组的标头。 此数组的长度决定了列表的大小,该大小可能因一个备用列表而异。 驱动程序代码可以使用指针算术从一个备用列表单步执行到下一个替代列表。 例如,如果名为 list 的参数是指向一个备用列表开头 的 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 字段以指向更新的列表,并释放包含原始 list 的缓冲区。)
FilterResources 函数返回 TRUE (可能来自 switch 语句,不过省略了详细信息以简化代码示例) 如果它在列表中找到要查找的资源,或者是否对列表进行了更改而不更改列表大小。 否则,它将返回 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;
}
要求
要求 | 值 |
---|---|
Header | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Miniport.h) |