IOCTL_VPCI_WRITE_BLOCK IOCTL (vpci.h)
Драйвер для виртуальной функции PCI Express (PCIe) выдает код управления IOCTL_VPCI_WRITE_BLOCK ввода-вывода (IOCTL) для записи данных в блок конфигурации VF. Драйвер выдает этот IOCTL следующему драйверу в стеке драйверов.
- Подготовка структуры пакета запроса ввода-вывода
- Подготовка структуры расположения стека ввода-вывода
- Выдача запроса IOCTL
- Результаты завершения запроса IOCTL
Основной код
Блок состояния
Irp-IoStatus.Status> имеет значение STATUS_SUCCESS, если запрос выполнен успешно.
В противном случае — состояние соответствующего условия ошибки в виде кода NTSTATUS.
Дополнительные сведения см. в разделе [значения XREF-LINK:NTSTATUS].
Комментарии
Подготовка структуры пакета запроса ввода-вывода
Драйвер должен сначала выделить или повторно использовать пакет запросов ввода-вывода (IRP). Для выделения IOCTL IRP можно использовать подпрограмму IoBuildDeviceIoControlRequest . Вы также можете использовать процедуры создания и инициализации IRP общего назначения, такие как IoAllocateIrp, IoReuseIrp или IoInitializeIrp. Дополнительные сведения о выделении IRP см. в разделе Создание irP для драйверов Lower-Level.Затем драйвер должен задать элементы структуры IRP , как описано в следующей таблице.
Элемент IRP | Значение |
---|---|
UserBuffer | NULL |
UserEvent |
Адрес объекта события, который был инициализирован в вызове подпрограммы KeInitializeEvent . Примечание Если асинхронное завершение запроса IOCTL не требуется, этот элемент должен иметь значение NULL. Дополнительные сведения см. в разделе Создание запросов IOCTL в драйверах.
|
UserIosb | Адрес структуры, выделенной вызывающей IO_STATUS_BLOCK . Эта структура обновляется нижним драйвером, чтобы указать окончательное состояние запроса ввода-вывода. |
Подготовка структуры расположения стека ввода-вывода
Драйвер вызывает подпрограмму IoGetNextIrpStackLocation для доступа к расположению стека ввода-вывода нижнего драйвера. Эта функция возвращает указатель на структуру IO_STACK_LOCATION , содержащую параметры для расположения стека ввода-вывода.Затем драйвер должен задать члены в структуре IO_STACK_LOCATION , как описано в следующей таблице:
элемент IO_STACK_LOCATION | Значение |
---|---|
MajorFunction | |
Parameters.DeviceIoControl.IoControlCode | |
Parameters.DeviceIoControl.Type3InputBuffer | Указатель на структуру VPCI_WRITE_BLOCK_INPUT . Драйвер форматирует эту структуру с параметрами для запроса ввода-вывода IOCTL_VPCI_WRITE_BLOCK . |
IParameters.DeviceIoControl.InputBufferLength | Размер структуры VPCI_WRITE_BLOCK_INPUT в байтах. |
Parameters.DeviceIoControl.OutputBufferLength | Ноль |
Выдача запроса IOCTL
Чтобы выполнить этот запрос IOCTL, драйвер вызывает подпрограмму IoCallDriver для передачи запроса следующему драйверу в стеке драйверов. Драйвер задает параметры IoCallDriver , как описано в следующей таблице.Параметр IoCallDriver | Значение |
---|---|
DeviceObject | Объект устройства нижнего драйвера. |
Irp | Адрес IRP , который был ранее выделен и инициализирован. Дополнительные сведения см. в статье Подготовка структуры пакета запроса ввода-вывода (IRP). |
Результаты завершения запроса IOCTL
После завершения запроса IOCTL IOCTL_VPCI_WRITE_BLOCKэлементу Status структуры IO_STATUS_BLOCK , выделенной вызывающим объектом, присваивается одно из значений, приведенных в следующей таблице.Значение состояния | Описание |
---|---|
STATUS_SUCCESS | IOCTL успешно завершен. |
STATUS_PENDING |
IOCTL не завершен. Драйвер должен вызвать подпрограмму KeWaitForSingleObject , чтобы поместить текущий поток в состояние ожидания. Драйвер задает в параметре Object адрес объекта события, который был инициализирован в вызове подпрограммы KeInitializeEvent .
Событие получает сигнал о завершении запроса IOCTL. После сигнала о событии поток возобновляет выполнение. |
STATUS_BUFFER_TOO_SMALL | Для элемента Parameters.DeviceIoControl.InputBufferLength задано значение меньше размера структуры VPCI_WRITE_BLOCK_INPUT в байтах . |
Если запрос выполнен успешно, для элемента Informationструктуры IO_STATUS_BLOCK устанавливается число записанных байтов. В противном случае элементу Information присваивается нулевое значение.
При выдаче IOCTL_VPCI_WRITE_BLOCK IOCTL драйвер физической функции PCIe (PF) получает уведомление о записи данных в указанный блок конфигурации VF.
После выделения блока конфигурации VF данные конфигурации VF можно обмениваться защищенным способом между следующими драйверами:
- Драйвер VF, который выполняется в гостевой операционной системе. Эта операционная система работает в дочернем разделе Hyper-V.
-
Драйвер PF, который работает в операционной системе управления.
Эта операционная система работает в родительском разделе Hyper-V.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows Server 2012 и более поздних версиях Windows. |
Верхняя часть | vpci.h (включая Wdm.h) |
IRQL | DISPATCH_LEVEL |
См. также раздел
IRP_MJ_INTERNAL_DEVICE_CONTROL
Создание запросов IOCTL в драйверах