ExAllocatePoolWithQuota-Makro (classpnp.h)
Die ExAllocatePoolWithQuota Routine ist veralteteund wird nur für vorhandene Treiberbinärdateien exportiert. Verwenden Sie stattdessen ExAllocatePoolWithQuotaTag-.
ExAllocatePoolWithQuota ordnet Poolspeicher zu, ladekontingent für den aktuellen Prozess.
Syntax
PVOID ExAllocatePoolWithQuota(
_In_ POOL_TYPE a,
_In_ SIZE_T b
);
Parameter
a
Gibt den Typ des zuzuweisenden Poolspeichers an. Eine Beschreibung der verfügbaren Poolspeichertypen finden Sie unter POOL_TYPE.
Sie können einer (PoolType) ändern, indem Sie ein bitweises ODER mit dem POOL_COLD_ALLOCATION-Flag als Hinweis auf den Kernel verwenden, 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 flag POOL_COLD_ALLOCATION ist nur empfehlungsspezifisch und steht für Windows XP und höhere Versionen des Windows-Betriebssystems zur Verfügung.
b
Gibt die Anzahl der zuzuordnenden Bytes an.
Rückgabewert
Nichts
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 b (NumberOfBytes) PAGE_SIZE oder höher ist, wird ein seitenbündiges Puffer zugewiesen. Kontingent ist nicht für die Zuordnung von PAGE_SIZE oder höher in Rechnung gestellt.
Speicherzuweisungen von weniger als PAGE_SIZE werden innerhalb einer Seite zugewiesen und überschreiten keine Seitengrenzen. Speicherzuordnungen von PAGE_SIZE oder weniger werden nicht notwendigerweise seitenbündig ausgerichtet, sondern in 32-Bit-Systemen und 16-Byte-Begrenzungen in 64-Bit-Systemen ausgerichtet.
Anmerkung
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.
Anmerkung
Speicher, der ExAllocatePoolWithQuota zugeordnet wird, wird 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 ExAllocatePoolWithQuota 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 |
---|---|
mindestens unterstützte Client- | Obsolet. Diese Routine wird nur für vorhandene Treiberbinärdateien exportiert. Verwenden Sie stattdessen ExAllocatePoolWithQuotaTag. |
Zielplattform- | Universal |
Header- | classpnp.h (include Wdm.h, Ntddk.h, Ntifs.h, Classpnp.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | <= DISPATCH_LEVEL (siehe Abschnitt "Hinweise") |
DDI-Complianceregeln | HwStorPortProhibitedDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf) |