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_REQUIREMENTSIRP_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->DescriptorsIO_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)

另請參閱

IO_RESOURCE_DESCRIPTOR

IO_RESOURCE_LIST

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

IRP_MN_QUERY_RESOURCE_REQUIREMENTS