Inizializzazione di un driver intermedio
Un driver intermedio NDIS registra le funzioni MiniportXxx e le relative funzioni ProtocolXxx nel contesto della routine DriverEntry . Per registrare le funzioni MiniportXxx , un driver intermedio deve chiamare la funzione NdisMRegisterMiniportDriver con il set di flag NDIS_INTERMEDIATE_DRIVER. Questo flag si trova nella struttura NDIS_MINIPORT_DRIVER_CHARACTERISTICS che il driver passa a MiniportDriverCharacteristics. Per registrare le funzioni ProtocolXxx , un driver intermedio deve chiamare la funzione NdisRegisterProtocolDriver .
DriverEntry restituisce STATUS_SUCCESS o il relativo NDIS_STATUS_SUCCESS equivalente, se il driver registrato come driver intermedio NDIS ha esito positivo. Se DriverEntry non riesce l'inizializzazione propagando uno stato di errore restituito da una funzione NdisXxx o da una routine di supporto in modalità kernel, il driver non rimarrà caricato. DriverEntry deve eseguire in modo sincrono; ovvero, non può restituire STATUS_PENDING o il relativo NDIS_STATUS_PENDING equivalente.
Per registrare il driver intermedio con NDIS, la routine DriverEntry deve, almeno:
- Chiamare la funzione NdisMRegisterMiniportDriver con il flag NDIS_INTERMEDIATE_DRIVER impostato per registrare le funzioni MiniportXxx del driver.
- Chiamare la funzione NdisRegisterProtocolDriver per registrare le funzioni ProtocolXxx del driver se il driver si associa successivamente a un driver NDIS sottostante.
- Chiamare la funzione NdisIMAssociateMiniport per informare NDIS sull'associazione tra il bordo superiore del miniport del driver e il bordo inferiore del protocollo.
Se si verifica un errore in DriverEntry dopo che NdisMRegisterMiniportDriver restituisce correttamente, il driver deve chiamare la funzione NdisMDeregisterMiniportDriver prima che DriverEntry restituisca. Se DriverEntry ha esito positivo, il driver deve chiamare NdisMDeregisterMiniportDriver dalla relativa funzione MiniportDriverUnload .
I driver intermedi condividono la maggior parte dei requisiti driverEntry dei driver di protocollo e dei driver miniport.
L'inizializzazione del miniport virtuale di un driver intermedio si verifica quando il driver chiama la funzione NdisIMInitializeDeviceInstanceEx dalla funzione ProtocolBindAdapterEx .
NDIS chiama la funzione ProtocolBindAdapterEx dopo l'inizializzazione di tutti i driver miniport sottostanti.
In effetti, la funzione DriverEntry di un driver intermedio NDIS può ignorare il puntatore RegistryPath dopo NdisMRegisterMiniportDriver. Tale driver può anche ignorare il puntatore DriverObject dopo averlo passato a NdisMRegisterMiniportDriver. Tuttavia, il driver deve salvare il valore dell'handle del driver miniport restituito da NdisMRegisterMiniportDriver in NdisMiniportDriverHandle e il valore di handle del protocollo restituito da NdisRegisterProtocolDriver in NdisProtocolHandle per le chiamate successive alle funzioni NdisXxx . La funzione ProtocolBindAdapterEx del driver intermedio associa il driver a ogni driver miniport sottostante prima che la funzione MiniportInitializeEx venga chiamata per inizializzare il miniport virtuale del driver intermedio. I driver di protocollo di livello ancora più alto si associano successivamente al miniport virtuale creato. Questa strategia consente a un driver intermedio NDIS di allocare risorse alla creazione del miniport virtuale in base alle funzionalità del driver miniport sottostante a cui è associato.