ExInitializePagedLookasideList-Funktion (wdm.h)
Die ExInitializePagedLookasideList Routine initialisiert eine Lookaside-Liste für seitenfähige Einträge der angegebenen Größe.
Syntax
void ExInitializePagedLookasideList(
[out] PPAGED_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 PAGED_LOOKASIDE_LIST Struktur, die initialisiert werden soll. Der Aufrufer muss nicht ausgelagerten Systembereich für die Struktur verwenden, obwohl die Einträge in dieser Lookaside-Liste aus dem ausgelagerten Speicher zugewiesen werden. 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, // PagedPool
__in SIZE_T NumberOfBytes, // value of Size
__in ULONG Tag // value of Tag
);
Wenn der parameter Zuweisen null ist, werden nachfolgende Aufrufe von ExAllocateFromPagedLookasideList automatisch Einträge zuweisen, 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 FreeNULList, geben nachfolgende Aufrufe von ExFreeToPagedLookasideList automatisch den angegebenen Eintrag zurück an den ausgelagerten Pool zurück, 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 ExInitializePagedLookasideList Routine zu ändern. Kompatible Flagbits umfassen Folgendes.
Flagbit | Bedeutung |
---|---|
POOL_RAISE_IF_ALLOCATION_FAILURE | Wenn die Zuordnung fehlschlägt, lösen Sie eine Ausnahme aus. |
Das Angeben des POOL_NX_ALLOCATION Flags hat keine Auswirkung. Der gesamte ausgelagerte Speicher wird als NX zugewiesen.
Vor Windows 8 wird dieser Parameter nicht verwendet und muss null sein.
[in] Size
Gibt die Größe in Byte jedes Eintrags in der Lookaside-Liste an.
[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 ExInitializePagedLookasideList-können Blöcke der vom Aufrufer angegebenen Size der Lookaside-Liste mit Aufrufen von ExAllocateFromPagedLookasideList bzw. ExFreeToPagedLookasideList-zugewiesen 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.
ExInitializePagedLookasideList den Systemzustand 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 von Lookaside-Listen, die verwendet werden. Da die Nachfrage nach Nachschlagelisteneinträgen und auf verfügbaren seitenseitigem Arbeitsspeicher variiert, während das System ausgeführt wird, passt das System seine Grenzwerte für die Anzahl der Einträge an, die in jeder seitenseitigen Lookaside-Liste dynamisch gehalten werden sollen.
Treiber müssen immer explizit kostenlose Lookaside-Listen verwenden, die sie vor dem Entladen erstellen. Andernfalls handelt es sich um einen schwerwiegenden Programmierfehler. Verwenden Sie ExDeletePagedLookasideList-, um die Liste freizulassen.
ExInitializePagedLookasideList richtet den undurchsichtigen Listenkopf am vom Aufrufer bereitgestellten Speicherort ein, legt jedoch keinen Speicher für Listeneinträge fest. Anschließend werden die anfangseinträge dynamisch als Aufrufe von ExAllocateFromPagedLookasideList zugewiesen, und diese anfänglichen Einträge werden in der Lookaside-Liste als gegenseitige Aufrufe an ExFreeToPagedLookasideList auftreten. Einträge werden in der angegebenen Lookaside-Liste erfasst, bis das vom System festgelegte Maximum erreicht ist, wobei alle zusätzlichen Einträge beim Freigeben an den seitenseitigen 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 Zuordnen und Free Parameter von ExInitializePagedLookasideList 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 ExInitializePagedLookasideList eine Xxx-Zuordnen-Funktion bereitstellt, muss diese Funktion 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 von und XxxFree Routinen für eine Nachschlageliste, die eine PAGED_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 ExInitializePagedLookasideListverwenden. Weitere Informationen finden Sie unter Verwenden von Lookaside Lists.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | <= APC_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm) |
Siehe auch
ExAllocateFromPagedLookasideList