Compartir a través de


Función ExAllocatePool2 (wdm.h)

El ExAllocatePool2 rutina asigna memoria de grupo del tipo especificado y devuelve un puntero al bloque asignado.

Sintaxis

DECLSPEC_RESTRICT PVOID ExAllocatePool2(
  POOL_FLAGS Flags,
  SIZE_T     NumberOfBytes,
  ULONG      Tag
);

Parámetros

Flags

Valor de tipo ULONG64 que especifica el tipo de memoria del grupo junto con los atributos obligatorios y opcionales. Se pueden combinar varios valores de marca mediante OR bit a bit. Consulte POOL_FLAGS para obtener los valores posibles.

NumberOfBytes

Especifica un número distinto de cero de bytes que se va a asignar.

Tag

Etiqueta de grupo que se va a usar para la memoria asignada. Especifique la etiqueta de grupo como un literal de carácter distinto de cero de uno a cuatro caracteres delimitados por comillas simples (por ejemplo, Tag1). Normalmente, la cadena se especifica en orden inverso (por ejemplo, 1gaT). Cada carácter ASCII de la etiqueta debe ser un valor del intervalo 0x20 (espacio) para 0x7E (tilde). Cada ruta de acceso de código de asignación debe usar una etiqueta de grupo única para ayudar a los depuradores y comprobadores a identificar la ruta de acceso del código.

Valor devuelto

ExAllocatePool2 devuelve un puntero a la memoria asignada.

Las condiciones siguientes hacen que la función devuelva NULL de forma predeterminada. Si se especifica POOL_FLAG_RAISE_ON_FAILURE, la función genera una excepción.

  • Memoria insuficiente
  • etiqueta se establece en 0 o se especifican POOL_FLAGS no válidos

Observaciones

Si va a compilar un controlador destinado a versiones de Windows anteriores a Windows 10, versión 2004, use ExAllocatePoolZero, ExAllocatePoolUninitialized, ExAllocatePoolQuotaZeroo ExAllocatePoolQuotaUninitialized.

Esta rutina tiene las siguientes diferencias con respecto a las rutinas de asignación anteriores (ExAllocatePoolWithTag, ExAllocatePoolWithQuotaTag, ExAllocatePoolWithTagPriority):

  1. La memoria es cero inicializada a menos que se especifique POOL_FLAG_UNINITIALIZED.

  2. Comportamiento devuelto en caso de asignación incorrecta. exAllocatePoolWithQuotaTag genera una excepción de forma predeterminada.

  3. Las etiquetas con un valor de 0 no son válidas.

Al reemplazar ExAllocatePoolWithQuotaTag por ExAllocatePool2, debe especificar la marca POOL_FLAG_USE_QUOTA. Para obtener más información sobre las marcas de grupo, consulte POOL_FLAGS.

Si NumberOfBytes es PAGE_SIZE o superior, se asigna un búfer alineado con páginas. Las asignaciones de memoria de PAGE_SIZE o menos se asignan dentro de una página y no cruzan los límites de página. Las asignaciones de memoria de menos de PAGE_SIZE no están necesariamente alineadas con páginas, pero se alinean con límites de 8 bytes en sistemas de 32 bits y hasta límites de 16 bytes en sistemas de 64 bits.

Los controladores solo pueden usar hasta el NumberOfBytes han asignado explícitamente. El acceso a la memoria fuera de este intervalo puede dañar el grupo y provocar que el sistema se bloquee.

El sistema asocia la etiqueta de grupo a la memoria asignada. Las herramientas de programación, como WinDbg, pueden mostrar la etiqueta de grupo asociada a cada búfer asignado. Gflags, una herramienta incluida en Herramientas de depuración para Windows, activa una característica del sistema que solicita la asignación de un grupo especial para una etiqueta de grupo determinada. Poolmon, que se incluye en WDK, realiza un seguimiento de la memoria por etiqueta de grupo.

El valor de Tag se almacena y, a veces, se muestra, en orden inverso (little-endian). Por ejemplo, si un autor de la llamada pasa Fred como etiqueta, aparece como derF en un volcado de memoria de grupo y en el seguimiento de uso del grupo en el depurador, y como 0x64657246 en el Registro y en la herramienta se muestra.

El búfer asignado se puede liberar con ExFreePool o ExFreePoolWithTag.

Los autores de llamadas de exAllocatePool2 deben ejecutarse en IRQL <= DISPATCH_LEVEL. Un autor de llamada que se ejecuta en DISPATCH_LEVEL debe especificar POOL_FLAG_NON_PAGED o POOL_FLAG_NON_PAGED_EXECUTABLE para Marcas. Un autor de llamada que se ejecuta en IRQL <= APC_LEVEL puede especificar POOL_FLAG_PAGED, pero si se tendrá acceso a la memoria desde el código que se ejecuta en DISPATCH_LEVEL, debe asignar memoria no paginada.

En una arquitectura de varios procesadores de acceso a memoria no uniforme (NUMA), ExAllocatePool2 intenta asignar memoria local al procesador que llama a ExAllocatePool2. Si no hay memoria local disponible, exAllocatePool2 asigna la memoria disponible más cercana.

La memoria que ExAllocatePool2 asigna es cero inicializada. Los controladores en modo kernel no deben dejar de participar en ceros para las asignaciones que se copiarán en una ubicación que no es de confianza (modo de usuario, a través de la red, etc.) para evitar la divulgación de información confidencial.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 10, versión 2004
de la plataforma de destino de Universal
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL IRQL <= DISPATCH_LEVEL (consulte la sección Comentarios)
reglas de cumplimiento de DDI HwStorPortProhibitedDIs, SpNoWait, StorPortStartIo

Consulte también

ExAllocatePool3