IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)
Драйвер виртуальной функции PCI Express (PCIe) выдает запрос IOCTL IOCTL_VPCI_INVALIDATE_BLOCK , чтобы получать уведомления об изменениях данных в одном или нескольких блоках конфигурации VF. После завершения 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 | |
Параметры. DeviceIoControl. IoControlCode | |
Параметры. DeviceIoControl. Type3InputBuffer | Указатель на структуру VPCI_INVALIDATE_BLOCK_OUTPUT . Драйвер форматирует эту структуру с помощью параметров для запроса ввода-вывода IOCTL_VPCI_INVALIDATE_BLOCK . |
Параметры I. DeviceIoControl. InputBufferLength | Размер структуры VPCI_INVALIDATE_BLOCK_OUTPUT в байтах. |
Параметры. DeviceIoControl. OutputBufferLength |
Размер буфера, выделенного вызывающим объектом, в байтах, который будет содержать считываемые данные конфигурации. Примечание Это значение должно совпадать со значением элемента BytesRequestedструктуры VPCI_INVALIDATE_BLOCK_OUTPUT .
|
Выдача запроса IOCTL
Чтобы выполнить этот запрос IOCTL, драйвер вызывает подпрограмму IoCallDriver для передачи запроса следующему драйверу в стеке драйверов. Драйвер задает параметры IoCallDriver , как описано в следующей таблице.Параметр IoCallDriver | Значение |
---|---|
DeviceObject | Объект устройства нижнего драйвера. |
Irp | Адрес IRP , который был ранее выделен и инициализирован. Дополнительные сведения см. в статье Подготовка структуры пакетов запроса ввода-вывода. |
Результаты завершения запроса IOCTL
После завершения запроса IOCTL IOCTL_VPCI_INVALIDATE_BLOCK члены структуры, выделенной вызывающим объектом IO_STATUS_BLOCK , получают значения, приведенные в следующей таблице.
Значение состояния | Значение |
---|---|
Состояние | STATUS_SUCCESS |
Информация | Ноль |
После выдачи и завершения IOCTL_VPCI_INVALIDATE_BLOCK IOCTL драйвер VF получает уведомление о том, что драйвер PF изменил (сделал недействительными) данные в одном или нескольких блоках конфигурации VF.
- Драйвер VF, который выполняется в гостевой операционной системе. Эта операционная система работает в дочернем разделе Hyper-V.
-
Драйвер PF, который работает в операционной системе управления.
Эта операционная система работает в родительском разделе Hyper-V.
- В гостевой ОС NDIS отправляет запрос IOCTL_VPCI_INVALIDATE_BLOCK .
-
В ОС управления выполняются следующие действия.
- Драйвер минипорта PF вызывает функцию NdisMInvalidateConfigBlock , чтобы уведомить NDIS о том, что данные конфигурации VF изменились и больше не действительны. Драйвер задает для параметра BlockMask битовую маску ULONGLONG , которая указывает, какие блоки конфигурации VF были изменены. Каждый бит в битовой маске соответствует блоку конфигурации VF. Если бит имеет значение 1, данные в соответствующем блоке конфигурации VF изменились.
-
NDIS сообщает стеку виртуализации, который работает в ОС управления, об изменении данных блока конфигурации VF. Стек виртуализации кэширует данные параметра BlockMask .
Примечание Каждый раз, когда драйвер минипорта PF вызывает NdisMInvalidateConfigBlock, стек виртуализации ИЛИвозвращает данные параметра BlockMask с текущим значением в кэше.
- Стек виртуализации уведомляет драйвер виртуального PCI (VPCI), который работает в гостевой ОС, о том, что данные конфигурации VF недействительны. Стек виртуализации отправляет кэшированные данные параметров BlockMask драйверу VPCI.
-
В гостевой ОС выполняются следующие действия.
- Драйвер VPCI сохраняет кэшированные данные параметров BlockMask в элементе BlockMaskструктуры VPCI_INVALIDATE_BLOCK_OUTPUT, связанной с запросом IOCTL_VPCI_INVALIDATE_BLOCK .
-
Драйвер VPCI успешно завершает запрос IOCTL_VPCI_INVALIDATE_BLOCK . В этом случае NDIS отправляет запрос идентификатора объекта (OID) OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK драйверу мини-порта VF. В запросе OID передается указатель на структуру NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO . Эта структура содержит кэшированные данные параметров BlockMask .
NDIS также отправляет другой запрос IOCTL_VPCI_INVALIDATE_BLOCK для обработки последовательных уведомлений об изменениях данных конфигурации VF.
- Когда драйвер VF обрабатывает запрос OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK , он считывает данные из указанных блоков конфигурации VF.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Поддерживается в Windows Server 2012 и более поздних версиях Windows. |
Верхняя часть | vpci.h (включая Wdm.h) |
IRQL | DISPATCH_LEVEL |
См. также раздел
IRP_MJ_INTERNAL_DEVICE_CONTROL
Создание запросов IOCTL в драйверах
OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO