Ciclo di vita dell'oggetto Framework

Un oggetto framework "ciclo di vita" si estende nel tempo da quando 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 WdfDriverCreate 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 framework e lo passa alla funzione di callback EvtDeviceFileCreate callback del driver.

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.

Uso dei conteggi dei riferimenti

Il framework gestisce un numero di riferimenti per ogni oggetto. Quando viene creato un oggetto, il framework imposta il numero di 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 conteggio dei riferimenti o WdfObjectDereference per decrerere il conteggio dei riferimenti. Un driver può chiamare WdfObjectDereference solo se ha precedentemente chiamato WdfObjectReference.

Nella maggior parte dei casi, i driver non devono aumentare o decrerere 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 ha più bisogno 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 lo usi. Per un esempio di situazione 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 numero di 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 chiamando semplicemente WdfObjectDereference per decrerere 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 dell'oggetto inizia dall'oggetto più lontano dall'elemento padre e funziona verso la gerarchia degli oggetti verso la radice.

I driver possono registrare le due funzioni di callback seguenti che il framework chiama quando il driver o il framework elimina un oggetto:

Una di queste funzioni di callback deve deallocare qualsiasi risorsa specifica dell'oggetto allocata 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 non possono essere eliminati, vedere WdfObjectDelete.