Função NdisInitializeNPagedLookasideList (ndis.h)
A função NdisInitializeNPagedLookasideList inicializa uma lista lookaside. Após uma inicialização bem-sucedida, blocos de tamanho fixo nãopagados podem ser alocados e liberados para a lista lookaside.
Sintaxe
void NdisInitializeNPagedLookasideList(
[in] 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
[in] Lookaside
Um ponteiro para uma estrutura NPAGED_LOOKASIDE_LIST que contém a cabeça da lista lookaside fornecida pelo chamador a ser inicializada. A estrutura deve estar alinhada a 16 bytes em plataformas de 64 bits. O driver deve fornecer um cabeçalho de lista que seja residente, ou seja, no espaço do sistema nãopagado.
[in, optional] Allocate
Um ponto de entrada de função que é NULL ou especifica o ponto de entrada de uma função Allocate fornecida pelo chamador que alocará uma entrada do tamanho especificado no membro tamanho do sempre que for chamado. Se Alocar for NULL, o função NdisAllocateFromNPagedLookasideList aloca posteriormente entradas em nome do chamador. Se o chamador fornecer uma função Allocate, ele também deverá fornecer uma função Free.
[in, optional] Free
Um ponto de entrada de função que é NULL ou especifica o ponto de entrada de uma função Free fornecida pelo chamador que liberará uma entrada do tamanho especificado no membro tamanho do sempre que for chamado. Se Gratuito for NULL, o função NdisFreeToNPagedLookasideList posteriormente libera entradas em nome do chamador.
[in] Flags
Deve ser zero. Esse parâmetro é reservado.
[in] Size
O tamanho, em bytes, de cada entrada a ser alocada posteriormente da lista lookaside.
[in] Tag
Uma marca de pool fornecida pelo chamador para entradas de lista lookaside. O de Marca de é uma cadeia de caracteres de quatro caracteres delimitada por aspas simples (por exemplo, 'derF'). Os caracteres geralmente são especificados em ordem inversa para que sejam mais fáceis de ler ao despejar o pool ou acompanhar o uso do pool no depurador.
[in] Depth
Deve ser zero. Esse parâmetro também é reservado.
Valor de retorno
Nenhum
Observações
NdisInitializeNPagedLookasideList inicializa o cabeçalho da lista fornecida pelo chamador, mas não aloca memória para entradas de lista. As entradas iniciais são alocadas conforme o necessário com chamadas para o função NdisAllocateFromNPagedLookasideList ou pela função de retorno de chamada Allocate fornecida pelo driver no parâmetro Allocate. A lista é preenchida à medida que o driver libera entradas de volta para a lista com o função NdisFreeToNPagedLookasideList. As entradas são coletadas na lista até que um limite determinado pelo sistema, mas dimensionado dinamicamente, seja atingido. Em seguida, todas as entradas excedentes na lista lookaside são retornadas ao pool nãopagado, seja por NdisFreeToNPagedLookasideList ou com chamadas para a função de retorno de chamada Free fornecida pelo driver no parâmetro Free.
Todas as entradas na lista lookaside são do mesmo tamanho, que é especificada no parâmetro Size. Uma lista lookaside é particularmente útil para drivers que devem alocar dinamicamente e áreas de contexto de tamanho fixo livre nas quais manter o estado de tempo de execução sobre suas operações de E/S pendentes. Por exemplo, os drivers NDIS orientados à conexão provavelmente encontrarão listas lookaside particularmente úteis porque esses drivers geralmente mantêm um conjunto dinâmico de áreas de contexto para acompanhar chamadas de saída e entrada.
É mais eficiente para um driver permitir o NdisAllocateFromNPagedLookasideList e funções NdisFreeToNPagedLookasideList para gerenciar a alocação e desalocação de entradas (consulte as funções ExAllocatePoolWithTag e exFreePool). No entanto, um driver que rastreia o estado internamente sobre seu uso de memória pode fornecer alocar e funções de gratuito para NdisInitializeNPagedLookasideList.
Os chamadores de NdisInitializeNPagedLookasideList devem estar em execução no IRQL <= DISPATCH_LEVEL, mas geralmente são executados em PASSIVE_LEVEL.