Initialisieren eines Zwischentreibers
Ein NDIS-Zwischentreiber registriert seine MiniportXxx-Funktionen und seine ProtocolXxx-Funktionen im Kontext seiner DriverEntry-Routine . Um seine MiniportXxx-Funktionen zu registrieren, muss ein Zwischentreiber die NdisMRegisterMiniportDriver-Funktion mit festgelegtem NDIS_INTERMEDIATE_DRIVER-Flag aufrufen. Dieses Flag befindet sich in der NDIS_MINIPORT_DRIVER_CHARACTERISTICS-Struktur , die der Treiber an MiniportDriverCharacteristics übergibt. Um seine ProtocolXxx-Funktionen zu registrieren, muss ein Zwischentreiber die Funktion NdisRegisterProtocolDriver aufrufen.
DriverEntry gibt STATUS_SUCCESS oder die entsprechende NDIS_STATUS_SUCCESS zurück, wenn der Treiber erfolgreich als NDIS-Zwischentreiber registriert wurde. Wenn die Initialisierung von DriverEntry fehlschlägt, indem ein Fehler status weitergegeben wird, der von einer NdisXxx-Funktion oder einer Kernelmodusunterstützungsroutine zurückgegeben wurde, bleibt der Treiber nicht geladen. DriverEntry muss synchron ausgeführt werden. Das heißt, es kann keine STATUS_PENDING oder seine äquivalenten NDIS_STATUS_PENDING zurückgeben.
Um den Zwischentreiber bei NDIS zu registrieren, muss die DriverEntry-Routine mindestens folgendes ausführen:
- Rufen Sie die NdisMRegisterMiniportDriver-Funktion auf, wobei das flag NDIS_INTERMEDIATE_DRIVER festgelegt ist, um die MiniportXxx-Funktionen des Treibers zu registrieren.
- Rufen Sie die NdisRegisterProtocolDriver-Funktion auf, um die ProtocolXxx-Funktionen des Treibers zu registrieren, wenn sich der Treiber anschließend an einen zugrunde liegenden NDIS-Treiber bindet.
- Rufen Sie die NdisIMAssociateMiniport-Funktion auf, um NDIS über die Zuordnung zwischen dem oberen Miniportrand des Treibers und dem unteren Protokollrand zu informieren.
Wenn in DriverEntry nach der erfolgreichen Rückgabe von NdisMRegisterMiniportDriver ein Fehler auftritt, muss der Treiber die NdisMDeregisterMiniportDriver-Funktion aufrufen, bevor DriverEntry zurückgibt. Wenn DriverEntry erfolgreich ist, muss der Treiber NdisMDeregisterMiniportDriver über seine MiniportDriverUnload-Funktion aufrufen.
Fortgeschrittene Treiber teilen die meisten DriverEntry-Anforderungen von Protokolltreibern und Miniporttreibern.
Die Initialisierung des virtuellen Miniports eines Zwischentreibers erfolgt, wenn der Treiber die NdisIMInitializeDeviceInstanceEx-Funktion von seiner ProtocolBindAdapterEx-Funktion aufruft.
NDIS ruft die ProtocolBindAdapterEx-Funktion auf, nachdem alle zugrunde liegenden Miniporttreiber initialisiert wurden.
Tatsächlich kann die DriverEntry-Funktion eines NDIS-Zwischentreibers den RegistryPath-Zeiger ignorieren, nachdem er an NdisMRegisterMiniportDriver übergeben wurde. Ein solcher Treiber kann auch den DriverObject-Zeiger ignorieren, nachdem er ihn an NdisMRegisterMiniportDriver übergeben hat. Der Treiber sollte jedoch den Wert des Miniporttreiberhandles speichern, der von NdisMRegisterMiniportDriver BeiNdisMiniportDriverHandle zurückgegeben wird, und den Wert des Protokollhandles, der von NdisRegisterProtocolDriver bei NdisProtocolHandle für nachfolgende Aufrufe von NdisXxx-Funktionen zurückgegeben wird. Die ProtocolBindAdapterEx-Funktion des Zwischentreibers bindet den Treiber an jeden zugrunde liegenden Miniporttreiber, bevor seine MiniportInitializeEx-Funktion aufgerufen wird, um den virtuellen Miniport des Zwischentreibers zu initialisieren. Protokolltreiber auf höherer Ebene binden sich anschließend an den virtuellen Miniport, den er erstellt. Diese Strategie ermöglicht es einem NDIS-Zwischentreiber, Ressourcen bei der Erstellung des virtuellen Miniports gemäß den Features des zugrunde liegenden Miniporttreibers zuzuordnen, an den er gebunden ist.