Freigeben über


Definieren eines Rückrufobjekts

Ein Treiber kann ein Rückrufobjekt erstellen, über das andere Treiber eine Benachrichtigung über die vom erstellenden Treiber definierten Bedingungen anfordern können. Die folgende Abbildung zeigt die Schritte, die beim Definieren eines Rückrufobjekts erforderlich sind.

Diagramm, das das Definieren eines Rückrufobjekts veranschaulicht.

Vor dem Erstellen des Objekts ruft der Treiber InitializeObjectAttributes auf, um seine Attribute festzulegen. Ein Rückrufobjekt muss einen Namen aufweisen, der nicht mit dem Namen eines systemdefinierten Rückrufs übereinstimmen kann. es kann alle anderen Attribute aufweisen, die sein Ersteller für angemessen hält, in der Regel OBJ_CASE_INSENSITIVE. Als Nächstes ruft der Treiber ExCreateCallback auf und übergibt einen Zeiger auf die initialisierten Attribute und einen Speicherort, an dem ein Handle für das Rückrufobjekt empfangen werden soll. Außerdem werden zwei Booleaner übergeben, die angeben, ob das System das Rückrufobjekt erstellen soll, wenn ein solches benanntes Objekt noch nicht vorhanden ist, und ob das Objekt mehr als eine registrierte Rückrufroutine zulassen soll.

Der Treiber definiert die Bedingungen, unter denen er die registrierten Rückrufroutinen aufruft. Die Bedingungen haben die Form von zwei Argumenten, die jeweils auf einen Parameter verweisen, der vom Treiber definiert wird, der den Rückruf erstellt. Sie sollten diese Bedingungen zusammen mit dem Namen des Rückrufobjekts und dem IRQL, unter dem es eine Benachrichtigung anfordert, für Clients des Treibers dokumentieren.

Wenn die Rückrufbedingung auftritt, ruft der Treiber ExNotifyCallback auf und übergibt sein Handle an das Rückrufobjekt und die beiden Argumente. Das System ruft dann alle für das Rückrufobjekt registrierten Rückrufroutinen in der Reihenfolge auf, in der sie registriert wurden, und übergibt die beiden Argumente und einen Zeiger auf den Kontext, der beim Registrieren der Routine angegeben wurde. Der Treiber muss ExNotifyCallback bei IRQL <= DISPATCH_LEVEL aufrufen. Das System ruft die Rückrufroutinen mit derselben IRQL auf, an der der Treiber diesen Aufruf getätigt hat.

Nachdem alle Vorgänge mit dem Rückrufobjekt abgeschlossen wurden, sollte der Treiber, der den Rückruf erstellt hat, ObDereferenceObject aufrufen, um die Verweisanzahl zu verringern und sicherzustellen, dass das Objekt gelöscht wird.