Inicializando um driver intermediário
Um driver intermediário do NDIS registra suas funções MiniportXxx e suas funções ProtocolXxx no contexto de sua rotina DriverEntry . Para registrar suas funções MiniportXxx , um driver intermediário deve chamar a função NdisMRegisterMiniportDriver com o sinalizador NDIS_INTERMEDIATE_DRIVER definido. Esse sinalizador está na estrutura NDIS_MINIPORT_DRIVER_CHARACTERISTICS que o driver passa em MiniportDriverCharacteristics. Para registrar suas funções ProtocolXxx , um driver intermediário deve chamar a função NdisRegisterProtocolDriver .
DriverEntry retornará STATUS_SUCCESS ou seu NDIS_STATUS_SUCCESS equivalente, se o driver registrado como um driver intermediário NDIS tiver êxito. Se DriverEntry falhar na inicialização propagando um erro status que foi retornado por uma função NdisXxx ou por uma rotina de suporte no modo kernel, o driver não permanecerá carregado. DriverEntry deve ser executado de forma síncrona; ou seja, ele não pode retornar STATUS_PENDING ou seu NDIS_STATUS_PENDING equivalente.
Para registrar o driver intermediário com o NDIS, a rotina DriverEntry deve, no mínimo:
- Chame a função NdisMRegisterMiniportDriver com o sinalizador NDIS_INTERMEDIATE_DRIVER definido para registrar as funções MiniportXxx do driver.
- Chame a função NdisRegisterProtocolDriver para registrar as funções ProtocolXxx do driver se o driver se associar posteriormente a um driver NDIS subjacente.
- Chame a função NdisIMAssociateMiniport para informar o NDIS sobre a associação entre a borda superior do miniporto do driver e a borda inferior do protocolo.
Se ocorrer um erro em DriverEntry após NdisMRegisterMiniportDriver retornar com êxito, o driver deverá chamar a função NdisMDeregisterMiniportDriver antes que DriverEntry retorne. Se DriverEntry for bem-sucedido, o driver deverá chamar NdisMDeregisterMiniportDriver de sua função MiniportDriverUnload .
Os drivers intermediários compartilham a maioria dos requisitos do DriverEntry de drivers de protocolo e drivers de miniport.
A inicialização do miniporto virtual de um driver intermediário ocorre quando o driver chama a função NdisIMInitializeDeviceInstanceEx de sua função ProtocolBindAdapterEx .
O NDIS chama a função ProtocolBindAdapterEx depois que todos os drivers de miniportos subjacentes são inicializados.
Na verdade, a função DriverEntry de um driver intermediário do NDIS pode ignorar o ponteiro RegistryPath depois de passá-lo para NdisMRegisterMiniportDriver. Esse driver também pode ignorar o ponteiro DriverObject depois de passá-lo para NdisMRegisterMiniportDriver. No entanto, o driver deve salvar o valor do identificador do driver de miniport que é retornado por NdisMRegisterMiniportDriver em NdisMiniportDriverHandle e o valor do identificador de protocolo retornado por NdisRegisterProtocolDriver em NdisProtocolHandle para chamadas subsequentes às funções NdisXxx . A função ProtocolBindAdapterEx do driver intermediário associa o driver a cada driver de miniporte subjacente antes que sua função MiniportInitializeEx seja chamada para inicializar o miniporto virtual do driver intermediário. Os drivers de protocolo de nível ainda mais alto se associam posteriormente ao miniporto virtual que ele cria. Essa estratégia permite que um driver intermediário do NDIS aloque recursos na criação do miniporto virtual de acordo com os recursos do driver de miniporto subjacente ao qual ele está associado.