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->Descriptors
は IO_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 を含む) |