Condividi tramite


Funzione RtlInsertElementGenericTableAvl (ntddk.h)

La routine RtlInsertElementGenericTableAvl aggiunge una nuova voce a una tabella generica.

Sintassi

NTSYSAPI PVOID RtlInsertElementGenericTableAvl(
  [in]            PRTL_AVL_TABLE Table,
  [in]            PVOID          Buffer,
  [in]            CLONG          BufferSize,
  [out, optional] PBOOLEAN       NewElement
);

Parametri

[in] Table

Puntatore a una tabella Adelson-Velsky/Landis (AVL) generica (RTL_AVL_TABLE) inizializzata da una chiamata a RtlInitializeGenericTableAvl.

[in] Buffer

Buffer allocato dal chiamante che contiene i dati utente da copiare nel nuovo elemento. Per altre informazioni, vedere RtlInitializeGenericTableAvl.

[in] BufferSize

Dimensioni in byte di dati nel buffer.

[out, optional] NewElement

Nell'output, un valore true indica che l'inserimento del nuovo elemento nella tabella generica ha avuto esito positivo. Un valore false indica che l'inserimento non è riuscito.

Valore restituito

RtlInsertElementGenericTableAvl restituisce un puntatore ai dati utente per la voce appena inserita o i dati utente per una voce corrispondente già presente nella tabella generica. Se non viene trovata alcuna voce corrispondente, ma RtlInsertElementGenericTableAvl non può inserire la nuova voce( ad esempio, perché allocateRoutine ha esito negativo), RtlInsertElementGenericTableAvl restituisce NULL.

Commenti

Per inserire una voce, RtlInsertElementGenericTableAvl chiama CompareRoutine e AllocateRoutine registrati quando la tabella generica è stata inizializzata da RtlInitializeGenericTableAvl. Dopo aver inserito la nuova voce, RtlInsertElementGenericTableAvl ribilancia l'albero dei collegamenti AVL.

Quando una nuova voce viene inserita nella tabella, i dati vengono copiati dal buffer nella nuova voce. Pertanto il puntatore restituito da RtlInsertElementGenericTableAvl non è mai uguale a Buffer.

Se il chiamante CompareRoutine restituisce GenericEqual, i dati in Buffer vengono duplicati per una voce esistente nella tabella generica. In questo caso, RtlInsertElementGenericTableAvl non aggiunge la nuova voce (e quindi non chiama AllocateRoutine), perché una tabella generica non può avere voci duplicate.

Se una voce corrispondente esiste già nella tabella generica, RtlInsertElementGenericTableAvl restituisce un puntatore ai dati della voce esistente e imposta NewElement su FALSE.

Se nella tabella non è già presente alcuna voce corrispondente, la routine RtlInsertElementGenericTableAvl alloca spazio sufficiente per i dati utente della nuova voce (BufferSize) e i collegamenti associati alla nuova voce. Pertanto il numero totale di byte sarà almenodimensioniBufferSizeof + (RTL_BALANCED_LINKS). Il chiamante non deve usare i primi byte sizeof(RTL_BALANCED_LINKS) della memoria allocata da AllocateRoutine.

Chiamanti del Rtl.. Le routine GenericTableAvl sono responsabili della sincronizzazione esclusiva dell'accesso alla tabella generica. Un mutex veloce esclusivo è il meccanismo di sincronizzazione più efficiente da usare per questo scopo.

Per impostazione predefinita, il sistema operativo usa alberi splay per implementare tabelle generiche, ma la routine RtlInsertElementGenericTableAvl funziona solo con alberi Adelson-Velsky/Landis (AVL). Per configurare le routine di tabella generiche per usare alberi AVL anziché alberi di riproduzione nel driver, inserire l'istruzione define seguente in un file di intestazione comune prima di includere Ntddk.h:

#define RTL_USE_AVL_TABLES 0

Se RTL_USE_AVL_TABLES non è definito, è necessario usare il formato AVL delle routine di tabella generiche. Ad esempio, usare la routine RtlInsertElementGenericTableAvl anziché RtlInsertElementGenericTable. Nella chiamata a RtlInsertElementGenericTableAvl, il chiamante deve passare una struttura di tabella RTL_AVL_TABLE anziché RTL_GENERIC_TABLE.

I chiamanti di RtlInsertElementGenericTableAvl devono essere in esecuzione in IRQL < DISPATCH_LEVEL se una delle condizioni seguenti contiene:

  • La memoria allocata dal chiamante in Table o in Buffer è paginabile.
  • Il chiamante fornito da CompareRoutine o AllocateRoutine contiene codice paginabile.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows XP.
Piattaforma di destinazione Universale
Intestazione ntddk.h (include Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL (vedere la sezione Osservazioni)

Vedi anche

RtlDeleteElementGenericTableAvl

RtlInitializeGenericTableAvl