Cycle de vie d’un objet

Cette rubrique décrit le « cycle de vie » d’un objet, c’est-à-dire la façon dont les objets sont référencés et suivis par le gestionnaire d’objets. Cette rubrique décrit également comment rendre des objets temporaires ou permanents.

Nombre de références d’objets

Le gestionnaire d’objets conserve le nombre de références à un objet. Lorsqu’un objet est créé, le gestionnaire d’objets définit le nombre de références de l’objet sur un. Une fois que ce compteur tombe à zéro, l’objet est libéré.

Les pilotes doivent s’assurer que le gestionnaire d’objets dispose d’un nombre de références précis pour tous les objets qu’ils manipulent. Un objet libéré prématurément peut provoquer le blocage du système. Un objet dont le nombre de références est erronément élevé ne sera jamais libéré.

Les objets peuvent être référencés par handle ou par pointeur. En plus du nombre de références, le gestionnaire d’objets conserve le nombre de handles ouverts pour un objet. Chaque routine qui ouvre un handle augmente à la fois le nombre de références d’objet et le nombre de handles d’objet d’un. Chaque appel à une telle routine doit être mis en correspondance avec un appel correspondant à ZwClose. Pour plus d’informations, consultez Handles d’objet.

En mode noyau, les objets peuvent être référencés par un pointeur vers l’objet. Les routines qui retournent des pointeurs vers des objets, tels que IoGetAttachedDeviceReference, augmentent le nombre de références d’un seul. Une fois le pilote terminé à l’aide du pointeur, il doit appeler ObDereferenceObject pour réduire le nombre de références d’un.

Les routines suivantes augmentent toutes le nombre de références d’un objet d’un :

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

Chaque appel effectué à l’une des routines précédentes doit être mis en correspondance avec un appel correspondant à ObDereferenceObject.

Les routines ObReferenceObject et ObReferenceObjectByPointer sont fournies afin que les pilotes puissent augmenter d’un seul le nombre de références d’un pointeur d’objet connu. ObReferenceObject augmente simplement le nombre de références. ObReferenceObjectByPointer effectue un case activée d’accès avant d’augmenter le nombre de références.

La routine ObReferenceObjectByHandle reçoit un handle d’objet et fournit un pointeur vers l’objet sous-jacent. Il augmente également le nombre de références d’un.

Objets temporaires et permanents

La plupart des objets sont temporaires ; ils existent tant qu’ils sont en cours d’utilisation, puis ils sont libérés par le gestionnaire d’objets. Des objets permanents peuvent être créés. Si un objet est permanent, le gestionnaire d’objets lui-même contient une référence à l’objet. Ainsi, son nombre de références reste supérieur à zéro et l’objet n’est pas libéré lorsqu’il n’est plus utilisé.

Un objet temporaire n’est accessible que par son nom tant que son nombre de handles est différent de zéro. Une fois que le nombre de handles est décrémenté à zéro, le nom de l’objet est supprimé de l’espace de noms du gestionnaire d’objets. Ces objets sont toujours accessibles par pointeur tant que leur nombre de références reste supérieur à zéro. Les objets permanents sont accessibles par nom tant qu’ils existent.

Un objet peut être rendu permanent au moment de sa création en spécifiant l’attribut OBJ_PERMANENT dans la structure OBJECT_ATTRIBUTES de l’objet. Pour plus d’informations, consultez InitializeObjectAttributes.

Pour rendre un objet permanent temporaire, utilisez la routine ZwMakeTemporaryObject . Cette routine entraîne la suppression automatique d’un objet une fois qu’il n’est plus utilisé. (Si l’objet n’a pas de handles ouverts, le nom de l’objet est immédiatement supprimé de l’espace de noms du gestionnaire d’objets. L’objet lui-même reste jusqu’à ce que le nombre de références tombe à zéro.)