IOCTL_VPCI_READ_BLOCK IOCTL (vpci.h)

PCI Express (PCIe) 仮想関数 (VF) のドライバーがIOCTL_VPCI_READ_BLOCKを発行する

VF 構成ブロックからデータを読み取るために、I/O 制御コード (IOCTL)。 ドライバーは、ドライバー スタック内の次の下位ドライバーにこの IOCTL を発行します。

メモ この IOCTL 要求は、単一ルート I/O 仮想化 (SR-IOV) インターフェイスをサポートするデバイス上の PCIe VF のドライバーによって発行されます。
 
ドライバーが IOCTL_VPCI_READ_BLOCK IOCTL を発行する場合、ドライバーは次の手順に従う必要があります。
I/O 要求パケット構造の準備
I/O スタック位置構造の準備
IOCTL 要求の発行
IOCTL 要求の完了結果
カーネル モード ドライバー間での IOCTL の発行の詳細については、「ドライバー での IOCTL 要求の作成」を参照してください。

メジャー コード

IRP_MJ_DEVICE_CONTROL

ステータス ブロック

要求が成功した場合、Irp-IoStatus.Status> はSTATUS_SUCCESSに設定されます。

それ以外の場合は、NTSTATUS コードとして適切なエラー条件の状態。

詳細については、「XREF-LINK:NTSTATUS 値」を参照してください。

注釈

I/O 要求パケット構造の準備

ドライバーは、最初に割り当てるか、I/O 要求パケット (IRP) を再利用する必要があります。 IoBuildDeviceIoControlRequest 関数を使用して、IOCTL IRP を具体的に割り当てることができます。 IoAllocateIrp、IoReuseIrpIoInitializeIrp などの汎用 IRP の作成および初期化関数を使用することもできます。 IRP の割り当ての詳細については、「 Lower-Level ドライバーの IRP の作成」を参照してください。

ドライバーは、次の表で説明するように IRP 構造体のメンバーを設定する必要があります。

IRP メンバー
UserBuffer 読み取る構成データを格納する呼び出し元割り当てバッファーのアドレス。
UserEvent KeInitializeEvent 関数の呼び出しで初期化されたイベント オブジェクトのアドレス。
メモ IOCTL 要求の非同期完了が不要な場合は、このメンバーを NULL に設定する必要があります。 詳細については、「 ドライバーでの IOCTL 要求の作成」を参照してください。
 
UserIosb 呼び出し元によって割り当てられた IO_STATUS_BLOCK構造体の アドレス。 この構造体は、I/O 要求の最終的な状態を示すために下位ドライバーによって更新されます。
 

I/O スタック位置構造の準備

ドライバーは 、IoGetNextIrpStackLocation 関数を呼び出して、下位のドライバーの I/O スタックの場所にアクセスします。 この関数は、I/O スタックの場所のパラメーターを含む IO_STACK_LOCATION 構造体へのポインターを返します。

ドライバーは、次の表で説明するように 、IO_STACK_LOCATION 構造体のメンバーを設定する必要があります。

IO_STACK_LOCATION メンバー
MajorFunction

IRP_MJ_INTERNAL_DEVICE_CONTROL

Parameters.DeviceIoControl.IoControlCode

IOCTL_VPCI_READ_BLOCK

Parameters.DeviceIoControl.Type3InputBuffer VPCI_READ_BLOCK_INPUT構造体へのポインター。 ドライバーは、 IOCTL_VPCI_READ_BLOCK I/O 要求のパラメーターを使用して、この構造体を書式設定します。
IParameters.DeviceIoControl.InputBufferLength VPCI_READ_BLOCK_INPUT構造体のサイズ (バイト単位)。
Parameters.DeviceIoControl.OutputBufferLength 読み取る構成データを格納する呼び出し元によって割り当てられたバッファーのサイズ (バイト単位)。
メモこの値は、VPCI_READ_BLOCK_INPUT構造体の BytesRequested メンバーの値と同じである必要があります。
 
 

IOCTL 要求の発行

この IOCTL 要求を発行するために、ドライバーは IoCallDriver 関数を呼び出して、ドライバー スタック内の次の下位ドライバーに要求を渡します。 ドライバーは、次の表で説明するように IoCallDriver のパラメーターを設定します。
IoCallDriver パラメーター
DeviceObject 下位ドライバーのデバイス オブジェクト。
Irp 以前に割り当てられ、初期化された IRP の アドレス。 詳細については、「 I/O 要求パケット (IRP) 構造体の準備」を参照してください。
 

IOCTL 要求の完了結果

IOCTL_VPCI_READ_BLOCK IOCTL 要求が完了すると、呼び出し元によって割り当てられたIO_STATUS_BLOCK構造体の Status メンバーは、次の表のいずれかの値に設定されます。
ステータス値 説明
STATUS_SUCCESS IOCTL が正常に完了しました。
STATUS_PENDING IOCTL が完了していません。 ドライバーは、現在のスレッドを待機状態にするために KeWaitForSingleObject 関数を呼び出す必要があります。 ドライバーは、KeInitializeEvent 関数の呼び出しで初期化されたイベント オブジェクトのアドレスに Object パラメーターを設定します。

イベントは、IOCTL 要求が完了したときに通知されます。 イベントが通知されると、スレッドは実行を再開します。

STATUS_BUFFER_TOO_SMALL Parameters.DeviceIoControl.InputBufferLength メンバーまたは Parameters.DeviceIoControl.OutputBufferLength メンバーのいずれかが、必要なバッファー サイズより小さい値に設定されました。
 

要求が正常に完了した場合、IO_STATUS_BLOCK構造体の Information メンバーは、読み取られたバイト数に設定されます。 それ以外の場合、 Information メンバーは 0 に設定されます。

IOCTL_VPCI_READ_BLOCK IOCTL が発行されると、PCIe 物理機能 (PF) のドライバーに、指定された VF 構成ブロックからデータを返すように通知されます。

メモ オペレーティング システムは、この IOCTL を正常に完了するために必要なリソースを予約して管理します。
 
VF 構成ブロックは、PCIe PF のドライバーと、SR-IOV インターフェイスをサポートするデバイス上の VF との間のバックチャネル通信に使用されます。 VF 構成ブロックからのデータは、次のドライバー間で交換できます。
  • ゲスト オペレーティング システムで実行される VF ドライバー。 このオペレーティング システムは、Hyper-V 子パーティション内で実行されます。
  • 管理オペレーティング システムで実行される PF ドライバー。

    このオペレーティング システムは、Hyper-V 親パーティション内で実行されます。

VF 構成ブロックの使用法とその構成データの形式は、デバイスの独立したハードウェア ベンダー (IHV) によって定義されます。 構成データは、PF と VF のドライバーによってのみ使用されます。
メモIOCTL_VPCI_READ_BLOCK IOCTL は、ReadVfConfigBlock 関数に代わる非同期機能を提供します。
 

要件

要件
サポートされている最小のクライアント Windows Server 2012 以降のバージョンの Windows でサポートされています。
Header vpci.h (Wdm.h を含む)
IRQL DISPATCH_LEVEL

こちらもご覧ください

IO_STATUS_BLOCK

IRP_MJ_INTERNAL_DEVICE_CONTROL

ReadVfConfigBlock

ドライバー内での IOCTL 要求の作成

VPCI_READ_BLOCK_INPUT

IRP

IO_STACK_LOCATION

IoCallDriver