IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)
PCI Express (PCIe) 仮想関数 (VF) のドライバーは、1 つ以上の VF 構成ブロック内のデータへの変更を通知するために、IOCTL_VPCI_INVALIDATE_BLOCK IOCTL 要求を発行します。 IOCTL が完了すると、ドライバーにこれらの変更が通知されます。 通知が行われると、ドライバーは、指定された VF 構成ブロックから以前に読み取られたデータが無効になったと想定する必要があります。 そのため、ドライバーは、構成ブロックデータを再度読み取ってキャッシュを更新する必要があります。
ドライバーは、ドライバー スタック内の次の下位ドライバーにこの IOCTL を発行します。
- I/O 要求パケット構造 の準備
- I/O スタック位置構造 の準備
- IOCTL 要求 を発行する
- IOCTL 要求の完了結果 を する
メジャー コード
状態ブロック
Irp->IoStatus.Status は、要求が成功した場合にSTATUS_SUCCESSに設定されます。
それ以外の場合は、NTSTATUS コードとして適切なエラー条件の状態になります。
詳細については、「XREF-LINK:NTSTATUS 値」を参照してください。
備考
I/O 要求パケット構造の準備
ドライバーは、最初に I/O 要求パケットを割り当てるか再利用する必要があります (IRP)。 IoBuildDeviceIoControlRequest ルーチンを使用して、IOCTL IRP を明示的に割り当てることができます。 IoAllocateIrp 、ioReuseIrp、IoInitializeIrp など、汎用 IRP の作成および初期化ルーチンを使用することもできます。 IRP の割り当ての詳細については、「Lower-Level ドライバー の IRP の作成を参照してください。ドライバーは、次の表に示すように、IRP 構造体のメンバーを設定する必要があります。
IRP メンバー | 価値 |
---|---|
UserBuffer の | NULL |
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 | |
パラメーター。DeviceIoControlをします。IoControlCodeの | |
パラメーター。DeviceIoControlをします。Type3InputBufferの | VPCI_INVALIDATE_BLOCK_OUTPUT 構造体へのポインター。 ドライバーは、IOCTL_VPCI_INVALIDATE_BLOCK I/O 要求のパラメーターを使用して、この構造体を書式設定します。 |
私はパラメータを.DeviceIoControlをします。InputBufferLength | VPCI_INVALIDATE_BLOCK_OUTPUT 構造体のサイズ (バイト単位)。 |
パラメーター。DeviceIoControlをします。OutputBufferLength |
読み取る構成データを格納する呼び出し元割り当てバッファーのサイズ (バイト単位)。
注意 この値は、VPCI_INVALIDATE_BLOCK_OUTPUT 構造体の BytesRequested メンバーの値と同じである必要があります。
|
IOCTL 要求を発行する
この IOCTL 要求を発行するために、ドライバーは、IoCallDriver ルーチンを呼び出して、ドライバー スタック内の次の下位ドライバーに要求を渡します。 ドライバーは、次の表に示すように、IoCallDriver のパラメーターを設定します。IoCallDriver パラメーターの | 価値 |
---|---|
DeviceObject | 下位ドライバーのデバイス オブジェクト。 |
Irp | 以前に割り当てられ初期化された IRP のアドレス。 詳細については、「I/O 要求パケット構造を準備する」を参照してください。 |
IOCTL 要求の完了結果の
IOCTL_VPCI_INVALIDATE_BLOCK IOCTL 要求が完了すると、呼び出し元によって割り当てられた IO_STATUS_BLOCK 構造体のメンバーは、次の表の値に設定されます。
状態の値 | 価値 |
---|---|
状態の | STATUS_SUCCESS |
情報 | ゼロ |
IOCTL_VPCI_INVALIDATE_BLOCK IOCTL が発行されて完了すると、VF ドライバーには、PF ドライバーが 1 つ以上の VF 構成ブロック内のデータを変更 (無効な) したことが通知されます。
- VF ドライバー。ゲスト オペレーティング システムで実行されます。 このオペレーティング システムは、Hyper-V 子パーティション内で実行されます。
-
管理オペレーティング システムで実行される PF ドライバー。
このオペレーティング システムは、Hyper-V 親パーティション内で実行されます。
- ゲスト OS では、NDIS は IOCTL_VPCI_INVALIDATE_BLOCK 要求を発行します。
-
管理 OS では、次の手順が実行されます。
- PF ミニポート ドライバーは、VF 構成データが変更され、有効ではなくなったことを NDIS に通知する NdisMInvalidateConfigBlock 関数を呼び出します。 ドライバーは、BlockMask パラメーターを、変更した VF 構成ブロックを指定する ULONGLONG ビットマスクに設定します。 ビットマスク内の各ビットは、VF 構成ブロックに対応します。 ビットが 1 に設定されている場合、対応する VF 構成ブロック内のデータが変更されました。
-
NDIS は、VF 構成ブロック データの変更について、管理 OS で実行される仮想化スタックを通知します。 仮想化スタックは、BlockMask パラメーター データをキャッシュします。
注 PF ミニポート ドライバーが NdisMInvalidateConfigBlock 呼び出すたびに、仮想化スタック またはキャッシュ内の現在の値を持つ BlockMask パラメーター データをします。
- 仮想化スタックは、VF 構成データの無効化について、ゲスト OS で実行される仮想 PCI (VPCI) ドライバーに通知します。 仮想化スタックは、キャッシュされた BlockMask パラメーター データを VPCI ドライバーに送信します。
-
ゲスト OS では、次の手順が実行されます。
- VPCI ドライバーは、キャッシュされた BlockMask パラメーター・データを、IOCTL_VPCI_INVALIDATE_BLOCK 要求に関連付けられている VPCI_INVALIDATE_BLOCK_OUTPUT 構造体の BlockMask メンバーに保管します。
-
VPCI ドライバーは、IOCTL_VPCI_INVALIDATE_BLOCK 要求を正常に完了します。 この場合、NDIS は、VF ミニポート ドライバーに OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK のオブジェクト識別子 (OID) 要求を発行します。
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO 構造体へのポインターは、OID 要求で渡されます。 この構造体には、BlockMask パラメーター データ キャッシュされます。
NDIS は、VF 構成データへの変更の連続した通知を処理する別の IOCTL_VPCI_INVALIDATE_BLOCK 要求も発行します。
- VF ドライバーは、OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK 要求を処理するときに、指定された VF 構成ブロックからデータを読み取ります。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows Server 2012 以降のバージョンの Windows でサポートされています。 |
ヘッダー | vpci.h (Wdm.h を含む) |
IRQL | DISPATCH_LEVEL |
関連項目
NdisMInvalidateConfigBlock の
IRP_MJ_INTERNAL_DEVICE_CONTROL
ドライバー での IOCTL 要求の作成の
IoCallDriver の
OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO