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[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 字段,以指向更新的清單,並釋放包含原始列表的緩衝區。
FilterResources 函式會傳回 true 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) |