Freigeben über


ExAllocatePool-Makro (classpnp.h)

Die ExAllocatePool-Routine ist veraltet und wird nur für vorhandene Binärdateien exportiert. Verwenden Sie stattdessen ExAllocatePoolWithTag .

ExAllocatePool ordnet Poolspeicher des angegebenen Typs zu und gibt einen Zeiger auf den zugeordneten Block zurück.

Syntax

PVOID ExAllocatePool(
  _In_ POOL_TYPE a,
  _In_ SIZE_T b
);

Parameter

a

Typ des zuzuordnenden Poolarbeitsspeichers. Eine Beschreibung der verfügbaren Speichertypen des Pools finden Sie unter POOL_TYPE.

Sie können einen (PoolType) ändern, indem Sie ein bitweises OR mit dem POOL_COLD_ALLOCATION-Flag als Hinweis an 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 POOL_COLD_ALLOCATION-Flag ist nur eine Empfehlung und für Windows XP und höhere Versionen des Windows-Betriebssystems verfügbar.

b

Anzahl der zuzuordnenden Bytes.

Rückgabewert

Keine

Bemerkungen

Diese Routine wird für die allgemeine Poolbelegung von Arbeitsspeicher verwendet.

Wenn b (NumberOfBytes) PAGE_SIZE oder größer ist, wird ein seitenorientierter Puffer zugeordnet. Speicherbelegungen von PAGE_SIZE oder weniger überschreiten keine Seitengrenzen. Speicherbelegungen von weniger als PAGE_SIZE sind nicht notwendigerweise seitenbündig ausgerichtet, sondern an 8-Byte-Grenzen in 32-Bit-Systemen und an 16-Byte-Grenzen in 64-Bit-Systemen ausgerichtet.

Eine erfolgreiche Zuordnung, die numberOfBytes< PAGE_SIZE des nicht auslagerungsfreien Pools anfordert, gibt dem Aufrufer genau die Anzahl der angeforderten Bytes Arbeitsspeicher. Wenn eine Zuordnungsanforderung für NumberOfBytes> PAGE_SIZE erfolgreich ist und NumberOfBytes kein exaktes Vielfaches von PAGE_SIZE ist, enthält die letzte Seite in der Zuordnung Bytes, die nicht Teil der Zuordnung des Aufrufers sind. Wenn möglich, verwendet die Poolzuweisung diese Bytes. Um zu vermeiden, dass Daten beschädigt werden, die zu anderen Kernelmoduskomponenten gehören, müssen Treiber nur auf Speicheradressen zugreifen, die sie explizit zugewiesen haben.

Wenn ExAllocatePoolNULL zurückgibt, sollte der Aufrufer den NTSTATUS-Wert STATUS_INSUFFICIENT_RESOURCES zurückgeben oder die Verarbeitung auf einen anderen Zeitpunkt verzögern.

Aufrufer von ExAllocatePool 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 unter IRQL <= APC_LEVEL ausgeführt wird, kann einen beliebigen POOL_TYPE-Wert angeben, aber auch die IRQL und die Umgebung müssen bei der Bestimmung des Seitentyps berücksichtigt werden.

Hinweis

Legen Sie NumberOfBytes = 0 nicht fest. Vermeiden Sie Zuweisungen der Länge Null, da sie Speicherplatz für Den 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 Poolmenge (ausgelagert oder nicht ausgelagert) hoch oder niedrig ist. Treiber können darauf warten, dass diese Ereignisse ihre Poolnutzung optimieren. Weitere Informationen finden Sie unter Standardereignisobjekte.

Hinweis

Der von ExAllocatePool zugeordnete Arbeitsspeicher wird nicht initialisiert. Ein Kernelmodustreiber muss diesen Arbeitsspeicher zuerst null, wenn er für Software im Benutzermodus sichtbar wird (um zu verhindern, dass potenziell privilegierte Inhalte verloren gehen).

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Veraltet. Diese Routine wird nur für vorhandene Binärdateien exportiert. Verwenden Sie stattdessen ExAllocatePoolWithTag.
Zielplattform Universell
Header classpnp.h (include Wdm.h, Ntddk.h, Ntifs.h, Classpnp.h, Smcnt.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (siehe Abschnitt "Hinweise")
DDI-Complianceregeln CheckDeviceObjectFlags(wdm), HwStorPortProhibitedDIs(storport), IrqlExAllocatePool(wdm), PowerDownAllocate(wdm), PowerUpFail(wdm), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf), UnsafeAllocatePool(wdm)

Weitere Informationen

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE