IOCTL_VPCI_INVALIDATE_BLOCK IOCTL ()
PCI Express (PCIe 的驅動程式) 虛擬函式 (VF) 發出 IOCTL_VPCI_INVALIDATE_BLOCK IOCTL 要求,以通知一或多個 VF 組態區塊中的數據變更。 當 IOCTL 完成時,驅動程式會收到這些變更的通知。 通知之後,驅動程式應該假設先前從指定的 VF 組態區塊讀取的任何數據都已無效。 因此,驅動程式應該再次讀取組態區塊數據來更新其快取。
驅動程式會將此 IOCTL 發行至驅動程式堆疊中的下一個較低驅動程式。
主要程序代碼
狀態區塊
如果要求成功,Irp-IoStatus.Status> 會設定為 STATUS_SUCCESS。
否則,狀態為適當的錯誤狀況為NTSTATUS程式碼。
如需詳細資訊,請參閱 [XREF-LINK:NTSTATUS 值]。
備註
準備 I/O 要求封包結構
驅動程式必須先配置或重複使用 I/O 要求封包, (IRP) 。 您可以使用 IoBuildDeviceIoControlRequest 例程來特別配置 IOCTL IRP。 您也可以使用一般用途的 IRP 建立和初始化例程,例如 IoAllocateIrp、 IoReuseIrp 或 IoInitializeIrp。 如需 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 要求的參數。 |
I參數。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 驅動程式已變更 (一或多個 VF 組態區塊中 無效) 數據。
- 在客體作業系統中執行的 VF 驅動程式。 此操作系統會在 Hyper-V 子分割內執行。
-
在管理作業系統中執行的 PF 驅動程式。
此操作系統會在 Hyper-V 父數據分割內執行。
- 在客體OS中,NDIS發出 IOCTL_VPCI_INVALIDATE_BLOCK 要求。
-
在管理OS中,會發生下列步驟:
- PF 迷你埠驅動程式會呼叫 NdisMInvalidateConfigBlock 函式,以通知 NDIS VF 設定數據已變更且不再有效。 驅動程式會將 BlockMask 參數設定為 ULONGLONG 位掩碼,指定哪些 VF 組態區塊已變更。 位掩碼中的每個位都會對應至 VF 組態區塊。 如果位設定為一個,則對應 VF 組態區塊中的數據已變更。
-
NDIS 會向在管理OS中執行的虛擬化堆疊發出有關 VF 組態區塊數據變更的訊號。 虛擬化堆疊會快取 BlockMask 參數數據。
注意 每次 PF 迷你埠驅動程式呼叫 NdisMInvalidateConfigBlock 時,虛擬化堆棧 OR會使用快取中目前的值來設定 BlockMask 參數數據。
- 虛擬化堆疊會通知虛擬PCI (在客體OS中執行的) 驅動程式,關於VF組態數據的失效。 虛擬化堆疊會將快取的 BlockMask 參數數據傳送至 APII 驅動程式。
-
在客體OS中,會發生下列步驟:
- JSONI 驅動程式會將快取的 BlockMask 參數數據儲存在與IOCTL_VPCI_INVALIDATE_BLOCK要求相關聯之VPCI_INVALIDATE_BLOCK_OUTPUT結構的 BlockMask 成員中。
-
此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 設定數據變更的後續通知。
- 當 VF 驅動程式處理OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK要求 時 ,它會從指定的 VF 組態區塊讀取數據。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows Server 2012 和更新版本的 Windows 支援。 |
標頭 | (包含 Wdm.h) |
IRQL | DISPATCH_LEVEL |
另請參閱
IRP_MJ_INTERNAL_DEVICE_CONTROL
OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO