共用方式為


IOCTL_VPCI_INVALIDATE_BLOCK IOCTL ()

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 要求的參數。
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 驅動程式會收到通知,指出 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 會向在管理OS中執行的虛擬化堆疊發出有關 VF 組態區塊數據變更的訊號。 虛擬化堆疊會快取 BlockMask 參數數據。
      注意 每次 PF 迷你埠驅動程式呼叫 NdisMInvalidateConfigBlock 時,虛擬化堆棧 OR會使用快取中目前的值來設定 BlockMask 參數數據。
       
    3. 虛擬化堆疊會通知虛擬PCI (在客體OS中執行的) 驅動程式,關於VF組態數據的失效。 虛擬化堆疊會將快取的 BlockMask 參數數據傳送至 APII 驅動程式。
  3. 在客體OS中,會發生下列步驟:
    1. JSONI 驅動程式會將快取的 BlockMask 參數數據儲存在與IOCTL_VPCI_INVALIDATE_BLOCK要求相關聯之VPCI_INVALIDATE_BLOCK_OUTPUT結構的 BlockMask 成員中。
    2. 此IOCTL_VPCI_INVALIDATE_BLOCK驅動程式已成功完成 IOCTL_VPCI_INVALIDATE_BLOCK 要求。 發生這種情況時,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 支援。
標頭 (包含 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