Share via


IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)

PCI Express (PCIe) 仮想関数 (VF) のドライバーは、1 つ以上の VF 構成ブロック内のデータへの変更を通知するために、 IOCTL_VPCI_INVALIDATE_BLOCK IOCTL 要求を発行します。 IOCTL が完了すると、ドライバーにこれらの変更が通知されます。 通知が行われると、ドライバーは、指定された VF 構成ブロックから以前に読み取られたデータが無効になったと想定する必要があります。 そのため、ドライバーは構成ブロック データを再度読み取ってキャッシュを更新する必要があります。

ドライバーは、ドライバー スタック内の次の下位ドライバーにこの IOCTL を発行します。

メモ この IOCTL 要求は、単一ルート I/O 仮想化 (SR-IOV) インターフェイスをサポートするデバイス上の PCIe VF のドライバーによって発行されます。
 
ドライバーが IOCTL_VPCI_INVALIDATE_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 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

IRP_MJ_INTERNAL_DEVICE_CONTROL

パラメーターDeviceIoControlIoControlCode

IOCTL_VPCI_INVALIDATE_BLOCK

パラメーターDeviceIoControlType3InputBuffer VPCI_INVALIDATE_BLOCK_OUTPUT構造体へのポインター。 ドライバーは、 IOCTL_VPCI_INVALIDATE_BLOCK I/O 要求のパラメーターを使用して、この構造体を書式設定します。
IパラメーターDeviceIoControlInputBufferLength VPCI_INVALIDATE_BLOCK_OUTPUT構造体のサイズ (バイト単位)。
パラメーターDeviceIoControlOutputBufferLength 読み取る構成データを格納する呼び出し元によって割り当てられたバッファーのサイズ (バイト単位)。
メモこの値は、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 ドライバーには、1 つ以上の VF 構成ブロックで PF ドライバーのデータが変更 (無効) されたことが通知されます。

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

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

NDIS 6.30 以降では、VF ミニポート ドライバーは 、IOCTL_VPCI_INVALIDATE_BLOCK 要求を発行しないでください。 代わりに、無効な VF 構成ブロック データの通知を処理するために、次の手順を実行します。
  1. ゲスト OS では、NDIS は IOCTL_VPCI_INVALIDATE_BLOCK 要求を発行します。
  2. 管理 OS では、次の手順が実行されます。
    1. PF ミニポート ドライバーは NdisMInvalidateConfigBlock 関数を呼び出して、VF 構成データが変更され、無効になっていることを NDIS に通知します。 ドライバーは、変更された VF 構成ブロックを指定する ULONGLONG ビットマスクに BlockMask パラメーターを設定します。 ビットマスク内の各ビットは、VF 構成ブロックに対応します。 ビットが 1 に設定されている場合、対応する VF 構成ブロック内のデータが変更されました。
    2. NDIS は、VF 構成ブロック データの変更について、管理 OS で実行される仮想化スタックを通知します。 仮想化スタックは 、BlockMask パラメーター データをキャッシュします。
      メモ PF ミニポート ドライバーが NdisMInvalidateConfigBlock を呼び出すたびに、仮想化スタック またはキャッシュ内の現在の値を持つ BlockMask パラメーター データ。
       
    3. 仮想化スタックは、VF 構成データの無効化について、ゲスト OS で実行される仮想 PCI (VPCI) ドライバーに通知します。 仮想化スタックは、キャッシュされた BlockMask パラメーター データを VPCI ドライバーに送信します。
  3. ゲスト OS では、次の手順が実行されます。
    1. VPCI ドライバーは、キャッシュされた BlockMask パラメーター データを、IOCTL_VPCI_INVALIDATE_BLOCK要求に関連付けられているVPCI_INVALIDATE_BLOCK_OUTPUT構造体の BlockMask メンバーに保存します。
    2. 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 要求も発行されます。

    3. VF ドライバーは、 OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK 要求を処理すると、指定された VF 構成ブロックからデータを読み取ります。
メモ VF 構成ブロックの使用法とその構成データの形式は、デバイスの独立したハードウェア ベンダー (IHV) によって定義されます。 構成データは、PF および VF のドライバーによってのみ使用されます。
 

要件

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

こちらもご覧ください

IO_STATUS_BLOCK

VPCI_INVALIDATE_BLOCK_OUTPUT

NdisMInvalidateConfigBlock

IRP_MJ_INTERNAL_DEVICE_CONTROL

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

IRP

IO_STACK_LOCATION

IoCallDriver

OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK

NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO