Freigeben über


ExAllocatePoolWithQuotaTag-Funktion (wdm.h)

Die ExAllocatePoolWithQuotaTag Routine weist Poolspeicher zu, wobei das Kontingent für den aktuellen Prozess geladen wird.

Warnung

ExAllocatePoolWithQuotaTag ist in Windows 10, Version 2004, veraltet und wurde durch ExAllocatePool2ersetzt. Weitere Informationen finden Sie unter Aktualisieren veralteter ExAllocatePool-Aufrufe an ExAllocatePool2 und ExAllocatePool3.

Syntax

PVOID ExAllocatePoolWithQuotaTag(
  [in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  [in] SIZE_T                                         NumberOfBytes,
  [in] ULONG                                          Tag
);

Parameter

[in] PoolType

Gibt den Typ des zuzuweisenden Poolspeichers an. Eine Beschreibung der verfügbaren Poolspeichertypen finden Sie unter POOL_TYPE.

Sie können den wert PoolType durch Bitweise-ORing diesen Wert mit dem POOL_QUOTA_FAIL_INSTEAD_OF_RAISE-Flag ändern. Dieses Flag bewirkt, dass die Routine einen NULL- Wert zurückgibt, wenn die Anforderung nicht erfüllt werden kann.

Ebenso können Sie den PoolType-wert durch Bitweise-ORing diesen Wert mit dem POOL_COLD_ALLOCATION Flag als Hinweis auf den Kernel ändern, um den Speicher von Seiten zuzuweisen, die wahrscheinlich schnell ausgelagert werden. Um den Speicher des residenten Pools so weit wie möglich zu reduzieren, sollten Sie nicht häufig auf diese Zuordnungen verweisen. Das POOL_COLD_ALLOCATION Flag ist nur empfehlungsspezifisch und wird in Windows XP und höheren Versionen des Windows-Betriebssystems unterstützt.

[in] NumberOfBytes

Gibt die Anzahl der zuzuordnenden Bytes an.

[in] Tag

Gibt das Pooltag für den zugewiesenen Arbeitsspeicher an. Weitere Informationen finden Sie im parameter Tag von ExAllocatePoolWithTag.

Rückgabewert

ExAllocatePoolWithQuotaTag gibt einen Zeiger auf den zugeordneten Pool zurück.

Wenn die Anforderung nicht erfüllt werden kann, löst ExAllocatePoolWithQuotaTag eine Ausnahme aus, es sei denn, POOL_QUOTA_FAIL_INSTEAD_OF_RAISE ist angegeben. Die Verwendung von POOL_QUOTA_FAIL_INSTEAD_OF_RAISE wird aus Leistungsgründen bevorzugt.

Bemerkungen

Diese Routine wird von Treibern der höchsten Ebene aufgerufen, die Arbeitsspeicher zuweisen, um eine Anforderung im Kontext des Prozesses zu erfüllen, der ursprünglich die E/A-Anforderung vorgenommen hat. Treiber auf niedrigerer Ebene rufen stattdessen ExAllocatePoolWithTag- auf.

Wenn NumberOfBytes- PAGE_SIZE oder höher ist, wird ein Seitenausrichtungspuffer zugewiesen. Speicherzuordnungen von PAGE_SIZE oder weniger werden innerhalb einer Seite zugewiesen und überschreiten keine Seitengrenzen. Speicherzuordnungen von weniger als PAGE_SIZE sind nicht notwendigerweise seitenbündig ausgerichtet, werden aber in 32-Bit-Systemen und 16-Byte-Begrenzungen in 64-Bit-Systemen ausgerichtet.

Das System ordnet das Pooltag dem zugeordneten Speicher zu. Programmiertools, z. B. WinDbg, können das Pooltag anzeigen, das jedem zugeordneten Puffer zugeordnet ist. Der Wert Tag- wird normalerweise in umgekehrter Reihenfolge angezeigt. Wenn ein Aufrufer beispielsweise "Fred" als Tagübergibt, würde er als "derF" angezeigt, wenn der Pool abbildet oder wenn die Poolnutzung im Debugger nachverfolgt wird.

Der zugeordnete Puffer kann entweder mit ExFreePool oder ExFreePoolWithTagfreigegeben werden.

Legen Sie NumberOfBytes- = 0 nicht fest. Vermeiden Sie Zuweisungen der Länge Null, da sie Platz für den Poolkopf verschwenden und in vielen Fällen ein potenzielles Überprüfungsproblem im aufrufenden Code angeben. Aus diesem Grund Driver Verifier solche Zuordnungen als mögliche Fehler kennzeichnen.

Das System legt automatisch bestimmte Standardereignisobjekte fest, wenn die Menge des Pools (ausgelagert oder nicht ausgelagert) hoch oder niedrig ist. Treiber können warten, bis diese Ereignisse ihre Poolnutzung optimieren. Weitere Informationen finden Sie unter Standard-Ereignisobjekte.

ExAllocatePoolWithQuotaTag- versucht in einer Nicht-Uniform Memory Access-Architektur (NUMA) Speicher zuzuweisen, der ExAllocatePoolWithQuotaTagaufruft. Wenn kein lokaler Speicher verfügbar ist, weist ExAllocatePoolWithQuotaTag den nächstgelegenen verfügbaren Speicher zu.

Speicher, der ExAllocatePoolWithQuotaTag zugewiesen wird, ist nicht initialisiert. Ein Kernelmodustreiber muss zuerst diesen Speicher null sein, wenn er für Software im Benutzermodus sichtbar macht (um zu vermeiden, dass potenziell privilegierte Inhalte verloren gehen).

Aufrufer von ExAllocatePoolWithQuotaTag- müssen bei IRQL <= DISPATCH_LEVEL ausgeführt werden. Ein Aufrufer, der bei DISPATCH_LEVEL ausgeführt wird, muss einen NonPaged-Xxx- wert für PoolType-angeben. Ein Aufrufer, der bei IRQL <= APC_LEVEL ausgeführt wird, kann einen beliebigen POOL_TYPE Wert angeben, aber die IRQL und Umgebung müssen auch zum Bestimmen des Pooltyps berücksichtigt werden.

Anforderungen

Anforderung Wert
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL (siehe Abschnitt "Hinweise")
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf)

Siehe auch

ExAllocatePoolWithTag-

ExFreePool-

ExFreePoolWithTag-

POOL_TYPE