Cycle de vie des objets framework
Le « cycle de vie » d’un objet framework s’étend entre le moment où un objet est créé et le moment où il est supprimé. Le nombre de références d’un objet contrôle le moment où il sera supprimé.
Création d’un objet Framework
La plupart des objets framework sont créés par l’appel d’un pilote à la méthode de création de l’objet. Par exemple, chaque pilote d’infrastructure doit appeler WdfDriverCreate pour créer un objet de pilote d’infrastructure.
D’autres objets framework sont créés par l’infrastructure. Par exemple, lorsqu’une application utilisateur ouvre un appareil pour des opérations de lecture ou d’écriture, l’infrastructure crée un objet de fichier framework et le transmet à la fonction de rappel EvtDeviceFileCreate du pilote.
Quelques objets d’infrastructure peuvent être créés par l’infrastructure ou par un pilote. Par exemple, lorsque le gestionnaire d’E/S remet une demande d’E/S à un pilote, l’infrastructure crée un objet de demande d’infrastructure et le remet au pilote, généralement en appelant l’un des gestionnaires de requêtes du pilote. Un pilote peut également créer des objets de requête d’infrastructure et les remettre à d’autres pilotes.
Utilisation du nombre de références
L’infrastructure gère un nombre de références pour chaque objet. Lorsqu’un objet est créé, l’infrastructure définit son nombre de références sur un. Si le nombre de références devient égal à zéro, l’infrastructure supprime l’objet.
Les pilotes peuvent modifier le nombre de références d’un objet en appelant WdfObjectReference pour incrémenter le nombre de références ou WdfObjectDereference pour décrémenter le nombre de références. (Un pilote peut appeler WdfObjectDereference uniquement s’il a précédemment appelé WdfObjectReference.)
Dans la plupart des cas, les pilotes n’ont pas besoin d’incrémenter ou de décrémenter le nombre de références d’un objet. L’infrastructure incrémente le nombre avant de passer le handle de l’objet au pilote et décrémente le nombre lorsque le pilote n’a plus besoin de l’objet.
Les pilotes appellent WdfObjectReference pour s’assurer qu’un objet ne sera pas supprimé (par l’infrastructure ou par un thread de pilote) avant que le pilote ne l’utilise. Pour obtenir un exemple de situation dans lequel un pilote doit appeler WdfObjectReference et WdfObjectDereference, consultez Synchronisation de l’annulation des demandes envoyées.
Suppression d’un objet Framework
Les objets sont supprimés soit parce qu’un pilote appelle WdfObjectDelete , soit parce que l’infrastructure appelle une routine de suppression interne, mais un objet est supprimé uniquement si son nombre de références est égal à zéro. Une fois que le pilote ou l’infrastructure a tenté de supprimer un objet, le handle de l’objet reste valide jusqu’à ce que le nombre de références ait atteint zéro. Un pilote ne peut pas supprimer un objet en appelant simplement WdfObjectDereference pour décrémenter le nombre de références de l’objet à zéro. Le pilote doit également appeler WdfObjectDelete.
Si un objet framework est l’objet enfant d’un parent et que le parent est en cours de suppression, l’infrastructure tente de supprimer l’objet enfant avant de supprimer le parent. La suppression d’objet commence à partir de l’objet le plus éloigné du parent et s’effectue jusqu’à la hiérarchie d’objets vers la racine.
Les pilotes peuvent inscrire les deux fonctions de rappel suivantes que l’infrastructure appelle lorsque le pilote ou l’infrastructure supprime un objet :
Fonction de rappel EvtCleanupCallback , que l’infrastructure appelle afin que le pilote puisse appeler WdfObjectDereference s’il avait précédemment appelé WdfObjectReference pour l’objet en cours de suppression.
Fonction de rappel EvtDestroyCallback , que l’infrastructure appelle une fois que le nombre de références de l’objet a été décrémenté à zéro.
L’une de ces fonctions de rappel doit libérer toutes les ressources spécifiques à l’objet allouées par le pilote lors de la création de l’objet.
L’infrastructure gère toujours la suppression de certains objets d’infrastructure, et les pilotes ne doivent pas tenter de supprimer ces objets. Pour obtenir la liste des objets d’infrastructure que les pilotes ne peuvent pas supprimer, consultez WdfObjectDelete.