Gestione della durata degli oggetti
Avviso
UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Nessuna nuova funzionalità viene aggiunta a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.
Gli esempi di UMDF 1 archiviati sono disponibili nell'Windows 11, versione 22H2 - Aggiornamento degli esempi di driver di maggio 2022.
Per altre informazioni, vedere Introduzione con UMDF.
UMDF usa uno schema di conteggio dei riferimenti per gestire la durata degli oggetti di callback e degli oggetti framework.
Gestione dei riferimenti agli oggetti callback Driver-Supplied
Nella maggior parte dei casi, un driver non è necessario per mantenere un riferimento a un oggetto callback. Se i metodi dell'interfaccia dell'oggetto callback vengono chiamati solo dal framework e dagli oggetti la cui durata dipende dall'oggetto callback e dall'oggetto framework associato dell'oggetto callback, il driver non deve mantenere un riferimento. In altre parole, il driver o il framework possono chiamare in modo sicuro metodi di interfacce a oggetti più elevate nella gerarchia degli oggetti.
Gestione dei riferimenti agli oggetti Framework
In UMDF, i principi generali di durata COM e il modello di durata specifica di WDF determinano la durata degli oggetti framework. Il driver deve soddisfare i criteri per entrambi i modelli in modo che gli oggetti framework vengano liberati dalla memoria in momenti appropriati.
Gestione della durata COM
In COM un chiamante mantiene in genere un riferimento all'oggetto mentre l'oggetto è in uso e quindi il chiamante rilascia il riferimento quando non richiede più l'oggetto. Tuttavia, un driver UMDF non deve mantenere un riferimento a un oggetto framework. In effetti, il driver può rilasciare un riferimento a un oggetto framework immediatamente dopo che il driver crea l'oggetto framework.
Ad esempio, gli esempi di UMDF rilasciano l'oggetto dispositivo dopo che chiamano IWDFDriver::CreateDevice. Anche se il riferimento viene rilasciato in anticipo, l'oggetto dispositivo continua a esistere finché il dispositivo non viene rimosso perché l'albero degli oggetti WDF mantiene un riferimento a esso.
Poiché UMDF tiene traccia di tutti gli oggetti framework in un albero di oggetti, il driver non deve mantenere un riferimento agli oggetti framework.
Tuttavia, se il driver mantiene un riferimento a un oggetto framework, il driver deve rilasciare il riferimento quando non ha più bisogno dell'oggetto. Un riferimento circolare rimane sul posto fino a quando il driver rilascia il relativo riferimento. Per evitare riferimenti circolari, il driver in genere non deve mantenere un riferimento esplicito a un oggetto framework.
Se il driver deve mantenere un riferimento a un oggetto framework, l'oggetto callback del driver deve implementare anche l'interfaccia IObjectCleanup . Quando il driver chiama IWDFObject::D eleteWdfObject nell'oggetto framework, l'oggetto framework chiama il relativo metodo IObjectCleanup::OnCleanup dell'oggetto callback corrispondente. L'implementazione di IObjectCleanup::OnCleanup deve rilasciare il riferimento all'oggetto framework per consentire al framework di completare l'disinstallazione dell'oggetto framework.
Gestione durata WDF
Se si crea un oggetto di un tipo che consente di eseguire l'override dell'elemento padre predefinito, è necessario selezionare un elemento padre con una durata corrispondente alla durata dell'oggetto. Per altre informazioni sugli oggetti padre predefiniti e se il driver può eseguire l'override dell'elemento padre predefinito, vedere la tabella in Oggetti Framework.
Se si corrispondono alla durata dell'oggetto, il framework elimina l'oggetto quando l'oggetto padre viene eliminato. Se non corrisponde alla durata dell'oggetto e si vuole che l'oggetto venga eliminato prima dell'eliminazione dell'elemento padre predefinito, è possibile eliminare in modo esplicito l'oggetto chiamando DeleteWdfObject quando l'oggetto non è più necessario.
Ad esempio, se si crea un nuovo oggetto request e quindi si chiama IWDFDriver::CreateWdfMemory per creare un oggetto memoria per questa richiesta, è possibile specificare l'oggetto request come padre del nuovo oggetto memoria. Poiché WDF elimina gli oggetti figlio quando l'oggetto padre viene eliminato, il driver non deve chiamare DeleteWdfObject per eliminare l'oggetto memoria.
Tuttavia, se non esiste alcun elemento padre la cui durata corrisponde strettamente alla durata dell'oggetto e se si vuole che l'oggetto venga eliminato prima dell'eliminazione del padre predefinito, è necessario usare l'eliminazione esplicita. Ad esempio, un driver può creare diversi oggetti di richiesta usati per una breve durata. In questo caso, il driver può risparmiare memoria eliminando in modo esplicito le richieste quando non sono più necessarie.
Analogamente, se si sta creando un oggetto che non consente di eseguire l'override dell'elemento padre predefinito e se si vuole che l'oggetto venga eliminato prima dell'eliminazione dell'elemento padre predefinito, il driver deve eliminare in modo esplicito l'oggetto.