Cycle de vie d’un objet Framework

Le « cycle de vie » d’un objet Framework couvre l’heure à partir de laquelle un objet est créé lors de sa suppression. Le décompte 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 d’infrastructure 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 Driver Framework.

D’autres objets Framework sont créés par le Framework. 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 d’infrastructure et le transmet à la fonction de rappel EvtDeviceFileCreate du pilote.

Certains objets de l’infrastructure peuvent être créés par l’infrastructure ou par un pilote. Par exemple, lorsque le gestionnaire d’e/s remet une requête d’e/s à un pilote, le Framework crée un objet de demande d’infrastructure et le remet au pilote, en général en appelant l’un des gestionnaires de demande du pilote. Un pilote peut également créer des objets de demande de Framework et les remettre à d’autres pilotes.

Utilisation des nombres de références

L’infrastructure gère un décompte de références pour chaque objet. Lorsqu’un objet est créé, l’infrastructure définit son décompte de références à un. Si le nombre de références est égal à zéro, le Framework supprime l’objet.

Les pilotes peuvent modifier le nombre de références d’un objet en appelant WdfObjectReference pour incrémenter le décompte 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 transmettre 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 n’ait fini de l’utiliser. Pour obtenir un exemple de situation dans laquelle 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 le Framework 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 le Framework a tenté de supprimer un objet, le handle de l’objet reste valide jusqu’à ce que le nombre de références soit égal à zéro. Un pilote ne peut pas supprimer un objet en appelant simplement WdfObjectDereference pour décrémenter le décompte 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, le Framework tente de supprimer l’objet enfant avant de supprimer le parent. La suppression d’objets démarre à partir de l’objet le plus éloigné du parent et travaille en haut de la hiérarchie d’objets vers la racine.

Les pilotes peuvent enregistrer les deux fonctions de rappel suivantes que le Framework appelle lorsque le pilote ou le Framework supprime un objet :

L’une de ces fonctions de rappel doit libérer toutes les ressources spécifiques à l’objet que le pilote a allouées lors de la création de l’objet.

L’infrastructure gère toujours la suppression de certains objets Framework, et les pilotes ne doivent pas tenter de supprimer ces objets. Pour obtenir la liste des objets Framework que les pilotes ne peuvent pas supprimer, consultez WdfObjectDelete.