Funzione RtlEnumerateGenericTableWithoutSplaying (ntddk.h)
La routine RtlEnumerateGenericTableWithoutSplaying viene utilizzata per enumerare gli elementi in una tabella generica.
Sintassi
NTSYSAPI PVOID RtlEnumerateGenericTableWithoutSplaying(
[in] PRTL_GENERIC_TABLE Table,
[in, out] PVOID *RestartKey
);
Parametri
[in] Table
Puntatore alla tabella generica (RTL_GENERIC_TABLE). La tabella deve essere stata inizializzata chiamando RtlInitializeGenericTable.
[in, out] RestartKey
Indirizzo dell'elemento restituito dalla chiamata precedente a RtlEnumerateGenericTableWithoutSplaying. Deve essere impostato su null se l'enumerazione deve iniziare al primo elemento della tabella.
Per enumerare tutti gli elementi della tabella, usare RtlEnumerateGenericTableWithoutSplaying come indicato di seguito:
RestartKey = NULL;
for (ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey);
ptr != NULL;
ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey)) {
// Process the element pointed to by ptr
}
Valore restituito
RtlEnumerateGenericTableWithoutSplaying restituisce un puntatore alla struttura definita dal chiamante associata all'elemento . Restituisce NULL se RestartKey è NULL e la tabella non contiene elementi o se RestartKey è un puntatore restituito e non è presente alcun elemento successivo.
Osservazioni
A differenza di RtlEnumerateGenericTable, RtlEnumerateGenericTableWithoutSplaying non appiattisce la tabella generica convertendola da un albero splay in un elenco collegato ordinato. RtlEnumerateGenericTableWithoutSplaying è più efficiente e multiprocessore rispetto a RtlEnumerateGenericTable.
RtlEnumerateGenericTableWithoutSplaying può essere chiamato ripetutamente per elaborare i dati del chiamante in ogni elemento di una tabella generica.
Chiamanti del Rtl.. Le routine genericTable 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. In alcune circostanze, le operazioni su un albero splay renderanno l'albero profondo e stretto e potrebbe anche trasformarlo in una linea retta. Gli alberi molto profondi riducono le prestazioni delle ricerche. È possibile garantire un'implementazione ad albero più bilanciata e superficiale di tabelle generiche usando alberi Adelson-Velsky/Landis (AVL). Se si desidera configurare le routine di tabella generiche per l'uso di 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 utilizzare il formato AVL delle routine di tabella generiche. Ad esempio, usare la routine RtlEnumerateGenericTableWithoutSplaying anziché RtlEnumerateGenericTableWithoutSplayingAvl. Nella chiamata a RtlEnumerateGenericTableWithoutSplayingAvl, il chiamante deve passare una struttura di tabella RTL_AVL_TABLE anziché RTL_GENERIC_TABLE.
I chiamanti di RtlEnumerateGenericTableWithoutSplaying devono essere in esecuzione in irQL < DISPATCH_LEVEL se la memoria allocata dal chiamante per la tabella generica è pageable.
Fabbisogno
Requisito | Valore |
---|---|
piattaforma di destinazione | Universale |
intestazione | ntddk.h (include Ntddk.h, Ntifs.h) |
libreria | NtosKrnl.lib |
dll | NtosKrnl.exe |
IRQL | Vedere la sezione Osservazioni. |