ExInitializeNPagedLookasideList-Funktion (wdm.h)
Die ExInitializeNPagedLookasideList Routine initialisiert eine Lookaside-Liste für nicht seitenseitige Einträge der angegebenen Größe.
Syntax
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
);
Parameter
[out] Lookaside
Ein Zeiger auf die NPAGED_LOOKASIDE_LIST Struktur, die initialisiert werden soll. Der Aufrufer muss nicht seitenseitigen Systemraum für die Struktur verwenden. Auf 64-Bit-Plattformen muss diese Struktur 16-Byte ausgerichtet sein.
[in, optional] Allocate
Ein Zeiger auf eine vom Aufrufer bereitgestellte Funktion zum Zuordnen eines Eintrags, wenn die Lookaside-Liste leer ist, oder auf NULL-. Wenn nicht-NULL-, besteht der Zeiger auf eine Funktion mit dem Prototyp:
PVOID XxxAllocate(
__in POOL_TYPE PoolType, // NonPagedPool
__in SIZE_T NumberOfBytes, // value of Size
__in ULONG Tag // value of Tag
);
Wenn der parameter "Zuweisen" NULList, werden nachfolgende Aufrufe von ExAllocateFromNPagedLookasideList automatisch Einträge zuordnen, wenn die Lookaside-Liste leer ist.
[in, optional] Free
Ein Zeiger auf eine vom Aufrufer bereitgestellte Funktion zum Freigeben eines Eintrags, wenn die Lookaside-Liste voll ist, oder auf NULL-. Wenn nicht-NULL-, besteht der Zeiger auf eine Funktion mit dem Prototyp:
VOID XxxFree(
__in PVOID Buffer
);
Wenn der parameter FreeNULL-ist, werden nachfolgende Aufrufe von ExFreeToNPagedLookasideList den angegebenen Eintrag bei voller Liste automatisch wieder in den nicht seitenfreien Pool freigeben, d. h. die vom System festgelegte maximale Anzahl von Einträgen.
[in] Flags
Ab Windows 8 gibt dieser Parameter einen optionalen Flagwert an, um das Standardverhalten der ExInitializeNPagedLookasideList Routine zu ändern. Kompatible Flagbits umfassen Folgendes.
Flagbit | Bedeutung | Wert |
---|---|---|
POOL_RAISE_IF_ALLOCATION_FAILURE | Wenn die Zuordnung fehlschlägt, lösen Sie eine Ausnahme aus. | 16 |
POOL_NX_ALLOCATION | Weisen Sie nicht ausführbaren Speicher zu. | 512 |
Vor Windows 8 wird dieser Parameter nicht verwendet und muss null sein.
[in] Size
Gibt die Größe in Byte für jeden nicht seitengebundenen Eintrag an, der anschließend zugewiesen werden soll. Dieser Parameter darf nicht kleiner als die erforderliche Mindestgröße LOOKASIDE_MINIMUM_BLOCK_SIZE sein, die in der Wdm.h-Headerdatei definiert ist.
[in] Tag
Gibt das Pooltag an, das beim Zuordnen von Lookaside-Listeneinträgen verwendet werden soll. Weitere Informationen zu Pooltags finden Sie im parameter Tag von ExAllocatePoolWithTag.
[in] Depth
Reserviert. Muss null sein.
Rückgabewert
Nichts
Bemerkungen
Nach dem Aufrufen ExInitializeNPagedLookasideList-können Speicherblöcke der vom Aufrufer angegebenen Size zugewiesen und der Lookaside-Liste mit Aufrufen von ExAllocateFromNPagedLookasideList bzw. ExFreeToNPagedLookasideListzugewiesen werden. Solche dynamisch zugewiesenen und freigegebenen Einträge können eine beliebige Datenstruktur oder ein Puffer mit fester Größe sein, den der Aufrufer während der Ausführung des Systems verwendet, insbesondere, wenn der Aufrufer nicht festlegen kann, wie viele solche Einträge zu einem bestimmten Zeitpunkt verwendet werden. Das Layout und der Inhalt jedes Eintrags mit fester Größe werden vom Aufrufer bestimmt.
ExInitializeNPagedLookasideList den Systemstatus initialisiert, um die Verwendung der angegebenen Lookaside-Liste wie folgt nachzuverfolgen:
Null initialisiert die Zähler, die für Einträge verwaltet werden sollen.
Speichert die Einstiegspunkte der vom Aufrufer bereitgestellten XxxZuordnen von und XxxFree Routinen, falls vorhanden, oder legt diese Einstiegspunkte auf ExAllocatePoolWithTag bzw. ExFreePool-fest.
Initialisiert eine Systemdrehsperre, um Die Zuordnungen von und freigibt die Lookaside-Liste bei Bedarf auf multiprozessorsichere Weise.
Speichert den vom Anrufer bereitgestellten Eintrag Größe und Liste Tag-.
Richtet die vom System festgelegten Grenzwerte (Minimum und Maximum) für die Anzahl der Einträge ein, die in der Lookaside-Liste aufbewahrt werden sollen, was anschließend angepasst werden kann, wenn die systemweite Nachfrage nach Einträgen höher oder niedriger ist als erwartet.
Richtet die vom System festgelegten Flags ein, die den Speichertyp steuern, aus dem einträge anschließend zugewiesen werden.
Das System verwaltet eine Reihe aller derzeit verwendeten Lookaside-Listen. Da die Nachfrage nach Nachschlagelisteneinträgen und im verfügbaren nicht seitenfreien Speicher während der Systemausführung variiert, passt das System seine Grenzwerte für die Anzahl der Einträge an, die in jeder nicht seitenseitigen Lookaside-Liste dynamisch gehalten werden sollen.
Treiber müssen immer explizit alle Lookaside-Listen freigeben, die sie vor dem Entladen erstellen. Andernfalls handelt es sich um einen schwerwiegenden Programmierfehler. Verwenden Sie ExDeleteNPagedLookasideList, um die Liste freizulassen.
ExInitializeNPagedLookasideList richtet den undurchsichtigen Listenkopf am vom Aufrufer bereitgestellten Speicherort ein, legt jedoch keinen Speicher für Listeneinträge fest. Anschließend werden die anfänglichen Einträge dynamisch zugewiesen, wenn Aufrufe von ExAllocateFromNPagedLookasideList auftreten, und diese anfänglichen Einträge werden in der Lookaside-Liste als gegenseitige Aufrufe an ExFreeToNPagedLookasideList stattfinden. Einträge werden in der angegebenen Lookaside-Liste erfasst, bis das vom System festgelegte Maximum erreicht ist, wobei alle zusätzlichen Einträge bei der Freigabe an den nichtpageten Pool zurückgegeben werden. Wenn die Liste leer wird, werden zuordnungsanforderungen vom XxxZuweisen Funktion erfüllt, die bei der Listeninitialisierung angegeben ist, oder durch ExAllocatePoolWithTag.
Es ist effizienter, NULL- Zeiger für die Zuweisen und Free Parameter von ExInitializeNPagedLookasideList zu übergeben, wenn der Benutzer einer Lookaside-Liste keine Einträge mit fester Größe zuordnet und loslässt. Jede Komponente, die eine Lookaside-Liste verwendet, kann diese Funktionen jedoch bereitstellen, um eine zusätzliche, durch Aufrufer festgelegte Verarbeitung zu erledigen, z. B. das Nachverfolgen einer eigenen dynamischen Speicherauslastung, indem der Zustand über die Anzahl der einträge beibehalten wird, die sie zuweist und freigibt.
Wenn der Aufrufer von ExInitializeNPagedLookasideList eine Xxx-Zuordnen-Funktion bereitstellt, muss diese Routine Einträge für die Lookaside-Liste mithilfe der angegebenen Eingabeparameter zuweisen, wenn sie ExAllocatePoolWithTag aufruft.
Beginnend mit Windows Vista, einer ähnlichen Routine, initialisiert ExInitializeLookasideListExeine Lookaside-Liste, die durch eine LOOKASIDE_LIST_EX Struktur beschrieben wird. Im Gegensatz zu den XxxZuweisen und XxxFree Routinen für eine Nachschlageliste, die eine NPAGED_LOOKASIDE_LIST Struktur verwendet, erhalten die Zuordnungs- und Deallocation-Routinen für eine Nachschlageliste, die die LOOKASIDE_LIST_EX Struktur verwendet, einen Kontextzeiger als Eingabeparameter. Diese Routinen können diesen Kontext verwenden, um private Daten für die Lookaside-Liste zu speichern. Wenn Ihr Treiber nur in Windows Vista und höheren Versionen von Windows ausgeführt werden soll, sollten Sie ExInitializeLookasideListEx anstelle von ExInitializeNPagedLookasideListverwenden. Weitere Informationen finden Sie unter Verwenden von Lookaside Lists.
Aufrufer von ExInitializeNPagedLookasideList- können bei IRQL <= DISPATCH_LEVEL ausgeführt werden, werden jedoch in der Regel bei IRQL = PASSIVE_LEVEL ausgeführt.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | IRQL-<= DISPATCH_LEVEL (siehe Abschnitt "Hinweise") |
Siehe auch
ExAllocateFromNPagedLookasideList