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
システム割り当て済みの 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 配列の長さによって異なります。 詳細については、次の「解説」セクションを参照してください。
備考
この構造は、IRP_MN_FILTER_RESOURCE_REQUIREMENTS および IRP_MN_QUERY_RESOURCE_REQUIREMENTS IRP によって、ハードウェア リソースの 1 つ以上の代替構成を記述するために使用されます。
IO_RESOURCE_REQUIREMENTS_LIST 構造体は、リソースの 1 つ以上の代替リストを指定する、より大きなデータ構造 (可変サイズ) のヘッダーです。 この大きな構造のすべてのデータは、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
は配列内の要素の数です。
記述子 および Count メンバーの詳細については、IO_RESOURCE_LISTを参照してください。
例
ドライバーに IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP のハンドラーが含まれている場合、ハンドラーは通常、IRP の IoStatus.Information フィールドが指すリソースの一覧を示します。 次のコード例には、リストをウォークするためにハンドラーで呼び出される FilterResources という名前の関数が含まれています。 この関数は、リストで特定のリソースが指定されていることを確認するか、リストのサイズを変更せずにリスト内のリソース要件を変更します。 (リストのサイズを変更する関数は、更新されたリストのバッファーを割り当て、このバッファーにリストを書き込み、更新されたリストを指すように IRP の IoStatus.Information フィールドを更新し、元のリストを含むバッファーを解放する必要があります)。
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、ミニポート h を含む) |