IO_RESOURCE_REQUIREMENTS_LIST結構 (wdm.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 成員是第一個替代清單的標頭。
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 以指向下一個清單的開頭,如下所示:
list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
在此範例中, list->Descriptors
是 IO_RESOURCE_DESCRIPTOR 數位開頭的指標,而 list->Count
是陣列中的元素數目。 如需 描述項 和 Count 成員的詳細資訊,請參閱 IO_RESOURCE_LIST。
範例
如果驅動程式包含 IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP 的處理程式,處理程式通常會逐步執行 IRP 中 IoStatus.Information 字段所指向的資源清單。 下列程式代碼範例包含名為 FilterResources 的函式,該函式會在處理程式中呼叫以逐步執行清單。 此函式會驗證清單中指定了特定資源,或變更清單中的資源需求,而不需變更清單的大小。 (變更清單大小的函式需要為更新的清單配置緩衝區、將清單寫入此緩衝區、更新 IRP 中的 IoStatus.Information 字段以指向更新的清單,以及釋放包含原始 list 的緩衝區。)
FilterResources 函式會從 switch 語句傳回 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;
}
規格需求
需求 | 值 |
---|---|
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Miniport.h) |