共用方式為


IOCTL_VPCI_READ_BLOCK IOCTL ()

PCI Express (PCIe 的驅動程式) 虛擬函式 (VF) 發出 IOCTL_VPCI_READ_BLOCK

I/O 控制程式代碼 (IOCTL) ,以便從 VF 組態區塊讀取數據。 驅動程式會將此 IOCTL 發行至驅動程式堆疊中的下一個較低驅動程式。

注意 此 IOCTL 要求是由支援單一根 I/O 虛擬化 (SR-IOV) 介面之裝置上的 PCIe VF 驅動程式所發出。
 
當驅動程式發出 IOCTL_VPCI_READ_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 呼叫端配置的緩衝區位址,其中包含要讀取的組態數據。
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

Parameters.DeviceIoControl.IoControlCode

IOCTL_VPCI_READ_BLOCK

Parameters.DeviceIoControl.Type3InputBuffer VPCI_READ_BLOCK_INPUT 結構的指標。 驅動程式會將此結構格式化為 IOCTL_VPCI_READ_BLOCK I/O 要求的參數。
IParameters.DeviceIoControl.InputBufferLength VPCI_READ_BLOCK_INPUT 結構的大小 ,以位元組為單位。
Parameters.DeviceIoControl.OutputBufferLength 呼叫端配置的緩衝區大小,以位元組為單位,其中包含要讀取的組態數據。
注意這個值必須與 VPCI_READ_BLOCK_INPUT 結構之 BytesRequested 成員的值相同。
 
 

發出IOCTL要求

若要發出此 IOCTL 要求,驅動程式會呼叫 IoCallDriver 函式,將要求傳遞至驅動程式堆疊中的下一個較低驅動程式。 驅動程式會設定 IoCallDriver 的參數,如下表所述。
IoCallDriver 參數
DeviceObject 較低驅動程式的裝置物件。
Irp 先前配置和初始化之 IRP 的位址。 如需詳細資訊,請參閱 準備 I/O 要求封包 (IRP) 結構
 

IOCTL 要求完成結果

完成IOCTL_VPCI_READ_BLOCK IOCTL 要求時,呼叫端配置IO_STATUS_BLOCK結構的 Status 成員會設定為下表中的其中一個值。
狀態值 描述
STATUS_SUCCESS IOCTL 成功完成。
STATUS_PENDING IOCTL 尚未完成。 驅動程式必須呼叫 KeWaitForSingleObject 函式,才能讓目前的線程進入等候狀態。 驅動程式會將 Object 參數設定為呼叫 KeInitializeEvent 函式中所初始化之事件對象的位址。

當 IOCTL 要求完成時,事件會發出訊號。 事件發出訊號之後,線程就會繼續執行。

STATUS_BUFFER_TOO_SMALL Parameters.DeviceIoControl.InputBufferLength 成員或 Parameters.DeviceIoControl.OutputBufferLength 成員已設定為小於所需緩衝區大小的值。
 

如果要求成功完成,則IO_STATUS_BLOCK結構的信息成員會設定為讀取的位元元組數目。 否則, 信息 成員會設定為零。

發出 IOCTL_VPCI_READ_BLOCK IOCTL 時,會通知 PCIe 實體函式的驅動程式 (PF) ,以從指定的 VF 組態區塊傳回數據。

注意 操作系統會保留和管理此 IOCTL 成功完成所需的資源。
 
VF 組態區塊用於PCIe PF驅動程式與支援SR-IOV介面之裝置上的 VF 之間的反向通道通訊。 VF 組態區塊中的數據可以在下列驅動程式之間交換:
  • 在客體作業系統中執行的 VF 驅動程式。 此操作系統會在 Hyper-V 子分割內執行。
  • 在管理作業系統中執行的 PF 驅動程式。

    此操作系統會在 Hyper-V 父數據分割內執行。

VF 組態區塊的使用方式及其設定數據的格式是由裝置的獨立硬體廠商所定義, (IHV) 。 組態數據僅供 PF 和 VF 的驅動程式使用。
注意IOCTL_VPCI_READ_BLOCK IOCTL 提供 ReadVfConfigBlock 函式的異步替代方案。
 

規格需求

需求
最低支援的用戶端 Windows Server 2012 和更新版本的 Windows 支援。
標頭 (包含 Wdm.h)
IRQL DISPATCH_LEVEL

另請參閱

IO_STATUS_BLOCK

IRP_MJ_INTERNAL_DEVICE_CONTROL

ReadVfConfigBlock

在驅動程式中建立IOCTL要求

VPCI_READ_BLOCK_INPUT

IRP

IO_STACK_LOCATION

IoCallDriver