Partager via


Gestion de la durée de vie des objets

Avertissement

UMDF 2 est la dernière version d’UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide d’UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et la prise en charge d’UMDF 1 est limitée sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2.

Les exemples UMDF 1 archivés se trouvent dans la Windows 11, version 22H2 - Mise à jour des exemples de pilotes de mai 2022.

Pour plus d’informations, consultez Prise en main avec UMDF.

UMDF utilise un schéma de comptage de références pour gérer la durée de vie des objets de rappel et des objets d’infrastructure.

Gestion des références à des objets de rappel Driver-Supplied

Dans la plupart des cas, un pilote n’est pas nécessaire pour conserver une référence à un objet de rappel. Si les méthodes de l’interface d’objet de rappel sont appelées uniquement par l’infrastructure et par des objets dont la durée de vie dépend de l’objet de rappel et de l’objet framework jumelé de l’objet de rappel, le pilote n’a pas besoin de conserver une référence. En d’autres termes, le pilote ou l’infrastructure peut appeler en toute sécurité des méthodes d’interfaces d’objet situées plus haut dans la hiérarchie des objets.

Gestion des références à des objets Framework

Dans UMDF, les principes généraux de durée de vie COM et le modèle de durée de vie spécifique à WDF déterminent la durée de vie des objets framework. Votre pilote doit satisfaire aux critères des deux modèles afin que les objets d’infrastructure soient libérés de la mémoire au moment approprié.

Gestion de la durée de vie COM

Dans COM, un appelant conserve généralement une référence à l’objet pendant l’utilisation de l’objet, puis l’appelant libère la référence lorsqu’il n’a plus besoin de l’objet. Toutefois, un pilote UMDF n’a pas besoin de conserver une référence à un objet framework. En fait, le pilote peut libérer une référence d’objet framework immédiatement après que le pilote a créé l’objet framework.

Par exemple, les exemples UMDF libèrent l’objet d’appareil après avoir appelé IWDFDriver::CreateDevice. Bien que la référence soit publiée tôt, l’objet device continue d’exister jusqu’à ce que l’appareil soit supprimé, car l’arborescence de l’objet WDF conserve une référence à celui-ci.

Étant donné que UMDF effectue le suivi de tous les objets framework dans une arborescence d’objets, le pilote n’a pas besoin de conserver une référence aux objets framework.

Toutefois, si votre pilote conserve une référence à un objet framework, il doit libérer la référence lorsqu’il n’a plus besoin de l’objet. Une référence circulaire reste en place jusqu’à ce que le pilote libère sa référence. Pour éviter les références circulaires, le pilote ne doit généralement pas conserver une référence explicite à un objet framework.

Si le pilote doit conserver une référence à un objet framework, l’objet de rappel du pilote doit également implémenter l’interface IObjectCleanup . Lorsque le pilote appelle IWDFObject::D eleteWdfObject sur l’objet framework, l’objet framework appelle la méthode IObjectCleanup::OnCleanup de son objet de rappel correspondant. L’implémentation de IObjectCleanup::OnCleanup doit libérer la référence à l’objet framework pour permettre à l’infrastructure de terminer la destruction de l’objet framework.

Gestion de la durée de vie WDF

Si vous créez un objet d’un type qui vous permet de remplacer le parent par défaut, vous devez sélectionner un parent avec une durée de vie qui correspond à la durée de vie de votre objet. Pour plus d’informations sur les objets parent par défaut et si le pilote peut remplacer le parent par défaut, consultez le tableau dans Objets Framework.

Si vous correspondez à des durées de vie d’objet, l’infrastructure supprime votre objet lorsque l’objet parent est supprimé. Si vous ne correspondez pas aux durées de vie des objets et que vous souhaitez que l’objet soit supprimé avant la suppression du parent par défaut, vous pouvez supprimer explicitement l’objet en appelant DeleteWdfObject lorsque l’objet n’est plus nécessaire.

Par exemple, si vous créez un objet de requête, puis appelez IWDFDriver::CreateWdfMemory pour créer un objet de mémoire pour cette requête, vous pouvez spécifier l’objet de requête comme parent du nouvel objet mémoire. Étant donné que WDF supprime des objets enfants lorsque l’objet parent est supprimé, le pilote n’a pas besoin d’appeler DeleteWdfObject pour supprimer l’objet mémoire.

Toutefois, s’il n’existe aucun parent dont la durée de vie correspond étroitement à celle de votre objet, et si vous souhaitez que l’objet soit supprimé avant la suppression du parent par défaut, vous devez utiliser la suppression explicite. Par exemple, un pilote peut créer plusieurs objets de requête qui sont utilisés pendant une courte durée. Dans ce cas, le pilote peut conserver la mémoire en supprimant explicitement les demandes lorsqu’elles ne sont plus nécessaires.

De même, si vous créez un objet qui ne vous permet pas de remplacer le parent par défaut et si vous souhaitez que l’objet soit supprimé avant la suppression du parent par défaut, le pilote doit supprimer explicitement l’objet.