Partager via


Fonction RtlEnumerateGenericTableLikeADirectory (ntddk.h)

La routine RtlEnumerateGenericTableLikeADirectory retourne les éléments d’une table générique, un par un, dans l’ordre de classement.

Syntaxe

NTSYSAPI PVOID RtlEnumerateGenericTableLikeADirectory(
  [in]           PRTL_AVL_TABLE          Table,
  [in, optional] PRTL_AVL_MATCH_FUNCTION MatchFunction,
  [in, optional] PVOID                   MatchData,
  [in]           ULONG                   NextFlag,
  [in, out]      PVOID                   *RestartKey,
  [in, out]      PULONG                  DeleteCount,
  [in]           PVOID                   Buffer
);

Paramètres

[in] Table

Pointeur vers la table Adelson-Velsky/Landis (RTL_AVL_TABLE) qui sera énumérée.

[in, optional] MatchFunction

Fonction de correspondance qui détermine les entrées à retourner. S’il n’est pas spécifié, tous les nœuds sont retournés.

[in, optional] MatchData

Données à passer à la fonction de correspondance.

[in] NextFlag

Si *RestartKey n’est pas NULL, une valeur de TRUE indique que l’énumération ignore un élément. Si FALSE l’énumération reprend là où elle s’est arrêtée dans l’appel précédent pour RtlEnumerateGenericTableLikeADirectory. Si *RestartKey est NULL, une valeur de TRUE indique RtlEnumerateGenericTableLikeADirectory de retourner l’entrée suivante dans l’arborescence après l’entrée qui correspond aux données dans Tampon. Une valeur de FALSE indique à RtlEnumerateGenericTableLikeADirectory de retourner l’entrée dans l’arborescence qui correspond aux données dans Tampon.

[in, out] RestartKey

Valeur qui détermine où commencer ou reprendre l’énumération des éléments de table génériques. Si *RestartKey est NULL, l’énumération commence ou reprend à partir de la position décrite dans tampon. S’il n'NULL, l’énumération reprend à partir du point que RestartKey indique. Au retour, la RestartKey contient une valeur qui indique l’emplacement dans l’arborescence où l’énumération est désactivée. Lors de l’appel suivant pour RtlEnumerateGenericTableLikeADirectory appelant doit transmettre la même valeur pour informer RtlEnumerateGenericTableLikeADirectory où reprendre l’énumération. L’exemple de code suivant illustre comment procéder :

NextFlag = FALSE;
RestartKey = NULL;
DeleteCount = 0;
// Initialize Buffer for start/resume point
Buffer = ...
for (ptr = NULL; ptr != NULL;  ) {
  // Value returned in RestartKey will be passed back in
  // on following call (iteration):
  ptr = RtlEnumerateGenericTableLikeADirectory(
      &MyTable, NULL, NULL, TRUE, &RestartKey,
      &DeleteCount, &Buffer, sizeof(LONG) );
      ...
  // The value output in RestartKey will still be in
  // RestartKey when the
  // RtlEnumerationGenericTableLikeADirectory routine
  // is called in the next iteration of this loop.
  // This ensures that the enumeration will pick up
  // where it left off.
}

Si un nœud est supprimé de l’arborescence entre les appels à RtlEnumerateGenericTableLikeADirectory, l’énumération reprend de la position dans l’arborescence décrite dans tampon, quelle que soit la valeur de *RestartKey.

[in, out] DeleteCount

En sortie, valeur qui indique le nombre actuel d’entrées supprimées de la table. L’appelant doit renvoyer cette valeur lors de l’appel suivant à RtlEnumerateGenericTableLikeADirectory. Cette valeur aide la routine RtlEnumerateGenericTableLikeADirectory déterminer si des suppressions de la table se sont produites entre les appels à RtlEnumerateGenericTableLikeADirectory. Si des suppressions se sont produites, l’énumération reprend avec l’entrée de table qui correspond aux données dans tampon, et non avec l’entrée de table indiquée par RestartKey. Si *RestartKey est NULL, ce paramètre n’a aucun effet sur l’énumération.

[in] Buffer

Expression clé qui détermine où commencer l’énumération, quand *RestartKey est null. L’appelant peut passer une clé enregistrée qui correspond à une entrée particulière dans la table et l’énumération commence à l’entrée spécifiée par la clé enregistrée, fournie *RestartKey est NULL et NextFlag est FALSE. Pour renvoyer la clé qui suit immédiatement une clé enregistrée, passez la clé ici, définissez *RestartKey sur NULL et NextFlag sur TRUE. Si la clé enregistrée a été supprimée, l’énumération commence par la clé correspondante suivante.

Valeur de retour

La routine RtlEnumerateGenericTableLikeADirectory retourne un pointeur vers une structure définie par l’utilisateur associée à l’élément de table suivant dans l’énumération. S’il n’y a plus de nouveaux éléments à retourner, la valeur de retour est NULL.

Remarques

La routine RtlEnumerateGenericTableLikeADirectory fournit un moyen sûr d’énumérer une table générique entre les opérations d’insertion et de suppression mélangées. À compter du premier nom de clé correspondant, RtlEnumerateGenericTableLikeADirectory retourne chaque nom dans la table exactement une fois, sauf si le nom a été inséré ou supprimé pendant l’énumération. Lorsqu’un nom de clé est inséré ou supprimé pendant une énumération (c’est-à-dire entre les appels à RtlEnumerateGenericTableLikeADirectory) il peut ou non être inclus dans l’énumération. Si ces noms sont inclus dépend de l’état du nom lorsque RtlEnumerateGenericTableLikeADirectory traite la plage de répertoires dans laquelle le nom est trouvé.

Vous pouvez utiliser quatre routines pour énumérer une table générique :

Par défaut, le système d’exploitation utilise des arborescences de lecture pour implémenter des tables génériques, mais l'RtlEnumerateGenericTableLikeADirectory routine fonctionne uniquement avec les arborescences Adelson-Velsky/Landis (AVL). Pour configurer les routines de table génériques afin d’utiliser des arborescences AVL au lieu de les exécuter dans votre pilote, insérez l’instruction define suivante dans un fichier d’en-tête commun avant d’inclure Ntddk.h :

 #define RTL_USE_AVL_TABLES 0

Si RTL_USE_AVL_TABLES n’est pas défini, vous devez utiliser la forme AVL des routines de table générique.

Les appelants de RtlEnumerateGenericTableLikeADirectory doivent s’exécuter au <IRQL = APC_LEVEL si l’une des conditions suivantes est conservée :

  • La mémoire allouée par l’appelant à table ou à tampon est paginable.

  • L’appelant MatchFunction contient du code paginable.

Exigences

Exigence Valeur
plateforme cible Universel
d’en-tête ntddk.h (include Ntddk.h, Ntifs.h, FltKernel.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL (voir la section Remarques)

Voir aussi

RtlEnumerateGenericTable

RtlEnumerateGenericTableWithoutSplaying

RtlGetElementGenericTable