Поделиться через


IOCTL_VPCI_WRITE_BLOCK IOCTL (vpci.h)

Драйвер виртуальной функции PCI Express (PCIe) выдает IOCTL_VPCI_WRITE_BLOCK код управления ввода-вывода (IOCTL) для записи данных в блок конфигурации VF. Драйвер выдает этот IOCTL следующему драйверу в стеке драйверов.

примечание этот запрос IOCTL выдает драйвер VF PCIe на устройстве, поддерживающем единый корневой интерфейс виртуализации ввода-вывода (SR-IOV) .
 
Когда драйвер выдает IOCTL_VPCI_WRITE_BLOCK IOCTL, драйвер должен выполнить следующие действия:
подготовка структуры пакета запросов ввода-вывода
подготовка структуры расположения стека ввода-вывода
выдачи запроса IOCTL
Результаты завершения запроса IOCTL
Дополнительные сведения о выпуске ioCTLs между драйверами в режиме ядра см. в создании запросов IOCTL в драйверах.

Основной код

IRP_MJ_DEVICE_CONTROL

Блок состояния

Irp->IoStatus.Status имеет значение STATUS_SUCCESS, если запрос выполнен успешно.

В противном случае состояние соответствующего условия ошибки в виде кода NTSTATUS.

Дополнительные сведения см. в разделе [Значения XREF-LINK:NTSTATUS].

Замечания

подготовка структуры пакета запросов ввода-вывода

Драйвер должен сначала выделить или повторно использовать пакет запроса ввода-вывода (IRP). Вы можете использовать подпрограмму ioBuildDeviceIoControlRequest, чтобы специально выделить IOCTL IRP. Вы также можете использовать процедуры создания и инициализации IRP общего назначения, например IoAllocateIrp, IoReuseIrpили IoInitializeIrp. Дополнительные сведения о выделении IRP см. в разделе Создании irPs для драйверов Lower-Level.

Затем драйвер должен задать элементы структуры IRP, как описано в следующей таблице.

Член IRP Ценность
UserBuffer NULL
UserEvent Адрес объекта события, который был инициализирован в вызове подпрограммы KeInitializeE vent.
Примечание Если асинхронное завершение запроса IOCTL не требуется, этот элемент должен иметь значение NULL. Дополнительные сведения см. в создании запросов IOCTL в драйверах.
 
UserIosb Адрес выделенной вызывающей IO_STATUS_BLOCK структуры. Эта структура обновляется нижним драйвером, чтобы указать окончательное состояние запроса ввода-вывода.
 

подготовка структуры расположения стека ввода-вывода

Драйвер вызывает процедуру IoGetNextIrpStackLocation для доступа к расположению стека ввода-вывода нижнего драйвера. Эта функция возвращает указатель на структуру IO_STACK_LOCATION, содержащую параметры расположения стека ввода-вывода.

Затем драйвер должен задать элементы в структуре IO_STACK_LOCATION, как описано в следующей таблице:

элемент IO_STACK_LOCATION Ценность
MajorFunction

IRP_MJ_INTERNAL_DEVICE_CONTROL

Parameters.DeviceIoControl.IoControlCode

IOCTL_VPCI_WRITE_BLOCK

Parameters.DeviceIoControl.Type3InputBuffer Указатель на структуру VPCI_WRITE_BLOCK_INPUT. Драйвер форматирует эту структуру с параметрами для запроса ввода-вывода IOCTL_VPCI_WRITE_BLOCK.
Parameters.DeviceIoControl.InputBufferLength Размер структуры VPCI_WRITE_BLOCK_INPUT в байтах.
Parameters.DeviceIoControl.OutputBufferLength Нуль
 

выдачи запроса IOCTL

Чтобы выполнить этот запрос IOCTL, драйвер вызывает процедуру IoCallDriver, чтобы передать запрос следующему драйверу в стеке драйверов. Драйвер задает параметры IoCallDriver, как описано в следующей таблице.
Параметр IoCallDriver Ценность
DeviceObject Объект устройства нижнего драйвера.
Irp Адрес IRP, который ранее был выделен и инициализирован. Дополнительные сведения см. в разделе Подготовка структуры пакета запросов ввода-вывода (IRP).
 

Результаты завершения запроса IOCTL

Когда запрос IOCTL IOCTL_VPCI_WRITE_BLOCK завершен, состояние член выделенной IO_STATUS_BLOCK вызывающего объекта имеет одно из значений в следующей таблице.
Значение состояния Описание
STATUS_SUCCESS IOCTL успешно завершен.
STATUS_PENDING IOCTL не завершен. Драйвер должен вызвать подпрограмму KeWaitForSingleObject, чтобы поместить текущий поток в состояние ожидания. Драйвер задает параметру объекта адрес объекта события, который был инициализирован в вызове подпрограммы KeInitializeEvent.

Событие сигнализирует о завершении запроса IOCTL. После сигнала события поток возобновляет выполнение.

STATUS_BUFFER_TOO_SMALL Элемент Parameters.DeviceIoControl.InputBufferLength был задан как значение меньше размера в байтах структуры VPCI_WRITE_BLOCK_INPUT.
 

Если запрос выполнен успешно, сведения член структуры IO_STATUS_BLOCK задано для количества записанных байтов. В противном случае элемент сведений равен нулю.

При выпуске IOCTL_VPCI_WRITE_BLOCK IOCTL драйвер физической функции PCIe (PF) уведомляется записать данные в указанный блок конфигурации VF.

Примечание Резервирует операционную систему и управляет ресурсами, необходимыми для успешного завершения этого IOCTL.
 
Блок конфигурации VF используется для взаимодействия между драйверами PCIe PF и VF на устройстве, поддерживающем интерфейс SR-IOV. Драйвер PF выделяет блок конфигурации для каждой виртуальной машины в неиспользуемых блоках пространства конфигурации PCI устройства.

Как только блок конфигурации VF выделен, данные конфигурации VF можно обмениваться защищенным способом между следующими драйверами:

  • Драйвер VF, который выполняется в гостевой операционной системе. Эта операционная система выполняется в дочерней секции Hyper-V.
  • Драйвер PF, который выполняется в операционной системе управления.

    Эта операционная система выполняется в родительском разделе Hyper-V.

Использование блока конфигурации VF и формата данных конфигурации определяются независимым поставщиком оборудования (IHV) устройства. Данные конфигурации используются только драйверами PF и VF.
Примечание IOCTL IOCTL_VPCI_WRITE_BLOCK предлагает асинхронную альтернативу подпрограмме writeVfConfigBlock WriteVfConfigBlock.
 

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно в Windows Server 2012 и более поздних версиях Windows.
заголовка vpci.h (include Wdm.h)
IRQL DISPATCH_LEVEL

См. также

IO_STATUS_BLOCK

IRP_MJ_INTERNAL_DEVICE_CONTROL

WriteVfConfigBlock

создание запросов IOCTL в драйверах

IRP

VPCI_WRITE_BLOCK_INPUT

IO_STACK_LOCATION

IoCallDriver