Utilisation d’un objet de rappel Driver-Defined
Pour utiliser un objet de rappel défini par un autre pilote, un pilote ouvre l’objet, puis inscrit une routine à appeler lorsque le rappel est déclenché, comme illustré dans la figure suivante. Le pilote demandant une notification doit connaître le nom de l’objet de rappel et doit comprendre la sémantique des arguments passés à la routine de rappel.
Avant d’ouvrir l’objet, le pilote doit appeler InitializeObjectAttributes pour créer un bloc d’attribut, en spécifiant le nom de l’objet. Une fois qu’il a un pointeur vers un bloc d’attributs, il appelle ExCreateCallback, en passant le pointeur d’attribut, un emplacement dans lequel recevoir un handle vers le rappel, et FALSE pour le paramètre Create , indiquant qu’il nécessite un objet de rappel existant.
Le pilote peut ensuite appeler ExRegisterCallback avec le handle retourné pour inscrire sa routine de rappel.
La routine de rappel a le prototype suivant :
typedef VOID (*PCALLBACK_FUNCTION ) (
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
);
Le paramètre CallbackContext est le pointeur de contexte à passer à la routine de rappel chaque fois qu’elle est appelée. En règle générale, ce paramètre est un pointeur vers un bloc de données de contexte, que l’appelant doit allouer à partir d’un pool non paginé si la routine peut être appelée à DISPATCH_LEVEL. Les deux arguments sont définis par le composant qui a créé le rappel. En règle générale, les arguments fournissent des informations sur les conditions qui ont déclenché le rappel.
Lorsque le créateur du rappel déclenche une notification, le système appelle la routine inscrite, en passant un pointeur vers le contexte et les deux arguments. Les valeurs des arguments sont fournies par le composant qui a créé le rappel. La routine de rappel est appelée au niveau de la même IRQL à laquelle le pilote de création a déclenché la notification, qui est toujours IRQL <= DISPATCH_LEVEL.
Dans sa routine de rappel, un pilote peut effectuer toutes les tâches dont il a besoin pour les conditions actuelles.
Lorsque le pilote n’a plus besoin de notification, il doit appeler ExUnregisterCallback pour supprimer sa routine de la liste des rappels inscrits et supprimer sa référence à l’objet de rappel.