Fonction RtlInitializeGenericTableAvl (ntddk.h)

La routine RtlInitializeGenericTableAvl initialise une table générique à l’aide d’arborescences Adelson-Velsky/Landis (AVL).

Syntaxe

NTSYSAPI VOID RtlInitializeGenericTableAvl(
  [out]          PRTL_AVL_TABLE            Table,
  [in]           PRTL_AVL_COMPARE_ROUTINE  CompareRoutine,
  [in]           PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
  [in]           PRTL_AVL_FREE_ROUTINE     FreeRoutine,
  [in, optional] PVOID                     TableContext
);

Paramètres

[out] Table

Pointeur vers une mémoire tampon allouée à l’appelant, qui doit avoir au moins une taille d’octets (RTL_AVL_TABLE) pour contenir la structure de table générique initialisée.

[in] CompareRoutine

Point d’entrée d’une routine de rappel de comparaison, déclaré comme suit :

RTL_GENERIC_COMPARE_RESULTS
(*PRTL_AVL_COMPARE_ROUTINE) (
    __in struct _RTL_AVL_TABLE  *Table,
    __in PVOID  FirstStruct,
    __in PVOID  SecondStruct
    ); 

Les paramètres CompareRoutine sont les suivants :

Table (CompareRoutine)

Pointeur vers la table générique.

FirstStruct

Pointeur vers le premier élément à comparer.

SecondStruct

Pointeur vers le deuxième élément à comparer.

CompareRoutine doit suivre strictement l’ordre de tous les éléments de la table générique afin qu’il puisse identifier un élément particulier. La structure définie par l’appelant pour les données d’élément inclut généralement un membre dont la valeur est unique et peut être utilisée comme clé de tri. Tout Rtl... Les routines GenericTableAvl qui appellent CompareRoutine prennent un pointeur de mémoire tampon en tant que paramètre, qui est passé à leur tour à CompareRoutine. La mémoire tampon contient une valeur de clé fournie par l’appelant à être mise en correspondance par CompareRoutine à la clé de l’élément recherché.

Avec deux valeurs de clé de ce type, CompareRoutine retourne GenericLessThan, GenericGreaterThan ou GenericEqual.

[in] AllocateRoutine

Point d’entrée d’une routine de rappel d’allocation, déclaré comme suit :

PVOID
(*PRTL_AVL_ALLOCATE_ROUTINE) (
    __in struct _RTL_AVL_TABLE  *Table,
    __in CLONG  ByteSize
    );

Les paramètres AllocateRoutine sont les suivants :

Table (AllocateRoutine)

Pointeur vers la table générique.

Taille

Nombre d'octets à allouer.

Pour chaque nouvel élément, l’objet AllocateRoutine est appelé pour allouer de la mémoire pour les données fournies par l’appelant, ainsi que de la mémoire supplémentaire à utiliser par le Rtl... Routines GenericTableAvl . Notez qu’en raison de cette « mémoire supplémentaire », les routines fournies par l’appelant ne doivent pas accéder aux premiers octets de taille(RTL_BALANCED_LINKS) d’un élément de la table générique.

[in] FreeRoutine

Point d’entrée d’une routine de rappel de désallocation, déclaré comme suit :

VOID
(*PRTL_AVL_FREE_ROUTINE) (
    __in struct _RTL_AVL_TABLE  *Table,
    __in PVOID  Buffer
    );

Les paramètres FreeRoutine sont les suivants :

Table (FreeRoutine)

Pointeur vers la table générique.

Buffer

Pointeur vers l’élément en cours de suppression.

Rtl... Les routines GenericTableAvl appellent FreeRoutine pour libérer la mémoire pour que les éléments soient supprimés de la table générique. Le FreeRoutine est le contraire de l’objet AllocateRoutine.

[in, optional] TableContext

Pointeur facultatif vers un contexte fourni par l’appelant pour la table générique. Ce paramètre peut être NULL.

Valeur de retour

None

Remarques

Les systèmes de fichiers appellent RtlInitializeGenericTableAvl pour initialiser une table générique afin de stocker des données spécifiques au système de fichiers, telles que des informations de recherche de nom pour les fichiers actuellement ouverts. L’ordre de tri, la structure et le contenu des éléments sont définis par l’appelant.

Les systèmes de fichiers doivent appeler RtlInitializeGenericTableAvl pour initialiser la table générique avant d’utiliser toute autre rtl... Routines GenericTableAvl sur la nouvelle table générique. La structure de table générique initialisée doit être considérée comme opaque.

Les appelants de Rtl... Les routines GenericTableAvl sont chargées de synchroniser exclusivement l’accès à la table générique. Un mutex rapide exclusif est le mécanisme de synchronisation le plus efficace à utiliser à cet effet.

L’élément CompareRoutine fourni par l’appelant est appelé avant l’objet AllocateRoutine pour localiser un emplacement approprié où un nouvel élément doit être inséré. CompareRoutine est également appelé avant FreeRoutine pour localiser un élément à supprimer.

La routine RtlInitializeGenericTableAvl alloue explicitement une table générique qui utilise des arborescences AVL. Utilisation de cette routine et de l’autre Rtl... Les routines GenericTableAvl sont nécessaires lorsque des tables arborescences AVL sont souhaitées et que RTL_USE_AVL_TABLES n’est pas défini avant d’inclure Ntddk.h.

Si vous souhaitez configurer les routines de table génériques, Rtl... GenericTable, pour utiliser les arborescences AVL au lieu d’exécuter des arborescences 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`

Les appelants de RtlInitializeGenericTableAvl doivent être en cours d’exécution à IRQL <= DISPATCH_LEVEL. Notez que si Rtl... Les routines GenericTableAvl doivent être utilisées dans IRQL DISPATCH_LEVEL, CompareRoutine, AllocateRoutine et FreeRoutine doivent toutes être du code non paginable, et l’allocationRoutine doit allouer de la mémoire à partir d’un pool non paginé.

Configuration requise

Condition requise Valeur
Plateforme cible Universal
En-tête ntddk.h (inclure Ntddk.h, Ntifs.h, Fltkernel.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (voir la section Remarques)

Voir aussi

ExInitializeFastMutex

RtlDeleteElementGenericTableAvl

RtlEnumerateGenericTableAvl

RtlGetElementGenericTableAvl

RtlInitializeGenericTable

RtlInsertElementGenericTableAvl

RtlLookupElementGenericTableAvl

RtlNumberGenericTableElementsAvl