Inicialización de un controlador intermedio
Un controlador intermedio NDIS registra sus funciones MiniportXxx y sus funciones ProtocolXxx en el contexto de su rutina DriverEntry . Para registrar sus funciones MiniportXxx , un controlador intermedio debe llamar a la función NdisMRegisterMiniportDriver con la marca NDIS_INTERMEDIATE_DRIVER establecida. Esta marca está en la estructura NDIS_MINIPORT_DRIVER_CHARACTERISTICS que pasa el controlador en MiniportDriverCharacteristics. Para registrar sus funciones ProtocolXxx , un controlador intermedio debe llamar a la función NdisRegisterProtocolDriver .
DriverEntry devuelve STATUS_SUCCESS, o su NDIS_STATUS_SUCCESS equivalente, si el controlador registrado como controlador intermedio NDIS se ha registrado correctamente. Si DriverEntry produce un error al inicializar mediante la propagación de un estado de error devuelto por una función NdisXxx o por una rutina de soporte técnico en modo kernel, el controlador no permanecerá cargado. DriverEntry debe ejecutarse sincrónicamente; es decir, no puede devolver STATUS_PENDING ni su NDIS_STATUS_PENDING equivalente.
Para registrar el controlador intermedio con NDIS, la rutina DriverEntry debe, como mínimo:
- Llame a la función NdisMRegisterMiniportDriver con la marca NDIS_INTERMEDIATE_DRIVER establecida para registrar las funciones MiniportXxx del controlador.
- Llame a la función NdisRegisterProtocolDriver para registrar las funciones ProtocolXxx del controlador si el controlador se enlaza posteriormente a un controlador NDIS subyacente.
- Llame a la función NdisIMAssociateMiniport para informar al NDIS sobre la asociación entre el borde superior de la miniporte del controlador y el borde inferior del protocolo.
Si se produce un error en DriverEntry después de que NdisMRegisterMiniportDriver se devuelva correctamente, el controlador debe llamar a la función NdisMDeregisterMiniportDriver antes de que Se devuelva DriverEntry . Si DriverEntry se realiza correctamente, el controlador debe llamar a NdisMDeregisterMiniportDriver desde su función MiniportDriverUnload .
Los controladores intermedios comparten la mayoría de los requisitos de DriverEntry de los controladores de protocolo y los controladores de minipuerto.
La inicialización de la miniporte virtual de un controlador intermedio se produce cuando el controlador llama a la función NdisIMInitializeDeviceInstanceEx desde su función ProtocolBindAdapterEx .
NDIS llama a la función ProtocolBindAdapterEx después de que se hayan inicializado todos los controladores de minipuerto subyacentes.
En efecto, la función DriverEntry de un controlador intermedio NDIS puede omitir el puntero RegistryPath después de pasarlo a NdisMRegisterMiniportDriver. Este controlador también puede omitir el puntero DriverObject después de pasarlo a NdisMRegisterMiniportDriver. Sin embargo, el controlador debe guardar el valor del controlador de miniporte devuelto por NdisMRegisterMiniportDriver en NdisMiniportDriverHandle y el valor de identificador de protocolo devuelto por NdisRegisterProtocolDriver en NdisProtocolHandle para las llamadas posteriores a las funciones NdisXxx . La función ProtocolBindAdapterEx del controlador intermedio enlaza el controlador a cada controlador de miniport subyacente antes de llamar a su función MiniportInitializeEx para inicializar el miniporte virtual del controlador intermedio. Los controladores de protocolo de nivel aún más alto se enlazan posteriormente al miniporte virtual que crea. Esta estrategia permite que un controlador intermedio NDIS asigne recursos a la creación de la miniporte virtual según las características del controlador de miniporte subyacente al que está enlazado.