Función ExAllocatePoolWithQuotaTag (wdm.h)
La rutina ExAllocatePoolWithQuotaTag asigna memoria del grupo, cargando la cuota en el proceso actual.
Advertencia
ExAllocatePoolWithQuotaTag ha quedado en desuso en Windows 10, versión 2004 y se ha reemplazado por ExAllocatePool2. Para obtener más información, consulte Actualización de llamadas exAllocatePool en desuso a ExAllocatePool2 y ExAllocatePool3.
Sintaxis
PVOID ExAllocatePoolWithQuotaTag(
[in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes,
[in] ULONG Tag
);
Parámetros
[in] PoolType
Especifica el tipo de memoria del grupo que se va a asignar. Para obtener una descripción de los tipos de memoria del grupo disponibles, consulte POOL_TYPE.
Puede modificar el valor PoolType mediante ORing bit a bit con la marca POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. Esta marca hace que la rutina devuelva un valor NULL si no se puede satisfacer la solicitud.
Del mismo modo, puede modificar el valor PoolType mediante ORing bit a bit con la marca POOL_COLD_ALLOCATION como una sugerencia al kernel para asignar la memoria de las páginas que probablemente se van a paginar rápidamente. Para reducir la cantidad de memoria del grupo residente tanto como sea posible, no debe hacer referencia a estas asignaciones con frecuencia. La marca de POOL_COLD_ALLOCATION solo es de aviso y se admite en Windows XP y versiones posteriores del sistema operativo Windows.
[in] NumberOfBytes
Especifica el número de bytes para asignar.
[in] Tag
Especifica la etiqueta de grupo para la memoria asignada. Para obtener más información, vea el parámetro Tag de ExAllocatePoolWithTag.
Valor devuelto
ExAllocatePoolWithQuotaTag devuelve un puntero al grupo asignado.
Si no se puede satisfacer la solicitud, ExAllocatePoolWithQuotaTag genera una excepción a menos que se especifique POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. El uso de POOL_QUOTA_FAIL_INSTEAD_OF_RAISE se prefiere por motivos de rendimiento.
Comentarios
Los controladores de nivel superior llaman a esta rutina que asignan memoria para satisfacer una solicitud en el contexto del proceso que originalmente realizó la solicitud de E/S. Los controladores de nivel inferior llaman a ExAllocatePoolWithTag en su lugar.
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 la página. Las asignaciones de memoria de menos de PAGE_SIZE no están necesariamente alineadas con páginas, pero están alineadas con límites de 8 bytes en sistemas de 32 bits y en límites de 16 bytes en sistemas de 64 bits.
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. El valor de Tag se muestra normalmente en orden invertido. Por ejemplo, si un autor de la llamada pasa "Fred" como etiqueta, aparecerá como "derF" si el grupo se volca o cuando se realiza el seguimiento del uso del grupo en el depurador.
El búfer asignado se puede liberar con ExFreePool o ExFreePoolWithTag.
No establezca NumberOfBytes = 0. Evite las asignaciones de longitud cero porque desperdician el espacio de encabezado del grupo y, en muchos casos, indican un posible problema de validación en el código de llamada. Por este motivo, el Comprobador de controladores marca tales asignaciones como posibles errores.
El sistema establece automáticamente determinados objetos de evento estándar cuando la cantidad de grupo (paginada o no paginada) es alta o baja. Los controladores pueden esperar a que estos eventos ajusten el uso del grupo. Para obtener más información, vea Objetos de eventos estándar.
En una arquitectura de varios procesadores de acceso a memoria no uniforme (NUMA), ExAllocatePoolWithQuotaTag intenta asignar memoria local al procesador que llama a ExAllocatePoolWithQuotaTag. Si no hay memoria local disponible, ExAllocatePoolWithQuotaTag asigna la memoria disponible más cercana.
La memoria que asigna ExAllocatePoolWithQuotaTag no está inicializada. Un controlador en modo kernel primero debe cero esta memoria si va a hacer que sea visible para el software en modo de usuario (para evitar la pérdida de contenido potencialmente con privilegios).
Los autores de llamadas de ExAllocatePoolWithQuotaTag deben ejecutarse en IRQL <= DISPATCH_LEVEL. Un llamador que se ejecuta en DISPATCH_LEVEL debe especificar un valor NonPagedXxx para PoolType. Un autor de la llamada que se ejecuta en IRQL <= APC_LEVEL puede especificar cualquier valor de POOL_TYPE , pero también se debe tener en cuenta el irQL y el entorno para determinar el tipo de grupo.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Encabezado | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
Archivo DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (consulte la sección Comentarios) |
Reglas de cumplimiento de DDI | HwStorPortProhibitedDDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf) |