Freigeben über


Verwenden eines Driver-Defined Rückrufobjekts

Um ein von einem anderen Treiber definiertes Rückrufobjekt zu verwenden, öffnet ein Treiber das -Objekt und registriert dann eine Routine, die aufgerufen werden soll, wenn der Rückruf ausgelöst wird, wie in der folgenden Abbildung dargestellt. Der Treiber, der eine Benachrichtigung anfordert, muss den Namen des Rückrufobjekts kennen und die Semantik der an die Rückrufroutine übergebenen Argumente verstehen.

Diagramm zur Veranschaulichung der Registrierung für Rückrufbenachrichtigungen.

Bevor das Objekt geöffnet werden kann, muss der Treiber InitializeObjectAttributes aufrufen, um einen Attributblock zu erstellen und dabei den Namen des Objekts anzugeben. Nachdem ein Zeiger auf einen Attributblock vorhanden ist, ruft er ExCreateCallback auf und übergibt den Attributzeiger, einen Speicherort, an dem ein Handle für den Rückruf empfangen werden soll, und FALSE für den Create-Parameter , was angibt, dass ein vorhandenes Rückrufobjekt erforderlich ist.

Der Treiber kann dann ExRegisterCallback mit dem zurückgegebenen Handle aufrufen, um seine Rückrufroutine zu registrieren.

Die Rückrufroutine verfügt über den folgenden Prototyp:

typedef VOID (*PCALLBACK_FUNCTION ) (
    IN PVOID CallbackContext,
    IN PVOID Argument1,
    IN PVOID Argument2
    );

Der Parameter CallbackContext ist der Kontextzeiger, der bei jedem Aufruf an die Rückrufroutine übergeben werden soll. In der Regel ist dieser Parameter ein Zeiger auf einen Block von Kontextdaten, die der Aufrufer aus einem nicht auslagerten Pool zuordnen sollte, wenn die Routine bei DISPATCH_LEVEL aufgerufen werden kann. Die beiden Argumente werden von der Komponente definiert, die den Rückruf erstellt hat. In der Regel stellen die Argumente Informationen zu den Bedingungen bereit, die den Rückruf ausgelöst haben.

Wenn der Ersteller des Rückrufs eine Benachrichtigung auslöst, ruft das System die registrierte Routine auf und übergibt einen Zeiger auf den Kontext und die beiden Argumente. Werte für die Argumente werden von der Komponente bereitgestellt, die den Rückruf erstellt hat. Die Rückrufroutine wird in derselben IRQL aufgerufen, an der der erstellenden Treiber eine Benachrichtigung ausgelöst hat, die immer IRQL <= DISPATCH_LEVEL ist.

In seiner Rückrufroutine kann ein Treiber alle Aufgaben ausführen, die er für die aktuellen Bedingungen benötigt.

Wenn der Treiber keine Benachrichtigung mehr benötigt, sollte er ExUnregisterCallback aufrufen, um seine Routine aus der Liste der registrierten Rückrufe zu entfernen und seinen Verweis auf das Rückrufobjekt zu entfernen.