Inicialización de miniportes virtuales
Un controlador intermedio inicializa sus minipuertos virtuales después de haber abierto correctamente un adaptador de minipuerto subyacente y está listo para aceptar solicitudes y enviar en sus minipuertos virtuales. Un controlador intermedio llama a NdisIMInitializeDeviceInstanceEx desde su función ProtocolBindAdapterEx una o varias veces para solicitar la inicialización de uno o varios miniportes virtuales.
Nota No es necesario un controlador intermedio para llamar a NdisIMInitializeDeviceInstanceEx cuando se abre un adaptador de miniport subyacente. No es necesario que haya una relación uno a uno entre minipuertos virtuales y adaptadores abiertos.
Establezca el parámetro DriverInstance de NdisIMInitializeDeviceInstanceEx en el nombre del dispositivo para el miniporte virtual que se inicializa. El controlador intermedio obtiene el nombre del dispositivo de la clave del Registro UpperBindings .
Para un controlador intermedio MUX de n a uno que supere varios minipuertos virtuales en una sola NIC física, debe haber un nombre de dispositivo para cada minipuerto virtual. El controlador intermedio MUX requiere un objeto de notificación que mantiene la lista de nombres de dispositivo de miniporte virtual. La ubicación recomendada para la lista es la clave del Registro UpperBindings . En este caso, la clave del Registro UpperBindings es una entrada MULTI_SZ que contiene la lista de nombres de dispositivo. El controlador intermedio MUX llama a NdisIMInitializeDeviceInstanceEx una vez para cada nombre de dispositivo especificado en la lista de nombres de dispositivo.
Llamar a NdisIMInitializeDeviceInstanceEx da como resultado una llamada a la función MiniportInitializeEx del controlador intermedio para realizar la inicialización del miniport virtual especificado, siempre que NDIS reciba un IRP_MN_START_DEVICE para iniciar el dispositivo. Si NDIS no recibe este TIPO de IRP, NDIS no llamará a la función MiniportInitializeEx del controlador intermedio. La llamada a MiniportInitializeEx puede producirse más adelante y, por lo tanto, no está necesariamente dentro del contexto de la llamada a NdisIMInitializeDeviceInstanceEx. Si NDIS nunca llama a MiniportInitializeEx para el miniporte virtual al que se hace referencia en una llamada a NdisIMInitializeDeviceInstanceEx y el controlador intermedio ya no requiere el miniport virtual, el controlador intermedio debe llamar a NdisIMCancelInitializeDeviceInstance para cancelar la inicialización del miniport virtual. Por ejemplo, supongamos que un controlador intermedio crea un minipuerto virtual en respuesta a un enlace correcto a un minipuerto subyacente. Si ese enlace se quita antes de que NDIS llame a MiniportInitializeEx, el controlador intermedio debe llamar a NdisIMCancelInitializeDeviceInstance para cancelar la inicialización del miniport.
MiniportInitializeEx debe asignar e inicializar un área de contexto específica del miniporte virtual. Para obtener más información sobre cómo especificar el área de contexto, consulte Inicialización de un miniporte virtual.
Un controlador intermedio debe funcionar como un controlador deserializado. Para obtener más información sobre los controladores deserializados, vea Controladores de miniport NDIS deserializados.
Un controlador intermedio debe comprobar que la información de estado que mantiene se inicializa correctamente. Si el controlador requiere recursos relacionados con el envío, por ejemplo, se pueden asignar nuevas estructuras de NET_BUFFER_LIST para los datos de red que MiniportSendNetBufferLists transmitirá a la siguiente capa inferior: el grupo de estructuras NET_BUFFER_LIST se puede asignar en este momento.