共用方式為


IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (imfi.h)

PCI Express (PCIe) 虛擬函式 (VF) 的驅動程式會發出 IOCTL_VPCI_INVALIDATE_BLOCK IOCTL 要求,以通知一或多個 VF 組態區塊中的數據變更。 當 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。 您也可以使用一般用途的 IRP 建立和初始化例程,例如 IoAllocateIrpIoReuseIrpIoInitializeIrp。 如需 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 要求的參數。
參數DeviceIoControlInputBufferLength VPCI_INVALIDATE_BLOCK_OUTPUT 結構的大小,以位元組為單位。
參數DeviceIoControlOutputBufferLength 呼叫端配置的緩衝區大小,以位元組為單位,其中包含要讀取的組態數據。
Note 此值必須與 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 驅動程式在一或多個 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 迷你埠驅動程式會呼叫 NdisMInvalidateConfigBlock 函式,以通知 NDIS VF 設定數據已變更且不再有效。 驅動程式會將 BlockMask 參數設定為 ULONGLONG 位掩碼,指定哪些 VF 組態區塊已變更。 位掩碼中的每個位都會對應至 VF 組態區塊。 如果位設定為一個,則對應 VF 組態區塊中的數據已變更。
    2. NDIS 會針對 VF 組態區塊數據的變更,向管理 OS 中執行的虛擬化堆疊發出訊號。 虛擬化堆疊會快取 BlockMask 參數數據。
      注意:每次 PF 迷你埠驅動程式呼叫 NdisMInvalidateConfigBlock時,虛擬化堆棧 ORBlockMask 參數數據及其快取中的目前值。
       
    3. 虛擬化堆疊會通知在客體OS中執行的虛擬PCI (VPI) 驅動程式,說明 VF 組態數據的失效。 虛擬化堆疊會將快取的 BlockMask 參數數據傳送至VPI驅動程式。
  3. 在客體OS中,會發生下列步驟:
    1. 在與 IOCTL_VPCI_INVALIDATE_BLOCK 要求相關聯之 VPCI_INVALIDATE_BLOCK_OUTPUT 結構 BlockMask 成員中,將快取 BlockMask 參數數據儲存在快取的區塊掩碼中。
    2. IOCTL_VPCI_INVALIDATE_BLOCK 要求中,JSONI 驅動程式已順利完成。 發生這種情況時,NDIS 會向 VF 迷你埠驅動程式發出 OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK 的物件識別碼 (OID) 要求。 NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO 結構的指標會在 OID 要求中一起傳遞。 此結構包含快取 BlockMask 參數數據。

      NDIS 也會發出另一個 IOCTL_VPCI_INVALIDATE_BLOCK 要求,以處理 VF 設定數據變更的後續通知。

    3. 當 VF 驅動程式處理 OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK 要求時,它會從指定的 VF 組態區塊讀取數據。
附註 VF 組態區塊的使用方式及其組態數據的格式是由裝置的獨立硬體廠商 (IHV) 所定義。 組態數據只會由 PF 和 VF 的驅動程式使用。
 

要求

要求 價值
最低支援的用戶端 Windows Server 2012 和更新版本的 Windows 支援。
標頭 imfi.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