Freigeben über


Filtern von OID-Anforderungen in einem NDIS-Filtertreiber

Filtertreiber können OID-Anforderungen verarbeiten, die von überlasteten Treibern stammen. NDIS ruft die FilterOidRequest-Funktion auf, um jede OID-Anforderung zu verarbeiten. Filtertreiber können OID-Anforderungen an zugrunde liegende Treiber weiterleiten, indem sie die NdisFOidRequest-Funktion aufrufen.

NDIS kann die FilterCancelOidRequest-Funktion eines Filtertreibers aufrufen, um eine OID-Anforderung abzubrechen. Wenn NDIS FilterCancelOidRequest aufruft, sollte der Filtertreiber versuchen, die NdisFOidRequest-Funktion so schnell wie möglich aufzurufen.

Die folgende Abbildung veranschaulicht eine gefilterte OID-Anforderung.

Diagramm, das den Prozess einer gefilterten OID-Anforderung veranschaulicht.

Der Filtertreiber kann die OID-Anforderung synchron oder asynchron abschließen, indem er NDIS_STATUS_SUCCESS bzw. NDIS_STATUS_PENDING aus FilterOidRequest zurückgibt. FilterOidRequest kann auch synchron mit einem Fehler status abgeschlossen werden.

Ein Filtertreiber, der eine OID-Setanforderung erfolgreich verarbeitet, muss den SupportedRevision-Member in der NDIS_OID_REQUEST-Struktur festlegen, wenn die OID-Setanforderung zurückgegeben wird. Das SupportedRevision-Mitglied benachrichtigt den Initiator der OID-Anforderung darüber, welche Revision der Treiber unterstützt hat. Weitere Informationen zu Versionsinformationen in NDIS-Strukturen finden Sie unter Angeben von NDIS-Versionsinformationen.

Wenn FilterOidRequest NDIS_STATUS_PENDING zurückgibt, muss die NdisFOidRequestComplete-Funktion aufgerufen werden, nachdem die OID-Anforderung abgeschlossen wurde. In diesem Fall übergibt der Treiber die Ergebnisse der Anforderung am OidRequest-Parameter von NdisFOidRequestComplete. Der Treiber übergibt die letzte status der Anforderung am Statusparameter von NdisFOidRequestComplete.

Wenn FilterOidRequest NDIS_STATUS_SUCCESS zurückgibt, werden die Ergebnisse einer Abfrageanforderung in der NDIS_OID_REQUEST-Struktur am OidRequest-Parameter zurückgegeben. In diesem Fall ruft der Treiber die Funktion NdisFOidRequestComplete nicht auf.

Um eine OID-Anforderung an zugrunde liegende Treiber weiterzuleiten, ruft ein Filtertreiber die NdisFOidRequest-Funktion auf. Wenn eine Anforderung nicht an die zugrunde liegenden Treiber weitergeleitet werden soll, kann ein Filtertreiber die Anforderung sofort abschließen. Um die Anforderung ohne Weiterleitung abzuschließen, kann der Treiber NDIS_STATUS_SUCCESS (oder einen Fehler status) von FilterOidRequest zurückgeben, oder er kann NdisFOidRequestComplete aufrufen, nachdem er NDIS_STATUS_PENDING zurückgegeben hat.

Hinweis Bevor der Treiber NdisFOidRequest aufruft, muss der Treiber eine NDIS_OID_REQUEST Struktur zuweisen und die Anforderungsinformationen durch Aufrufen von NdisAllocateCloneOidRequest an die neue Struktur übertragen.

Die weitergeleitete Anforderung verläuft wie eine Anforderung, die von einem Filtertreiber initiiert wurde. Weitere Informationen finden Sie unter Generieren von OID-Anforderungen aus einem NDIS-Filtertreiber.

Nachdem die zugrunde liegenden Treiber eine weitergeleitete Anforderung abgeschlossen haben, kann der Filtertreiber die Antwort bei Bedarf ändern und sie an übergeordnete Treiber übergeben.

Ein Filtertreiber kann OID-Anforderungen von überlastenden Treibern empfangen, wenn er sich im Status Neustarting, Running, Pausing oder Angehalten befindet .

Hinweis Wie Miniporttreiber können Filtertreiber jeweils nur eine OID-Anforderung empfangen. Da NDIS Anforderungen serialisiert, die an ein Filtermodul gesendet werden, kann ein Filtertreiber nicht unter FilterOidRequest aufgerufen werden, bevor er die vorherige Anforderung abgeschlossen hat.

Es folgt ein Beispiel für einen Filtertreiber, der eine OID-Anforderung ändert:

  • Ein Filtertreiber fügt einen Header hinzu. Nachdem der Treiber in diesem Fall eine Antwort auf eine Abfrage für OID_GEN_MAXIMUM_FRAME_SIZE von den zugrunde liegenden Treibern erhalten hat, subtrahiert der Filter die Größe des Headers von der Antwort. Der Treiber subtrahiert seine Headergröße, da der Treiber einen Header vor jedem gesendeten Paket einfügt und den Header in jedem empfangenen Paket entfernt.