Freigeben über


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

ExAllocatePoolWithTag-

ExDeletePagedLookasideList

ExFreePool-

ExFreeToPagedLookasideList

ExInitializeLookasideListEx

ExInitializeNPagedLookasideList

LOOKASIDE_LIST_EX

PAGED_LOOKASIDE_LIST