Compartir a través de


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

ExAllocatePoolWithTag

ExDeleteNPagedLookasideList

ExFreePool

ExFreeToNPagedLookasideList

ExInitializeLookasideListEx

ExInitializePagedLookasideList

LOOKASIDE_LIST_EX

NPAGED_LOOKASIDE_LIST