IRP_MN_READ_CONFIG
構成領域を持つバスのバス ドライバーは、子デバイス (子 PDO) に対するこの要求を処理する必要があります。 フィルター ドライバーとファンクション ドライバーは、この要求を処理しません。
値
0x0F
主要なコード
送信時
ドライバーまたはその他のシステム コンポーネントは、デバイスの親バスの構成領域を読み取るためにこの IRP を送信します。
ドライバーまたはその他のシステム コンポーネントは、任意のスレッド コンテキストで IRQL < DISPATCH_LEVEL でこの IRP を送信します。
入力パラメーター
IO_STACK_LOCATION 構造体の Parameters.ReadWriteConfig メンバーは、それ自体が次の情報を含む構造体です。
ULONG WhichSpace;
PVOID Buffer;
ULONG Offset;
ULONG Length
構造体のメンバーは、異なるバス ドライバーによって異なった解釈をするできますが、通常、メンバーは次のように定義されます。
WhichSpace
アクセスするメモリ領域を指定します。 このパラメーターは次の値を取ることができます。
値 | Bus | 意味 |
---|---|---|
PCI_WHICHSPACE_CONFIG |
PCI |
PCI 構成領域。 |
PCI_WHICHSPACE_ROM |
PCI |
読み取り専用メモリ。 |
PCCARD_COMMON_MEMORY PCCARD_COMMON_MEMORY_INDIRECT |
PCMCIA |
メイン PCCARD メモリ。 |
PCCARD_ATTRIBUTE_MEMORY PCCARD_ATTRIBUTE_MEMORY_INDIRECT |
PCMCIA |
PCMCIA 属性 (構成) 領域。 |
PCCARD_PCI_CONFIGURATION_SPACE |
PCMCIA |
PCI 構成領域。 |
PCI_XXX 値は Wdm.h で定義されます。 PCCARD_XXX 値は Ntddpcm.h で定義されます。
Buffer
要求された情報を返すバッファーを指します。 IRP を送信するコンポーネントは、ページングされたメモリからこの構造体を割り当てます。 バッファーの形式はバス固有です。
出力パラメーター
成功した場合、バス ドライバーは Parameters.ReadWriteConfig.Buffer のバッファーに要求されたデータを入力します。
I/O 状態ブロック
バス ドライバーは、Irp->IoStatus.Status を STATUS_SUCCESS に設定するか、STATUS_INVALID_PARAMETER_n、STATUS_NO_SUCH_DEVICE、STATUS_DEVICE_NOT_READY などの適切なエラー状態に設定します。
成功した場合、バス ドライバーは Irp->IoStatus.Information に返されたバイト数を設定します。
バス ドライバーは、この要求をすぐに完了できない場合、IRP を保留中としてマークし、STATUS_PENDING を返して、後で IRP を完了することができます。
操作
バス ドライバーは、子デバイス (子 PDO) に対してこの IRP を処理します。
ファンクション ドライバーとフィルター ドライバーは、この IRP を処理せず、Irp->IoStatus に変更を加えずに、次の下位ドライバーに渡します。また、IoCompletion ルーチンを設定しません。
この要求を処理するバス ドライバーは、WhichSpace パラメーターをチェックして、ドライバーがサポートする値が含まれていることを確認する必要があります。
プラグ アンド プレイのマイナー IRP の処理に関する一般的な規則については、「プラグ アンド プレイ」を参照してください。
この IRP の送信
通常、ファンクション ドライバーは、この IRP を接続されているデバイス スタック内の最上位ドライバーに送信し、IRP は親バス ドライバーによって処理されます。
IRP の送信の詳細については、「IRP の処理」を参照してください。 次の手順は、特にこの IRP に適用されます。
ページングされたプールからバッファーを割り当て、ゼロに初期化します。
IRP の次の I/O スタックの場所に値を設定します。MajorFunction を IRP_MJ_PNP に、MinorFunction を IRP_MN_READ_CONFIG に設定して、Parameters.ReadWriteConfig に適切な値を設定します。
IoStatus.Status を STATUS_NOT_SUPPORTED に初期化します。
IRP とバッファーが不要になったら、割り当てを解除します。
ドライバーは、IRQL < DISPATCH_LEVEL からこの IRP を送信する必要があります。
親バス ドライバーがこのようなインターフェイスをサポートしている場合、ドライバーは、バス インターフェイス ルーチンを介して、DISPATCH_LEVEL でバスの構成領域にアクセスできます。 バス インターフェイスを取得するには、ドライバーは、ドライバーが接続されているデバイス スタックに IRP_MN_QUERY_INTERFACE 要求を送信します。 その後、ドライバーは、インターフェイスで返される適切なルーチンを呼び出します。
たとえば、DISPATCH_LEVEL から構成領域を読み取るために、ドライバーは、ドライバーの初期化中に IRP_MN_QUERY_INTERFACE を呼び出して、親バス ドライバーから BUS_INTERFACE_STANDARD インターフェイスを取得できます。 ドライバーは、IRQL PASSIVE_LEVEL からクエリ IRP を送信します。 その後、IRQL DISPATCH_LEVEL のコードから、ドライバーはインターフェイスで返される適切なルーチン (Interface.GetBusData ルーチンなど) を呼び出します。
要件
ヘッダー |
Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |