次の方法で共有


IRP_MN_READ_CONFIG

構成領域を持つバスのバス ドライバーは、子デバイス (子 PDO) に対するこの要求を処理する必要があります。 フィルター ドライバーとファンクション ドライバーは、この要求を処理しません。

0x0F

主要なコード

IRP_MJ_PNP

送信時

ドライバーまたはその他のシステム コンポーネントは、デバイスの親バスの構成領域を読み取るためにこの 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 を送信するコンポーネントは、ページングされたメモリからこの構造体を割り当てます。 バッファーの形式はバス固有です。

Offset
構成領域へのオフセットを指定します。

Length
読み込むバイト数を指定します。

出力パラメーター

成功した場合、バス ドライバーは 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 スタックの場所に値を設定します。MajorFunctionIRP_MJ_PNP に、MinorFunctionIRP_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 を含む)

関連項目

IRP_MN_QUERY_INTERFACE

IRP_MN_WRITE_CONFIG