Ciclo di vita di un oggetto
Questo argomento descrive il "ciclo di vita" di un oggetto, ovvero il modo in cui gli oggetti vengono a cui viene fatto riferimento e monitorato dal gestore oggetti. Questo argomento descrive anche come creare oggetti temporanei o permanenti.
Conteggio riferimenti a oggetti
Gestione oggetti gestisce un conteggio del numero di riferimenti a un oggetto. Quando viene creato un oggetto, gestione oggetti imposta il conteggio dei riferimenti dell'oggetto su uno. Una volta che il contatore scende a zero, l'oggetto viene liberato.
I driver devono assicurarsi che il gestore oggetti disponga di un numero di riferimenti accurato per tutti gli oggetti che modificano. Un oggetto rilasciato prematuramente può causare l'arresto anomalo del sistema. Un oggetto il cui numero di riferimenti è erroneamente elevato non verrà mai liberato.
Gli oggetti possono essere a cui si fa riferimento per handle o per puntatore. Oltre al conteggio dei riferimenti, gestione oggetti gestisce un conteggio del numero di handle aperti a un oggetto. Ogni routine che apre un handle aumenta sia il conteggio dei riferimenti dell'oggetto che il conteggio dell'handle dell'oggetto per uno. Ogni chiamata a tale routine deve essere associata a una chiamata corrispondente a ZwClose. Per altre informazioni, vedere Handle degli oggetti.
In modalità kernel, gli oggetti possono essere a cui fa riferimento un puntatore all'oggetto. Routine che restituiscono puntatori a oggetti, ad esempio IoGetAttachedDeviceReference, aumentare il conteggio dei riferimenti per uno. Dopo aver usato il puntatore, il driver deve chiamare ObDereferenceObject per ridurre il conteggio dei riferimenti per uno.
Le routine seguenti aumentano tutti il conteggio dei riferimenti di un oggetto per uno:
Ogni chiamata effettuata a una delle routine precedenti deve essere associata a una chiamata corrispondente a ObDereferenceObject.
Le routine ObReferenceObject e ObReferenceObjectByPointer vengono fornite in modo che i driver possano aumentare il numero di riferimenti di un puntatore a oggetti noto per uno. ObReferenceObject aumenta semplicemente il conteggio dei riferimenti. ObReferenceObjectByPointer esegue un controllo di accesso prima di aumentare il conteggio dei riferimenti.
La routine ObReferenceObjectByHandle riceve un handle di oggetti e fornisce un puntatore all'oggetto sottostante. Aumenta anche il conteggio dei riferimenti per uno.
Oggetti temporanei e permanenti
La maggior parte degli oggetti è temporanea; esistono finché sono in uso e quindi vengono liberati dal gestore oggetti. È possibile creare oggetti permanenti. Se un oggetto è permanente, gestione oggetti contiene un riferimento all'oggetto. Pertanto, il numero di riferimenti rimane maggiore di zero e l'oggetto non viene liberato quando non è più in uso.
Un oggetto temporaneo può essere accessibile solo per nome, purché il numero di handle sia diverso da zero. Una volta che il numero di handle decrementa su zero, il nome dell'oggetto viene rimosso dallo spazio dei nomi di Gestione oggetti. Tali oggetti possono comunque essere accessibili tramite puntatore, purché il numero di riferimenti rimanga maggiore di zero. Gli oggetti permanenti possono essere accessibili per nome purché esistano.
Un oggetto può essere reso permanente al momento della sua creazione specificando l'attributo OBJ_PERMANENT nella struttura OBJECT_ATTRIBUTES per l'oggetto. Per altre informazioni, vedere InitializeObjectAttributes.
Per rendere temporaneo un oggetto permanente, usare la routine ZwMakeTemporaryObject . Questa routine causa l'eliminazione automatica di un oggetto dopo che non è più in uso. Se l'oggetto non ha handle aperti, il nome dell'oggetto viene immediatamente rimosso dallo spazio dei nomi di Gestione oggetti. L'oggetto stesso rimane fino a quando il conteggio dei riferimenti scende a zero.