Funzione ExInitializeNPagedLookasideList (wdm.h)
La routine ExInitializeNPagedLookasideList inizializza un elenco lookaside per voci non di paging delle dimensioni specificate.
Sintassi
void ExInitializeNPagedLookasideList(
[out] PNPAGED_LOOKASIDE_LIST Lookaside,
[in, optional] PALLOCATE_FUNCTION Allocate,
[in, optional] PFREE_FUNCTION Free,
[in] ULONG Flags,
[in] SIZE_T Size,
[in] ULONG Tag,
[in] USHORT Depth
);
Parametri
[out] Lookaside
Puntatore alla struttura NPAGED_LOOKASIDE_LIST da inizializzare. Il chiamante deve usare lo spazio di sistema non in pagine per la struttura. Nelle piattaforme a 64 bit questa struttura deve essere allineata a 16 byte.
[in, optional] Allocate
Puntatore a una funzione fornita dal chiamante per l'allocazione di una voce quando l'elenco lookaside è vuoto o su NULL. Se non NULL, il puntatore è a una funzione con il prototipo:
PVOID XxxAllocate(
__in POOL_TYPE PoolType, // NonPagedPool
__in SIZE_T NumberOfBytes, // value of Size
__in ULONG Tag // value of Tag
);
Se il parametro Allocate è NULL, le chiamate successive a ExAllocateFromNPagedLookasideList allocano automaticamente le voci ogni volta che l'elenco lookaside è vuoto.
[in, optional] Free
Puntatore a una funzione fornita dal chiamante per liberare una voce ogni volta che l'elenco lookaside è pieno o null. Se non NULL, il puntatore è a una funzione con il prototipo:
VOID XxxFree(
__in PVOID Buffer
);
Se il parametro Free è NULL, le chiamate successive a ExFreeToNPagedLookasideList rilasciano automaticamente la voce specificata nel pool non di paging ogni volta che l'elenco è pieno, ovvero mantenendo il numero massimo di voci determinato dal sistema.
[in] Flags
A partire da Windows 8, questo parametro specifica un valore di flag facoltativo per modificare il comportamento predefinito della routine ExInitializeNPagedLookasideList. I bit dei flag compatibili includono quanto segue.
Flag bit | Significato | Valore |
---|---|---|
POOL_RAISE_IF_ALLOCATION_FAILURE | Se l'allocazione non riesce, generare un'eccezione. | 16 |
POOL_NX_ALLOCATION | Allocare memoria non eseguibile. | 512 |
Prima di Windows 8, questo parametro non viene usato e deve essere zero.
[in] Size
Specifica le dimensioni, in byte, per ogni voce non di paging da allocare successivamente. Questo parametro non deve essere inferiore alla dimensione minima richiesta, LOOKASIDE_MINIMUM_BLOCK_SIZE, definita nel file di intestazione Wdm.h.
[in] Tag
Specifica il tag del pool da utilizzare per l'allocazione delle voci dell'elenco lookaside. Per altre informazioni sui tag del pool, vedere il parametro Tag di ExAllocatePoolWithTag.
[in] Depth
Riservato. Deve essere zero.
Valore restituito
nessuno
Osservazioni
Dopo aver chiamato ExInitializeNPagedLookasideList, i blocchi di memoria della dimensione specificata dal chiamante possono essere allocati e liberati all'elenco lookaside con chiamate a ExAllocateFromNPagedLookasideList e ExFreeToNPagedLookasideList, rispettivamente. Tali voci allocate e liberate in modo dinamico possono essere qualsiasi struttura di dati o buffer a dimensione fissa usata dal chiamante durante l'esecuzione del sistema, in particolare se il chiamante non può predeterminato il numero di voci in uso in un determinato momento. Il layout e il contenuto di ogni voce a dimensione fissa sono determinati dal chiamante.
ExInitializeNPagedLookasideList inizializza lo stato del sistema per tenere traccia dell'utilizzo dell'elenco lookaside specificato, come indicato di seguito:
Inizializza zero i contatori da mantenere per le voci.
Archivia i punti di ingresso delle routine XxxAllocate e XxxFree fornite dal chiamante, se presenti, o imposta questi punti di ingresso rispettivamente su ExAllocatePoolWithTag e ExFreePool.
Inizializza un blocco di rotazione di sistema per controllare le allocazioni da e libera all'elenco lookaside in modo sicuro, se necessario.
Archivia la voce fornita dal chiamante Dimensioni e tag elenco.
Imposta i limiti determinati dal sistema (minimo e massimo) sul numero di voci da mantenere nell'elenco lookaside, che possono essere modificati successivamente se la domanda a livello di sistema per le voci è superiore o inferiore al previsto.
Configura i flag determinati dal sistema, che controllano il tipo di memoria da cui verranno allocate le voci successivamente.
Il sistema gestisce un set di tutti gli elenchi lookaside attualmente in uso. Poiché la richiesta di voci di elenco lookaside e in memoria non di paging disponibile varia durante l'esecuzione del sistema, il sistema modifica i limiti per il numero di voci da mantenere in ogni elenco lookaside non a pagina in modo dinamico.
I driver devono sempre liberare esplicitamente tutti gli elenchi lookaside creati prima dello scaricamento. In caso contrario, si tratta di un errore di programmazione grave. Utilizzare ExDeleteNPagedLookasideList per liberare l'elenco.
ExInitializeNPagedLookasideList configura l'intestazione elenco opaca nella posizione fornita dal chiamante, ma non prealloca memoria per le voci di elenco. Successivamente, le voci iniziali vengono allocate in modo dinamico man mano che si verificano chiamate a ExAllocateFromNPagedLookasideList e queste voci iniziali vengono mantenute nell'elenco lookaside man mano che si verificano chiamate reciproche a ExFreeToNPagedLookasideList . Le voci vengono raccolte nell'elenco lookaside specificato fino a quando non viene raggiunto il valore massimo determinato dal sistema, in base alla quale vengono restituite eventuali voci aggiuntive nel pool non di paging man mano che vengono liberate. Se l'elenco diventa vuoto, le richieste di allocazione vengono soddisfatte dalla funzione XxxAllocate specificata in fase di inizializzazione dell'elenco o da ExAllocatePoolWithTag.
È più efficiente passare puntatori NULL per i parametri Allocate e Free di ExInitializeNPagedLookasideList ogni volta che l'utente di un elenco lookaside non esegue altro che allocare e rilasciare voci di dimensioni fisse. Tuttavia, qualsiasi componente che usa un elenco lookaside potrebbe fornire queste funzioni per eseguire un'elaborazione aggiuntiva determinata dal chiamante, ad esempio per tenere traccia del proprio utilizzo di memoria dinamica mantenendo lo stato relativo al numero di voci allocate e libere.
Se il chiamante di ExInitializeNPagedLookasideList fornisce una funzione XxxAllocate , tale routine deve allocare voci per l'elenco lookaside usando i parametri di input specificati quando chiama ExAllocatePoolWithTag.
A partire da Windows Vista, una routine simile, ExInitializeLookasideListEx, inizializza un elenco lookaside descritto da una struttura LOOKASIDE_LIST_EX . A differenza delle routine XxxAllocate e XxxFree per un elenco lookaside che utilizza una struttura NPAGED_LOOKASIDE_LIST , le routine di allocazione e deallocazione per un elenco lookaside che utilizza la struttura LOOKASIDE_LIST_EX ricevono un puntatore di contesto come parametro di input. Queste routine possono usare questo contesto per archiviare i dati privati per l'elenco lookaside. Se il driver deve essere eseguito solo in Windows Vista e versioni successive di Windows, è consigliabile usare ExInitializeLookasideListEx anziché ExInitializeNPagedLookasideList. Per altre informazioni, vedere Uso delle Elenchi Lookaside.
I chiamanti di ExInitializeNPagedLookasideList possono essere eseguiti in IRQL <= DISPATCH_LEVEL, ma in genere vengono eseguiti in IRQL = PASSIVE_LEVEL.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Libreria | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL (vedere la sezione Osservazioni) |
Vedi anche
ExAllocateFromNPagedLookasideList