ExAllocatePoolWithQuotaTag-Funktion (wdm.h)
Die ExAllocatePoolWithQuotaTag-Routine weist Poolspeicher zu, wobei das Kontingent auf den aktuellen Prozess aufgerechnet wird.
Warnung
ExAllocatePoolWithQuotaTag ist in Windows 10 Version 2004 veraltet und wurde durch ExAllocatePool2 ersetzt. 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 PoolType-Wert ändern, indem Sie bitweise diesen Wert mit dem flag POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. Dieses Flag bewirkt, dass die Routine einen NULL-Wert zurückgibt, wenn die Anforderung nicht erfüllt werden kann.
Auf ähnliche Weise können Sie den PoolType-Wert ändern, indem Sie diesen Wert bitweise mit dem POOL_COLD_ALLOCATION-Flag als Hinweis an den Kernel ändern, um den Arbeitsspeicher 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 ein Hinweis und wird in Windows XP und höheren Versionen des Windows-Betriebssystems unterstützt.
[in] NumberOfBytes
Legt die Anzahl der zuzuweisenden Bytes fest.
[in] Tag
Gibt das Pooltag für den zugewiesenen Arbeitsspeicher an. Weitere Informationen finden Sie im Tag-Parameter 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, es wird POOL_QUOTA_FAIL_INSTEAD_OF_RAISE angegeben. Die Verwendung POOL_QUOTA_FAIL_INSTEAD_OF_RAISE wird aus Leistungsgründen bevorzugt.
Hinweise
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 gestellt hat. Treiber auf niedrigerer Ebene rufen stattdessen ExAllocatePoolWithTag auf.
Wenn NumberOfBytes PAGE_SIZE oder höher ist, wird ein seitenorientierter Puffer zugewiesen. Speicherzuordnungen von PAGE_SIZE oder weniger werden innerhalb einer Seite zugeordnet und überschreiten keine Seitengrenzen. Speicherzuordnungen von kleiner als PAGE_SIZE sind nicht unbedingt seitenbündig, sondern an 8-Byte-Grenzen in 32-Bit-Systemen und an 16-Byte-Grenzen in 64-Bit-Systemen ausgerichtet.
Das System ordnet das Pooltag dem zugeordneten Arbeitsspeicher zu. Programmiertools, z. B. WinDbg, können das Pooltag anzeigen, das jedem zugeordneten Puffer zugeordnet ist. Der Wert von Tag wird normalerweise in umgekehrter Reihenfolge angezeigt. Wenn ein Aufrufer beispielsweise "Fred" als Tag übergibt, wird es als "derF" angezeigt, wenn der Pool dumped wird oder wenn die Poolnutzung im Debugger nachverfolgt wird.
Der zugeordnete Puffer kann entweder mit ExFreePool oder ExFreePoolWithTag freigegeben werden.
Legen Sie NumberOfBytes = 0 nicht fest. Vermeiden Sie Zuweisungen der Länge null, da sie Speicherplatz im Poolheader verschwenden und in vielen Fällen auf ein potenzielles Validierungsproblem im aufrufenden Code hinweisen. Aus diesem Grund kennzeichnet Driver Verifier solche Zuordnungen als mögliche Fehler.
Das System legt automatisch bestimmte Standardereignisobjekte fest, wenn die Anzahl 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 Standardereignisobjekte.
In einer NUMA-Multiprozessorarchitektur (Non-Uniform Memory Access) versucht ExAllocatePoolWithQuotaTag , lokalen Arbeitsspeicher dem Prozessor zuzuweisen, der ExAllocatePoolWithQuotaTag aufruft. Wenn kein lokaler Arbeitsspeicher verfügbar ist, weist ExAllocatePoolWithQuotaTag den nächstgelegenen verfügbaren Arbeitsspeicher zu.
Der von ExAllocatePoolWithQuotaTag zugewiesene Arbeitsspeicher ist nicht initialisiert. Ein Kernelmodustreiber muss diesen Arbeitsspeicher zuerst null, wenn er für Software im Benutzermodus sichtbar macht (um zu vermeiden, dass potenziell privilegierte Inhalte verloren gehen).
Aufrufer von ExAllocatePoolWithQuotaTag müssen unter IRQL <= DISPATCH_LEVEL ausgeführt werden. Ein Aufrufer, der bei DISPATCH_LEVEL ausgeführt wird, muss einen NonPagedXxx-Wert für PoolType angeben. Ein Aufrufer, der mit IRQL <= APC_LEVEL ausgeführt wird, kann einen beliebigen POOL_TYPE Wert angeben, aber auch die IRQL und die Umgebung müssen für die Bestimmung des Pooltyps berücksichtigt werden.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Universell |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (siehe Abschnitt Hinweise) |
DDI-Complianceregeln | HwStorPortProhibitedDDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf) |