Initiera en mellanliggande drivrutin
En mellanliggande NDIS-drivrutin registrerar sina MiniportXxx-funktioner och sina ProtocolXxx-funktioner i samband med sin DriverEntry- rutin. För att registrera sina MiniportXxx-funktioner måste en mellanliggande drivrutin anropa funktionen NdisMRegisterMiniportDriver med NDIS_INTERMEDIATE_DRIVER-flagga inställd. Den här flaggan finns i strukturen NDIS_MINIPORT_DRIVER_CHARACTERISTICS som drivrutinen skickar vid MiniportDriverCharacteristics. Om du vill registrera dess ProtocolXxx-funktioner måste en mellanliggande drivrutin anropa funktionen NdisRegisterProtocolDriver.
DriverEntry returnerar STATUS_SUCCESS, eller motsvarande NDIS_STATUS_SUCCESS, om drivrutinen har registrerats korrekt som en NDIS-mellanliggande drivrutin. Om DriverEntry misslyckas med initieringen genom att sprida en felstatus som returnerades av en NdisXxx- funktion eller av en stödrutin för kernelläge, kommer drivrutinen inte att vara inläst. DriverEntry måste köras synkront. Den kan alltså inte returnera STATUS_PENDING eller motsvarande NDIS_STATUS_PENDING.
För att registrera den mellanliggande drivrutinen med NDIS måste DriverEntry-rutin åtminstone:
- Anropa funktionen NdisMRegisterMiniportDriver med flaggan NDIS_INTERMEDIATE_DRIVER inställd för att registrera förarens MiniportXxx-funktioner.
- Anropa funktionen NdisRegisterProtocolDriver för att registrera drivrutinens ProtocolXxx- funktioner om drivrutinen därefter binder sig till en underliggande NDIS-drivrutin.
- Anropa funktionen NdisIMAssociateMiniport för att informera NDIS om kopplingen mellan miniportens övre bit och protokollets nedre bit i drivrutinen.
Om ett fel inträffar i DriverEntry efter att NdisMRegisterMiniportDriver returnerar korrekt, måste drivrutinen anropa funktionen NdisMDeregisterMiniportDriver innan DriverEntry returnerar. Om DriverEntry lyckas måste drivrutinen anropa NdisMDeregisterMiniportDriver från dess MiniportDriverUnload-funktion.
Mellanliggande drivrutiner delar de flesta DriverEntry krav för protokolldrivrutiner och miniportdrivrutiner.
Initieringen av en mellanliggande drivrutins virtuella miniport inträffar när drivrutinen anropar funktionen NdisIMInitializeDeviceInstanceEx från funktionen ProtocolBindAdapterEx.
NDIS anropar funktionen ProtocolBindAdapterEx när alla underliggande miniportdrivrutiner har initierats.
I själva verket kan DriverEntry-funktionen för en mellanliggande NDIS-drivrutin ignorera pekaren RegistryPath när den har överförts till NdisMRegisterMiniportDriver. En sådan drivrutin kan också ignorera pekaren DriverObject när den har överförts till NdisMRegisterMiniportDriver. Men drivrutinen bör spara miniportdrivrutinens handtagsvärde som returneras av NdisMRegisterMiniportDriver vid NdisMiniportDriverHandle och protokolldrivarens handtagsvärde som returneras av NdisRegisterProtocolDriver vid NdisProtocolHandle för efterföljande anrop till NdisXxx-funktioner. Den mellanliggande drivrutinens ProtocolBindAdapterEx-funktionen binder drivrutinen till varje underliggande miniportdrivrutin innan dess MiniportInitializeEx-funktion anropas för att initiera den mellanliggande drivrutinens virtuella miniport. Protokolldrivrutiner på högre nivå binder sig därefter till den virtuella miniport som skapas. Den här strategin gör det möjligt för en mellanliggande NDIS-drivrutin att allokera resurser när den virtuella miniporten skapas enligt funktionerna i den underliggande miniportdrivrutinen som den är bunden till.