次の方法で共有


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 、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

IRP_MJ_INTERNAL_DEVICE_CONTROL

パラメーター。DeviceIoControlします。IoControlCode

IOCTL_VPCI_INVALIDATE_BLOCK

パラメーター。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 構成ブロック内のデータを変更 (無効な) したことが通知されます。

オペレーティング システムは、この 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 ミニポート ドライバーは、VF 構成データが変更され、有効ではなくなったことを NDIS に通知する NdisMInvalidateConfigBlock 関数を呼び出します。 ドライバーは、BlockMask パラメーターを、変更した VF 構成ブロックを指定する ULONGLONG ビットマスクに設定します。 ビットマスク内の各ビットは、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 でサポートされています。
ヘッダー 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