Compartilhar via


NDK_FN_BUILD_LAM função de retorno de chamada (ndkpi.h)

A função NdkBuildLam (NDK_FN_BUILD_LAM) obtém um LAM (mapeamento de endereço lógico) do adaptador do provedor NDK para uma região de memória virtualmente contígua.

Sintaxe

NDK_FN_BUILD_LAM NdkFnBuildLam;

NTSTATUS NdkFnBuildLam(
  [in]           NDK_ADAPTER *pNdkAdapter,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext,
                 NDK_LOGICAL_ADDRESS_MAPPING *pNdkLAM,
                 ULONG *pLAMSize,
  [out]          ULONG *pFBO
)
{...}

Parâmetros

[in] pNdkAdapter

Um ponteiro para um objeto de adaptador NDK (NDK_ADAPTER).

[in] Mdl

Uma MDL (lista de descritores de memória) ou uma cadeia de MDLs. A parte da cadeia de MDL do endereço virtual inicial até o número de bytes no parâmetro Length deve representar uma região de memória virtualmente contígua.

[in] Length

O número de bytes a serem mapeados a partir do endereço virtual do primeiro MDL. O endereço virtual MDL pode ser obtido com a macro MmGetMdlVirtualAddress . O comprimento não deve exceder o número total de bytes representados pela cadeia de MDL.

[in] RequestCompletion

Um ponteiro para uma função de retorno de chamada NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION).

[in, optional] RequestContext

Um valor de contexto para o provedor passar de volta para a função de retorno de chamada NdkRequestCompletion especificada no parâmetro RequestCompletion .

pNdkLAM

Um ponteiro para um buffer que conterá uma estrutura NDK_LOGICAL_ADDRESS_MAPPING que contém uma matriz de página do adaptador. A matriz de páginas do adaptador é armazenada no membro AdapterPageArray e o membro AdapterPageCount contém o número de elementos de página do adaptador.

pLAMSize

O tamanho, em bytes, do buffer no parâmetro pNdkLAM para entrada ou o número real de bytes gravados para saída.

[out] pFBO

O primeiro valor de deslocamento de bytes (FBO) é retornado nesse local. O FBO é o deslocamento inicial na primeira página do adaptador.

Retornar valor

A função NdkBuildLam retorna um dos seguintes códigos NTSTATUS.

Código de retorno Descrição
STATUS_SUCCESS
A operação foi concluída com sucesso.
STATUS_PENDING
A solicitação está pendente, a função especificada no parâmetro RequestCompletion (NDK_FN_REQUEST_COMPLETION) será chamada quando a operação de build lam for concluída.
STATUS_INVALID_PARAMETER
A parte da cadeia de MDL do endereço virtual inicial até o número de bytes especificado no parâmetro Length não representa uma região de memória virtualmente contígua.
STATUS_INSUFFICIENT_RESOURCES
A solicitação falhou devido a recursos insuficientes.
Importante A solicitação pode falhar embutida, bem como de forma assíncrona com esse código status.
 
STATUS_BUFFER_TOO_SMALL
O tamanho do buffer indicado pelo parâmetro *pLAMSize é muito pequeno para manter o LAM. Nesse caso, o valor de *pLAMSize é atualizado com o tamanho do buffer necessário.
Outros códigos de status
Ocorreu um erro.

Comentários

A parte da cadeia de MDL do endereço virtual inicial até o número de bytes especificado no parâmetro Length deve representar uma região de memória virtualmente contígua. Caso contrário, o provedor NDK deverá falhar na solicitação. É responsabilidade do consumidor do NDK garantir que a cadeia de MDL esteja bloqueada. Ou seja, as páginas da alteração de MDL são fixadas na memória física.

Importante O consumidor do NDK não deve usar a cadeia de MDL enquanto NdkBuildLam estiver pendente de conclusão.
 
Um adaptador acessa a memória física com endereços lógicos. Isso é semelhante a uma CPU que acessa a memória física com endereços virtuais. Se um consumidor do NDK usar páginas de memória física diretamente como buffers de dados locais em solicitações de envio, recebimento, leitura ou gravação, ele deverá obter um mapeamento de endereço lógico do adaptador NDK do provedor NDK e usar os endereços lógicos em vez de endereços físicos. Da mesma forma, um consumidor do NDK também deve usar endereços lógicos em solicitações de registro rápido.

Um consumidor do NDK pode chamar a função NdkGetPrivilegedMemoryRegionToken (NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN) para obter um token de região de memória privilegiada de um provedor NDK.

Todas as páginas do adaptador retornadas por um provedor NDK devem ter PAGE_SIZE bytes de comprimento, em que PAGE_SIZE é o tamanho da página de memória compatível com a plataforma host, conforme definido em wdm.h.

O provedor deve tratar o valor do endereço virtual que a macro MmGetMdlVirtualAddress retorna para o MDL como um índice até o início da região de memória que está sendo mapeada. O provedor não deve usar o valor de endereço virtual como um endereço virtual válido para ler ou gravar conteúdos de buffer.

Se um provedor tiver um erro ao processar uma solicitação NdkBuildLam , o provedor deverá liberar todos os mapeamentos parciais criados internamente até agora antes de concluir a solicitação com falha.

Requisitos

Requisito Valor
Cliente mínimo com suporte Nenhum com suporte, com suporte no NDIS 6.30 e posterior.
Servidor mínimo com suporte Windows Server 2012
Plataforma de Destino Windows
Cabeçalho ndkpi.h (inclua Ndkpi.h)
IRQL <=DISPATCH_LEVEL

Confira também

MmGetMdlVirtualAddress

Requisitos de tempo de vida do objeto NDKPI

NDK_ADAPTER

NDK_ADAPTER_DISPATCH

NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN

NDK_FN_RELEASE_LAM

NDK_FN_REQUEST_COMPLETION

NDK_LOGICAL_ADDRESS_MAPPING