Funzione RtlInsertElementGenericTableFullAvl (ntddk.h)
La routine RtlInsertElementGenericTableFullAvl aggiunge una nuova voce a una tabella generica.
Sintassi
NTSYSAPI PVOID RtlInsertElementGenericTableFullAvl(
[in] PRTL_AVL_TABLE Table,
[in] PVOID Buffer,
[in] CLONG BufferSize,
[out, optional] PBOOLEAN NewElement,
[in] PVOID NodeOrParent,
[in] TABLE_SEARCH_RESULT SearchResult
);
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 è riuscito. Il valore FALSE indica che l'inserimento non è riuscito.
[in] NodeOrParent
Risultato della ricerca di una chiamata precedente a RtlLookupElementGenericTableFullAvl. Questo valore indica alla routine RtlInsertElementGenericTableFullAvl se l'albero è attualmente vuoto o se non è vuoto, se inserire la nuova voce a sinistra o a destra della voce padre. Il parametro SearchResult può avere uno dei valori seguenti:
TableEmptyTree
L'albero era vuoto. Il contenuto di NodeOrParentnon è stato modificato.
TableFoundNode
La routine RtlInsertElementGenericTableFullAvl ha trovato una voce di tabella la cui chiave corrisponde ai dati in Buffer. NodeOrParent contiene un puntatore alla voce corrispondente.
TableInsertAsLeft
La routine RtlInsertElementGenericTableFullAvlnon ha trovato una voce di tabella la cui chiave corrisponde ai dati in Buffer. Se la voce che RtlInsertElementGenericTableFullAvl ha cercato si trovasse nella tabella, sarebbe l'elemento figlio sinistro della voce a cui punta NodeOrParent .
TableInsertAsRight
La routine RtlInsertElementGenericTableFullAvlnon ha trovato una voce di tabella la cui chiave corrisponde ai dati in Buffer. Se la voce che RtlInsertElementGenericTableFullAvl ha cercato si trovasse nella tabella, sarebbe l'elemento figlio corretto della voce a cui punta NodeOrParent .
[in] SearchResult
Puntatore a una voce di tabella. Se la routine RtlInsertElementGenericTableFullAvl corrisponde a una voce, NodeOrParent punta alla voce corrispondente. Se la routine RtlInsertElementGenericTableFullAvl non riesce a trovare una corrispondenza, NodeOrParent punta alla voce che sarebbe l'elemento padre della voce che RtlInsertElementGenericTableFullAvl stava cercando.
Valore restituito
RtlInsertElementGenericTableFullAvl 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 RtlInsertElementGenericTableFullAvl non può inserire la nuova voce, ad esempio perché AllocateRoutine ha esito negativo, RtlInsertElementGenericTableFullAvl restituisce NULL.
Commenti
Per inserire una voce, RtlInsertElementGenericTableFullAvl chiama CompareRoutine e AllocateRoutine registrati quando la tabella generica è stata inizializzata da RtlInitializeGenericTableAvl. Dopo aver inserito la nuova voce, RtlInsertElementGenericTableFullAvl ribilancia l'albero dei collegamenti AVL.
Quando viene inserita una nuova voce nella tabella, i relativi dati vengono copiati da Buffer nella nuova voce. Il puntatore restituito da RtlInsertElementGenericTableFullAvl non è quindi mai uguale a Buffer.
Se compareRoutine del chiamante restituisce GenericEqual, si presuppone che i dati in Buffer duplicino i dati per una voce esistente nella tabella generica. In questo caso , RtlInsertElementGenericTableFullAvl non aggiunge la nuova voce (e quindi non chiama AllocateRoutine), perché una tabella generica non può contenere voci duplicate.
Se nella tabella generica esiste già una voce corrispondente, RtlInsertElementGenericTableFullAvl restituisce un puntatore ai dati della voce esistente e imposta NewElement su FALSE.
Se nella tabella non è già presente alcuna voce corrispondente, la routine RtlInsertElementGenericTableFullAvl alloca spazio sufficiente per i dati utente della nuova voce (BufferSize) più i collegamenti associati alla nuova voce. Pertanto, il numero totale di byte sarà almeno BufferSize + sizeof(BALANCED_LINKS). Il chiamante non deve usare i primi byte sizeof(BALANCED_LINKS) della memoria allocata da AllocateRoutine.
Chiamanti delRtl.. 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 a questo scopo.
Per impostazione predefinita, il sistema operativo usa alberi splay per implementare tabelle generiche, ma la routine RtlInsertElementGenericTableFullAvl funziona solo con alberi Adelson-Velsky/Landis (AVL). Per configurare le routine di tabella generiche per l'uso degli alberi AVL anziché degli alberi splay 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 utilizzare il formato AVL delle routine di tabella generiche. Ad esempio, usare la routine RtlInsertElementGenericTableFullAvl anziché RtlInsertElementGenericTableFull. Nella chiamata a RtlInsertElementGenericTableFullAvl, il chiamante deve passare una struttura di tabella RTL_AVL_TABLE anziché RTL_GENERIC_TABLE.
I chiamanti di RtlInsertElementGenericTableFullAvl devono essere in esecuzione in IRQL < DISPATCH_LEVEL se una delle condizioni seguenti è valida:
- La memoria allocata dal chiamante in Table o in Buffer è paging.
- Il chiamante fornito da CompareRoutine o AllocateRoutine contiene codice di paging.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Disponibile in Windows XP e versioni successive dei sistemi operativi Windows. |
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) |