Compartir a través de


IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)

El controlador de una función virtual PCI Express (PCIe) emite la solicitud IOCTL de IOCTL_VPCI_INVALIDATE_BLOCK para recibir notificaciones de cambios en los datos de uno o varios bloques de configuración de VF. El controlador recibe una notificación de estos cambios cuando se completa el IOCTL. Una vez notificado, el controlador debe suponer que los datos leídos anteriormente de los bloques de configuración de VF especificados no son válidos. Por lo tanto, el controlador debe actualizar su caché leyendo de nuevo los datos del bloque de configuración.

El controlador emite este IOCTL al controlador inferior siguiente en la pila de controladores.

Nota Esta solicitud IOCTL la emite el controlador de un VF PCIe en un dispositivo que admite la interfaz de virtualización de E/S raíz única (SR-IOV).
 
Cuando el controlador emite el IOCTL_VPCI_INVALIDATE_BLOCK IOCTL, el controlador debe seguir estos pasos:
Preparar una estructura de paquetes de solicitud de E/S
Preparar una estructura de ubicación de pila de E/S
Emisión de la solicitud IOCTL
Resultados de finalización de solicitudes IOCTL
Para obtener más información sobre cómo emitir ICTLs entre controladores en modo kernel, consulte Creating IOCTL Requests in Drivers(Creación de solicitudes IOCTL en controladores).

Código principal

IRP_MJ_DEVICE_CONTROL

Bloque de estado

Irp-IoStatus.Status> se establece en STATUS_SUCCESS si la solicitud se realiza correctamente.

De lo contrario, estado de la condición de error adecuada como código NTSTATUS.

Para obtener más información, vea [XREF-LINK:NTSTATUS Values].

Comentarios

Preparar una estructura de paquetes de solicitud de E/S

El controlador debe asignar o reutilizar primero un paquete de solicitud de E/S (IRP). Puede usar la rutina IoBuildDeviceIoControlRequest para asignar específicamente un IRP de IOCTL. También puede usar rutinas de creación e inicialización de IRP de uso general, como IoAllocateIrp, IoReuseIrp o IoInitializeIrp. Para obtener más información sobre la asignación de IRP, consulte Creación de IRP para controladores de Lower-Level.

A continuación, el controlador debe establecer los miembros de la estructura IRP como se describe en la tabla siguiente.

Miembro IRP Valor
UserBuffer NULL
UserEvent Dirección del objeto de evento que se inicializó en la llamada a la rutina KeInitializeEvent .
Nota Si no se requiere la finalización asincrónica de la solicitud IOCTL, este miembro debe establecerse en NULL. Para obtener más información, consulte Creación de solicitudes IOCTL en controladores.
 
UserIosb Dirección de una estructura de IO_STATUS_BLOCK asignada por el autor de la llamada. El controlador inferior actualiza esta estructura para indicar el estado final de la solicitud de E/S.
 

Preparar una estructura de ubicación de pila de E/S

El controlador llama a la rutina IoGetNextIrpStackLocation para acceder a la ubicación de pila de E/S del controlador inferior. Esta función devuelve un puntero a una estructura IO_STACK_LOCATION que contiene los parámetros de la ubicación de la pila de E/S.

A continuación, el controlador debe establecer los miembros de la estructura IO_STACK_LOCATION , tal y como se describe en la tabla siguiente.

IO_STACK_LOCATION miembro Valor
MajorFunction

IRP_MJ_INTERNAL_DEVICE_CONTROL

Parámetros. DeviceIoControl. IoControlCode

IOCTL_VPCI_INVALIDATE_BLOCK

Parámetros. DeviceIoControl. Type3InputBuffer Puntero a una estructura de VPCI_INVALIDATE_BLOCK_OUTPUT . El controlador da formato a esta estructura con los parámetros de la solicitud de E/S de IOCTL_VPCI_INVALIDATE_BLOCK .
Parámetros I. DeviceIoControl. InputBufferLength Tamaño, en bytes, de la estructura VPCI_INVALIDATE_BLOCK_OUTPUT .
Parámetros. DeviceIoControl. OutputBufferLength Tamaño, en bytes, del búfer asignado por el autor de la llamada que contendrá los datos de configuración que se van a leer.
Nota Este valor debe ser el mismo que el valor del miembro BytesRequested de la estructura VPCI_INVALIDATE_BLOCK_OUTPUT .
 
 

Emisión de la solicitud IOCTL

Para emitir esta solicitud IOCTL, el controlador llama a la rutina IoCallDriver para pasar la solicitud al siguiente controlador inferior de la pila de controladores. El controlador establece los parámetros de IoCallDriver como se describe en la tabla siguiente.
Parámetro IoCallDriver Valor
DeviceObject Objeto de dispositivo del controlador inferior.
Irp Dirección del IRP que se asignó e inicializó anteriormente. Para obtener más información, vea Preparar una estructura de paquetes de solicitud de E/S.
 

Resultados de finalización de solicitudes IOCTL

Cuando se completa la solicitud IOCTL_VPCI_INVALIDATE_BLOCK IOCTL, los miembros de la estructura de IO_STATUS_BLOCK asignada por el autor de la llamada se establecen en los valores de la tabla siguiente.

Valor de estado Value
Estado STATUS_SUCCESS
Información Cero
 

Cuando se emite y completa el IOCTL_VPCI_INVALIDATE_BLOCK IOCTL, se notifica al controlador VF que el controlador PF ha cambiado (invalidado) los datos en uno o varios bloques de configuración de VF.

Nota El sistema operativo reserva y administra los recursos necesarios para completar correctamente este IOCTL.
 
Se usa un bloque de configuración VF para la comunicación backchannel entre los controladores del PCIe PF y un VF en un dispositivo que admite la interfaz SR-IOV. Los datos de configuración de VF se pueden intercambiar entre los siguientes controladores:
  • Controlador VF, que se ejecuta en el sistema operativo invitado. Este sistema operativo se ejecuta dentro de una partición secundaria de Hyper-V.
  • El controlador PF, que se ejecuta en el sistema operativo de administración.

    Este sistema operativo se ejecuta dentro de la partición primaria de Hyper-V.

A partir de NDIS 6.30, el controlador de minipuerto VF no debe emitir una solicitud de IOCTL_VPCI_INVALIDATE_BLOCK . En su lugar, se realizan los pasos siguientes para controlar las notificaciones de datos de bloques de configuración de VF no válidos.
  1. En el sistema operativo invitado, NDIS emite una solicitud de IOCTL_VPCI_INVALIDATE_BLOCK .
  2. En el sistema operativo de administración, se producen los pasos siguientes:
    1. El controlador de miniporte PF llama a la función NdisMInvalidateConfigBlock para notificar a NDIS que los datos de configuración de VF han cambiado y ya no son válidos. El controlador establece el parámetro BlockMask en una máscara de bits ULONGLONG que especifica qué bloques de configuración de VF han cambiado. Cada bit de la máscara de bits corresponde a un bloque de configuración de VF. Si un bit se establece en uno, los datos del bloque de configuración de VF correspondiente han cambiado.
    2. NDIS señala la pila de virtualización, que se ejecuta en el sistema operativo de administración, sobre el cambio en los datos del bloque de configuración de VF. La pila de virtualización almacena en caché los datos del parámetro BlockMask .
      Nota Cada vez que el controlador de miniporte PF llama a NdisMInvalidateConfigBlock, la pila de virtualización Os los datos del parámetro BlockMask con el valor actual en su memoria caché.
       
    3. La pila de virtualización notifica al controlador PCI virtual (VPCI), que se ejecuta en el sistema operativo invitado, sobre la invalidación de los datos de configuración de VF. La pila de virtualización envía los datos del parámetro BlockMask almacenados en caché al controlador VPCI.
  3. En el sistema operativo invitado, se producen los pasos siguientes:
    1. El controlador VPCI guarda los datos de parámetros BlockMask almacenados en caché en el miembro BlockMask de la estructura de VPCI_INVALIDATE_BLOCK_OUTPUT asociada a la solicitud de IOCTL_VPCI_INVALIDATE_BLOCK .
    2. El controlador VPCI completa correctamente la solicitud de IOCTL_VPCI_INVALIDATE_BLOCK . Cuando esto sucede, NDIS emite una solicitud de identificador de objeto (OID) de OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK al controlador de miniporte VF. Se pasa un puntero a una estructura de NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO en la solicitud de OID. Esta estructura contiene los datos de parámetro BlockMask almacenados en caché.

      NDIS también emite otra solicitud de IOCTL_VPCI_INVALIDATE_BLOCK para controlar las notificaciones sucesivas de cambios en los datos de configuración de VF.

    3. Cuando el controlador VF controla la solicitud de OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK , lee los datos de los bloques de configuración de VF especificados.
Nota El uso del bloque de configuración de VF y el formato de sus datos de configuración se definen mediante el proveedor de hardware independiente (IHV) del dispositivo. Los datos de configuración solo los usan los controladores de PF y VF.
 

Requisitos

Requisito Value
Cliente mínimo compatible Se admite en Windows Server 2012 y versiones posteriores de Windows.
Encabezado vpci.h (incluye Wdm.h)
IRQL DISPATCH_LEVEL

Consulte también

IO_STATUS_BLOCK

VPCI_INVALIDATE_BLOCK_OUTPUT

NdisMInvalidateConfigBlock

IRP_MJ_INTERNAL_DEVICE_CONTROL

Creación de solicitudes IOCTL en controladores

IRP

IO_STACK_LOCATION

IoCallDriver

OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK

NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO