Función ExInitializeNPagedLookasideList (wdm.h)
La rutina ExInitializeNPagedLookasideList inicializa una lista de lookaside para entradas no paginadas del tamaño especificado.
Sintaxis
void ExInitializeNPagedLookasideList(
[out] PNPAGED_LOOKASIDE_LIST Lookaside,
[in, optional] PALLOCATE_FUNCTION Allocate,
[in, optional] PFREE_FUNCTION Free,
[in] ULONG Flags,
[in] SIZE_T Size,
[in] ULONG Tag,
[in] USHORT Depth
);
Parámetros
[out] Lookaside
Puntero a la estructura NPAGED_LOOKASIDE_LIST que se va a inicializar. El autor de la llamada debe usar espacio del sistema no paginado para la estructura. En las plataformas de 64 bits, esta estructura debe estar alineada con 16 bytes.
[in, optional] Allocate
Puntero a una función proporcionada por el autor de la llamada para asignar una entrada cuando la lista de lookaside está vacía o a NULL. Si no es NULL, el puntero es a una función con el prototipo:
PVOID XxxAllocate(
__in POOL_TYPE PoolType, // NonPagedPool
__in SIZE_T NumberOfBytes, // value of Size
__in ULONG Tag // value of Tag
);
Si el parámetro Allocate es NULL, las llamadas posteriores a ExAllocateFromNPagedLookasideList asignan automáticamente entradas cada vez que la lista de búsqueda está vacía.
[in, optional] Free
Puntero a una función proporcionada por el autor de la llamada para liberar una entrada cada vez que la lista de lookaside está llena o en NULL. Si no es NULL, el puntero es a una función con el prototipo:
VOID XxxFree(
__in PVOID Buffer
);
Si el parámetro Free es NULL, las llamadas posteriores a ExFreeToNPagedLookasideList liberan automáticamente la entrada especificada en un grupo no paginado cada vez que la lista está llena, es decir, manteniendo actualmente el número máximo de entradas determinado por el sistema.
[in] Flags
A partir de Windows 8, este parámetro especifica un valor de marca opcional para modificar el comportamiento predeterminado de la rutina ExInitializeNPagedLookasideList. Los bits de marca compatibles incluyen lo siguiente.
Bit de marca | Significado | Valor |
---|---|---|
POOL_RAISE_IF_ALLOCATION_FAILURE | Si se produce un error en la asignación, genere una excepción. | 16 |
POOL_NX_ALLOCATION | Asigne memoria no ejecutable. | 512 |
Antes de Windows 8, este parámetro no se usa y debe ser cero.
[in] Size
Especifica el tamaño, en bytes, para cada entrada no paginada que se va a asignar posteriormente. Este parámetro no debe ser menor que el tamaño mínimo necesario, LOOKASIDE_MINIMUM_BLOCK_SIZE, que se define en el archivo de encabezado Wdm.h.
[in] Tag
Especifica la etiqueta de grupo que se va a usar al asignar entradas de lista de lookaside. Para obtener más información sobre las etiquetas de grupo, consulte el parámetro Tag de ExAllocatePoolWithTag.
[in] Depth
Reservado. Debe ser cero.
Valor devuelto
None
Observaciones
Después de llamar a ExInitializeNPagedLookasideList, los bloques de memoria del tamaño especificado por el autor de la llamada se pueden asignar y liberar a la lista de búsqueda con llamadas a ExAllocateFromNPagedLookasideList y ExFreeToNPagedLookasideList, respectivamente. Estas entradas asignadas y liberados dinámicamente pueden ser cualquier estructura de datos o búfer de tamaño fijo que use el autor de la llamada mientras se ejecuta el sistema, especialmente si el autor de la llamada no puede predeterminar cuántas entradas de este tipo se usarán en un momento dado. El diseño y el contenido de cada entrada de tamaño fijo están determinados por el autor de la llamada.
ExInitializeNPagedLookasideList inicializa el estado del sistema para realizar un seguimiento del uso de la lista de apariencias dadas, como se indica a continuación:
Inicializa cero los contadores que se van a mantener para las entradas.
Almacena los puntos de entrada de las rutinas XxxAllocate y XxxFree proporcionadas por el autor de la llamada, si las hay, o establece estos puntos de entrada en ExAllocatePoolWithTag y ExFreePool, respectivamente.
Inicializa un bloqueo de número del sistema para controlar las asignaciones de y libera a la lista de búsqueda de una manera segura para varios procesadores si es necesario.
Almacena el tamaño y la etiqueta de lista proporcionados por el autor de la llamada.
Configura los límites determinados por el sistema (mínimo y máximo) en el número de entradas que se van a mantener en la lista de búsqueda, que se pueden ajustar posteriormente si la demanda de entradas en todo el sistema es mayor o inferior a lo previsto.
Configura las marcas determinadas por el sistema, que controlan el tipo de memoria desde la que se asignarán las entradas posteriormente.
El sistema mantiene un conjunto de todas las listas de búsqueda actualmente en uso. Dado que la demanda de entradas de lista de lookaside y en la memoria no paginada disponible varía mientras se ejecuta el sistema, el sistema ajusta sus límites para el número de entradas que se van a mantener dinámicamente en cada lista de búsqueda no paginada.
Los controladores siempre deben liberar explícitamente las listas de búsqueda que creen antes de descargarse. De lo contrario, es un error de programación grave. Use ExDeleteNPagedLookasideList para liberar la lista.
ExInitializeNPagedLookasideList configura el encabezado de lista opaco en la ubicación proporcionada por el autor de la llamada, pero no asigna previamente memoria para las entradas de lista. Posteriormente, las entradas iniciales se asignan dinámicamente a medida que se producen llamadas a ExAllocateFromNPagedLookasideList y estas entradas iniciales se mantienen en la lista lookaside como llamadas recíprocas a ExFreeToNPagedLookasideList . Las entradas se recopilan en la lista de apariencias dadas hasta que se alcanza el máximo determinado por el sistema, donde se devuelven las entradas adicionales al grupo no paginado a medida que se liberan. Si la lista deja de estar vacía, la función XxxAllocate especificada en la inicialización de lista o exAllocatePoolWithTag satisface las solicitudes.
Es más eficaz pasar punteros NULL para los parámetros Allocate y Free de ExInitializeNPagedLookasideList cada vez que el usuario de una lista de lookaside no hace nada más que asignar y liberar entradas de tamaño fijo. Sin embargo, cualquier componente que use una lista de lookaside puede proporcionar estas funciones para realizar un procesamiento adicional determinado por el autor de la llamada, como el seguimiento de su propio uso de memoria dinámica manteniendo el estado sobre el número de entradas que asigna y libera.
Si el autor de la llamada de ExInitializeNPagedLookasideList proporciona una función XxxAllocate , esa rutina debe asignar entradas para la lista de búsqueda mediante los parámetros de entrada especificados cuando llama a ExAllocatePoolWithTag.
A partir de Windows Vista, una rutina similar, ExInitializeLookasideListEx, inicializa una lista de aspecto que se describe mediante una estructura de LOOKASIDE_LIST_EX . A diferencia de las rutinas XxxAllocate y XxxFree para una lista de búsqueda que usa una estructura de NPAGED_LOOKASIDE_LIST , las rutinas de asignación y desasignación de una lista de búsqueda que usa la estructura LOOKASIDE_LIST_EX reciben un puntero de contexto como parámetro de entrada. Estas rutinas pueden usar este contexto para almacenar datos privados para la lista de búsqueda. Si el controlador está pensado para ejecutarse solo en Windows Vista y versiones posteriores de Windows, considere la posibilidad de usar ExInitializeLookasideList en lugar de ExInitializeNPagedLookasideList. Para obtener más información, consulte Uso de lookaside Listas.
Los autores de llamadas de ExInitializeNPagedLookasideList se pueden ejecutar en IRQL <= DISPATCH_LEVEL, pero normalmente se ejecutan en IRQL = PASSIVE_LEVEL.
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 | IRQL <= DISPATCH_LEVEL (consulte la sección Comentarios) |
Consulte también
ExAllocateFromNPagedLookasideList