Implementación de un controlador de miniport virtual storport

En esta página se proporciona información de implementación de alto nivel para un controlador de miniport virtual de Storport (VMiniport). La interfaz VMiniport se define en storport.h.

Las consideraciones de diseño son exclusivas de varias VMiniports, por lo que aquí no se incluyen detalles de implementación.

Interfaz VMiniport

En esta sección se enumeran las funciones, devoluciones de llamada y estructuras más destacadas que implementa o usa un VMiniport. Se requieren algunas funciones y devoluciones de llamada; las devoluciones de llamada opcionales son únicas para el diseño de VMiniport.

  • DriverEntry, que es la primera rutina a la que llama el sistema operativo después de cargar VMiniport. Esta rutina es necesaria.

  • HW_INITIALIZATION_DATA, que es una estructura asignada e inicializada de Vminiport que el VMiniport pasa a Storport durante la inicialización. VMiniport proporciona punteros a sus funciones de devolución de llamada en esta estructura.

    Se requieren las siguientes rutinas de devolución de llamada:

    Las siguientes rutinas de devolución de llamada son opcionales, aunque es posible que una instancia de VMiniport tenga que implementar algunas de ellas en función de su arquitectura única:

    • HwInitializeTracing

    • HwCleanupTracing. Esta rutina es necesaria cuando HwInitializeTracing apunta a una rutina de devolución de llamada; de lo contrario, esta rutina es opcional y es única para un VMiniport.

    • HwProcessServiceRequest. Esta rutina recibe un IRP de "devolución de llamada inversa", que se completará cuando VMiniport actualice el autor de la llamada (como una aplicación en modo de usuario o un controlador en modo kernel) o requiera que el autor de la llamada haga algo en nombre de VMiniport.

    • HwCompleteServiceIrp. Esta rutina es necesaria cuando HwProcessServiceRequest apunta a una rutina de devolución de llamada; de lo contrario, esta rutina es opcional y es única para un VMiniport. Se llama a HwCompleteServiceIrp cuando se quita el adaptador virtual para que VMiniport pueda completar cualquier IRP de devolución de llamada inversa que puedan estar pendientes.

    VMiniport también debe establecer los siguientes miembros de la estructura HW_INITIALIZATION_DATA :

    • Establezca HwInitializationDataSize en sizeof(HW_INITIALIZATION_DATA).

    • Establezca AdapterInterfaceType en Interno, que indica a Storport que se trata de un adaptador virtual.

    • Establezca HwBuildIo en NULL.

    El controlador Vminiport establece otros campos según sea necesario. Los campos sin usar deben establecerse en cero.

  • PORT_CONFIGURATION_INFORMATION, que es una estructura asignada por Storport. Storport inicializa algunos miembros de PORT_CONFIGURATION_INFORMATION y, a continuación, los pasa a la devolución de llamada HwFindAdapter de VMiniport, donde VMiniport completa la inicialización. Dado que Storport inicializa esta estructura previamente, HWFindAdapter no debe tener cero en la estructura. Una instancia de VMiniport debe establecer VirtualDevice en TRUE.

Inicialización de VMiniport

Una instancia de VMiniport tiene tres fases de inicialización.

  • En la primera fase, la rutina DriverEntry de VMiniport llama a StorPortInitialize con un puntero a su estructura de HW_INITIALIZATION_DATA inicializada.

  • Storport llama a la devolución de llamada HwFindAdapter de VMiniport con una estructura de PORT_CONFIGURATION_INFORMATION asignada por Storport e inicializada parcialmente. La función principal de HwFindAdapter es completar la inicialización de PORT_CONFIGURATION_INFORMATION, incluida la configuración del miembro VirtualDevice en TRUE.

  • Después de que HwFindAdapter vuelva correctamente, Storport llama a la devolución de llamada HwInitialize de VMiniport para completar la inicialización de VMiniport.

E/S de VMiniport

Storport llama a la devolución de llamada HwStartIo de VMiniport para iniciar una solicitud de E/S. En Storport, se describe una solicitud de E/S mediante un SCSI_REQUEST_BLOCK o STORAGE_REQUEST_BLOCK (SRB estándar o extendido, respectivamente).

A diferencia de un controlador de miniport físico, Storport no llama a HwBuildIo en una instancia de Vminiport antes de llamar a HwStartIo.

No se mantienen bloqueos antes de llamar a HwStartIo. La profundidad de cola predeterminada para cada unidad lógica que se expone a través de la interfaz de minipuerto virtual es 250.