IO_RESOURCE_REQUIREMENTS_LIST構造体 (ミニポート.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

システム割り当て、0 から始まるバス番号。 (WDM ドライバーでは使用されません。)

SlotNumber

システム スロット番号。 (WDM ドライバーでは使用されません。)

Reserved[3]

使用されていません。

AlternativeLists

この IO_RESOURCE_REQUIREMENTS_LIST 構造によって記述されるハードウェア リソースの代替リスト (または構成) の数。 List メンバーは、最初の代替リストのヘッダーです。

List[1]

ハードウェア リソースの最初の代替リストのヘッダーとして機能する IO_RESOURCE_LIST 構造体。 IO_RESOURCE_REQUIREMENTS_LIST構造体で複数の代替リストが記述されている場合、2 番目の代替リストは、メモリ内の最初の代替リストのすぐ後に続きます。 各代替リストのサイズは、そのリストに含まれる IO_RESOURCE_DESCRIPTOR 配列の長さによって異なります。 詳細については、「解説」を参照してください。

注釈

この構造は、ハードウェア リソースの 1 つ以上の代替構成を記述するために、IRP_MN_FILTER_RESOURCE_REQUIREMENTSおよびIRP_MN_QUERY_RESOURCE_REQUIREMENTS IRP によって使用されます。

IO_RESOURCE_REQUIREMENTS_LIST構造体は、リソースの 1 つ以上の代替リストを指定する、可変サイズの大きなデータ構造のヘッダーです。 この大きな構造体のすべてのデータは、 ListSize メンバーによってサイズが指定された連続したメモリ ブロックを占有します。 各代替リストは、大きなブロック内のサブブロックを占有します。

各代替リストは 、IO_RESOURCE_LIST 構造体で始まり、 IO_RESOURCE_DESCRIPTOR 構造体の配列のヘッダーとして機能します。 この配列の長さによってリストのサイズが決まります。これは、代替リストから次のリストまでさまざまです。 ドライバー コードでは、ポインターの算術演算を使用して、代替リストから次の一覧にステップ実行できます。 たとえば、 list という名前のパラメーターが、1 つの代替リストの先頭にある IO_RESOURCE_LIST 構造体へのポインターである場合、 list は次のように次のリストの先頭を指すように更新できます。

list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);

この例では、 list->DescriptorsIO_RESOURCE_DESCRIPTOR 配列の先頭へのポインターであり list->Count 、配列内の要素の数です。 Descriptors メンバーと Count メンバーの詳細については、「IO_RESOURCE_LIST」を参照してください。

ドライバーに IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP のハンドラーが含まれている場合、ハンドラーは通常、IRP の IoStatus.Information フィールドが指すリソースの一覧を示します。 次のコード例には、リストをウォークするためにハンドラーで呼び出される FilterResources という名前の関数が含まれています。 この関数は、特定のリソースがリストで指定されていることを確認するか、リストのサイズを変更せずにリスト内のリソース要件を変更します。 (リストのサイズを変更する関数は、更新されたリストのバッファーを割り当て、このバッファーにリストを書き込み、更新されたリストを指すように IRP の IoStatus.Information フィールドを更新し、元のリストを含むバッファーを解放する必要があります)。

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 miniport.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