Ciclo di vita degli oggetti framework
Il "ciclo di vita" di un oggetto framework si estende dal momento in cui viene creato un oggetto a quando viene eliminato. Il conteggio dei riferimenti di un oggetto controlla quando verrà eliminato.
Creazione di un oggetto Framework
La maggior parte degli oggetti framework viene creata dalla chiamata di un driver al metodo di creazione dell'oggetto. Ad esempio, ogni driver del framework deve chiamare WdfDriverCreare per creare un oggetto driver framework.
Altri oggetti framework vengono creati dal framework. Ad esempio, quando un'applicazione utente apre un dispositivo per operazioni di lettura o scrittura, il framework crea un oggetto file del framework e lo passa alla funzione di callback EvtDeviceFileCreate.
Alcuni oggetti framework possono essere creati dal framework o da un driver. Ad esempio, quando il gestore di I/O recapita una richiesta di I/O a un driver, il framework crea un oggetto richiesta framework e lo recapita al driver, in genere chiamando uno dei gestori delle richieste del driver. Un driver può anche creare oggetti richiesta framework e recapitarli ad altri driver.
Utilizzo dei conteggi di riferimento
Il framework gestisce un conteggio dei riferimenti per ogni oggetto. Quando viene creato un oggetto, il framework imposta il conteggio dei riferimenti su uno. Se il conteggio dei riferimenti diventa zero, il framework elimina l'oggetto.
I driver possono modificare il conteggio dei riferimenti di un oggetto chiamando WdfObjectReference per incrementare il numero di riferimenti o WdfObjectDereference per decrementare il conteggio dei riferimenti. Un driver può chiamare WdfObjectDereference solo se in precedenza ha chiamato WdfObjectReference.
Nella maggior parte dei casi, i driver non devono incrementare o decrementare il conteggio dei riferimenti di un oggetto. Il framework incrementa il conteggio prima di passare l'handle dell'oggetto al driver e decrementa il conteggio quando il driver non necessita più dell'oggetto.
I driver chiamano WdfObjectReference per assicurarsi che un oggetto non venga eliminato (dal framework o da un thread del driver) prima che il driver abbia terminato di usarlo. Per una situazione di esempio in cui un driver deve chiamare WdfObjectReference e WdfObjectDereference, vedere Sincronizzazione dell'Annullamento delle Richieste Inviate.
Eliminazione di un oggetto Framework
Gli oggetti vengono eliminati perché un driver chiama WdfObjectDelete o perché il framework chiama una routine di eliminazione interna, ma un oggetto viene eliminato solo se il conteggio dei riferimenti è zero. Dopo che il driver o il framework ha tentato di eliminare un oggetto, l'handle dell'oggetto rimane valido fino a quando il conteggio dei riferimenti diventa zero. Un driver non può eliminare un oggetto semplicemente chiamando WdfObjectDereference per decrementare il conteggio dei riferimenti dell'oggetto a zero. Il driver deve anche chiamare WdfObjectDelete.
Se un oggetto framework è l'oggetto figlio di un elemento padre e l'elemento padre viene eliminato, il framework tenta di eliminare l'oggetto figlio prima di eliminare l'elemento padre. L'eliminazione di oggetti inizia dall'oggetto più lontano dal genitore e risale la gerarchia degli oggetti verso la radice.
I driver possono registrare le due funzioni di callback seguenti chiamate dal framework quando il driver o il framework elimina un oggetto:
Una funzione di callback EvtCleanupCallback, che il framework chiama affinché il driver possa chiamare WdfObjectDereference se lo aveva precedentemente chiamato WdfObjectReference per l'oggetto che viene eliminato.
Un EvtDestroyCallback funzione di callback, che il framework chiama dopo che il conteggio dei riferimenti dell'oggetto è stato decrementato su zero.
Una di queste funzioni di callback deve deallocare qualsiasi risorsa specifica dell'oggetto che è stata allocata dal driver al momento della creazione dell'oggetto.
Il framework gestisce sempre l'eliminazione di alcuni oggetti framework e i driver non devono tentare di eliminare questi oggetti. Per un elenco di oggetti framework che i driver non possono eliminare, vedere WdfObjectDelete.