NDK_FN_BUILD_LAM función de devolución de llamada (ndkpi.h)

La función NdkBuildLam (NDK_FN_BUILD_LAM) obtiene una asignación de direcciones lógicas (LAM) del adaptador del proveedor NDK para una región de memoria prácticamente contigua.

Sintaxis

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

Puntero a un objeto de adaptador NDK (NDK_ADAPTER).

[in] Mdl

Lista de descriptores de memoria (MDL) o cadena de MDL. La parte de la cadena MDL desde la dirección virtual inicial hasta el número de bytes del parámetro Length debe representar una región de memoria virtualmente contigua.

[in] Length

Número de bytes que se van a asignar a partir de la primera dirección virtual de MDL. La dirección virtual MDL se puede obtener con la macro MmGetMdlVirtualAddress . La longitud no debe superar el número total de bytes representados por la cadena MDL.

[in] RequestCompletion

Puntero a una función de devolución de llamada NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION).

[in, optional] RequestContext

Valor de contexto para que el proveedor vuelva a la función de devolución de llamada NdkRequestCompletion especificada en el parámetro RequestCompletion .

pNdkLAM

Puntero a un búfer que contendrá una estructura de NDK_LOGICAL_ADDRESS_MAPPING que contiene una matriz de páginas del adaptador. La matriz de páginas del adaptador se almacena en el miembro AdapterPageArray y el miembro AdapterPageCount contiene el número de elementos de página del adaptador.

pLAMSize

Tamaño, en bytes, del búfer en el parámetro pNdkLAM para la entrada o el número real de bytes escritos para la salida.

[out] pFBO

El primer valor de desplazamiento de bytes (FBO) se devuelve en esta ubicación. FBO es el desplazamiento inicial dentro de la primera página del adaptador.

Valor devuelto

La función NdkBuildLam devuelve uno de los siguientes códigos NTSTATUS.

Código devuelto Descripción
STATUS_SUCCESS
La operación se ha completado correctamente.
STATUS_PENDING
La solicitud está pendiente, se llamará a la función especificada en el parámetro RequestCompletion (NDK_FN_REQUEST_COMPLETION) cuando se complete la operación de compilación de LAM.
STATUS_INVALID_PARAMETER
La parte de la cadena MDL desde la dirección virtual inicial hasta el número de bytes especificados en el parámetro Length no representa una región de memoria prácticamente contigua.
STATUS_INSUFFICIENT_RESOURCES
Error en la solicitud debido a recursos insuficientes.
Importante La solicitud puede producir un error en línea, así como de forma asincrónica con este código de estado.
 
STATUS_BUFFER_TOO_SMALL
El tamaño del búfer indicado por el parámetro *pLAMSize es demasiado pequeño para contener el LAM. En este caso, el valor de *pLAMSize se actualiza con el tamaño de búfer necesario.
Otros códigos de estado
Se produjo un error.

Comentarios

La parte de la cadena MDL desde la dirección virtual inicial hasta el número de bytes especificados en el parámetro Length debe representar una región de memoria prácticamente contigua. De lo contrario, el proveedor NDK debe producir un error en la solicitud. Es responsabilidad del consumidor de NDK asegurarse de que la cadena MDL está bloqueada. Es decir, las páginas del cambio de MDL se anclan en memoria física.

Importante El consumidor de NDK no debe usar la cadena MDL mientras NdkBuildLam está pendiente de finalización.
 
Un adaptador accede a la memoria física con direcciones lógicas. Esto es similar a una CPU que accede a la memoria física con direcciones virtuales. Si un consumidor de NDK usará páginas de memoria física directamente como búferes de datos locales en solicitudes de envío, recepción, lectura o escritura, debe obtener una asignación de direcciones lógicas del adaptador NDK del proveedor NDK y usar las direcciones lógicas en lugar de direcciones físicas. De forma similar, un consumidor de NDK también debe usar direcciones lógicas en solicitudes de registro rápido.

Un consumidor de NDK puede llamar a la función NdkGetPrivilegedMemoryRegionToken (NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN) para obtener un token de región de memoria con privilegios de un proveedor NDK.

Todas las páginas del adaptador devueltas por un proveedor de NDK deben tener PAGE_SIZE bytes de longitud, donde PAGE_SIZE es el tamaño de página de memoria compatible con la plataforma host tal como se define en wdm.h.

El proveedor debe tratar el valor de dirección virtual que devuelve la macro MmGetMdlVirtualAddress para MDL como un índice al inicio de la región de memoria que se asigna. El proveedor no debe usar el valor de dirección virtual como una dirección virtual válida para leer o escribir contenido del búfer.

Si un proveedor tiene un error al procesar una solicitud NdkBuildLam , el proveedor debe liberar las asignaciones parciales compiladas internamente hasta ahora antes de completar la solicitud con error.

Requisitos

Requisito Value
Cliente mínimo compatible Ninguno compatible, compatible con NDIS 6.30 y versiones posteriores.
Servidor mínimo compatible Windows Server 2012
Plataforma de destino Windows
Encabezado ndkpi.h (incluya Ndkpi.h)
IRQL <=DISPATCH_LEVEL

Consulte también

MmGetMdlVirtualAddress

Requisitos de duración del 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