Partager via


Définition d’un objet De rappel

Un pilote peut créer un objet de rappel, par le biais duquel d’autres pilotes peuvent demander la notification des conditions définies par le pilote de création. L’illustration suivante montre les étapes impliquées dans la définition d’un objet de rappel.

diagramme illustrant la définition d’un objet de rappel.

Avant de créer l’objet, le pilote appelle InitializeObjectAttributes pour définir ses attributs. Un objet de rappel doit avoir un nom qui ne peut pas correspondre au nom d’un rappel défini par le système ; il peut avoir tous les autres attributs que son créateur juge appropriés, généralement OBJ_CASE_INSENSITIVE. Ensuite, le pilote appelle ExCreateCallback, en passant un pointeur vers les attributs initialisés et un emplacement où recevoir un handle vers l’objet de rappel. Il transmet également deux valeurs booléennes, indiquant si le système doit créer l’objet de rappel si un tel objet nommé n’existe pas déjà, et si l’objet doit autoriser plusieurs routines de rappel inscrites.

Le pilote définit les conditions pour lesquelles il appelle les routines de rappel inscrites. Les conditions prennent la forme de deux arguments, chacun pointant vers un paramètre défini par le pilote qui crée le rappel. Vous devez documenter ces conditions, ainsi que le nom de l’objet de rappel et l’IRQL auquel il demande la notification, pour les clients du pilote.

Lorsque la condition de rappel se produit, le pilote appelle ExNotifyCallback, en passant son handle à l’objet de rappel et aux deux arguments. Le système appelle ensuite toutes les routines de rappel inscrites pour l’objet de rappel, dans l’ordre dans lequel elles ont été inscrites, en passant les deux arguments et un pointeur vers le contexte fourni lors de l’inscription de la routine. Le pilote doit appeler ExNotifyCallback à IRQL <= DISPATCH_LEVEL ; le système appelle les routines de rappel au même IRQL auquel le pilote a effectué cet appel.

Une fois toutes les opérations terminées avec l’objet de rappel, le pilote qui a créé le rappel doit appeler ObDereferenceObject pour décrémenter son nombre de références et s’assurer que l’objet est supprimé.