Partager via


NDK_FN_BUILD_LAM fonction de rappel (ndkpi.h)

La fonction NdkBuildLam (NDK_FN_BUILD_LAM) obtient un mappage d’adresses logiques (LAM) d’adaptateur à partir du fournisseur NDK pour une région de mémoire pratiquement contiguë.

Syntaxe

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
)
{...}

Paramètres

[in] pNdkAdapter

Pointeur vers un objet adaptateur NDK (NDK_ADAPTER).

[in] Mdl

Une liste de descripteurs mémoire (MDL) ou une chaîne de MDL. La partie de la chaîne MDL entre l’adresse virtuelle de départ et le nombre d’octets dans le paramètre Length doit représenter une région de mémoire pratiquement contiguë.

[in] Length

Nombre d’octets à mapper à partir de l’adresse virtuelle de la première MDL. L’adresse virtuelle MDL peut être obtenue avec la macro MmGetMdlVirtualAddress . La longueur ne doit pas dépasser le nombre total d’octets représentés par la chaîne MDL.

[in] RequestCompletion

Pointeur vers une fonction de rappel NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION).

[in, optional] RequestContext

Valeur de contexte pour le fournisseur à transmettre à la fonction de rappel NdkRequestCompletion spécifiée dans le paramètre RequestCompletion .

pNdkLAM

Pointeur vers une mémoire tampon qui contiendra une structure NDK_LOGICAL_ADDRESS_MAPPING qui contient un tableau de pages d’adaptateur. Le tableau de pages de l’adaptateur est stocké dans le membre AdapterPageArray et le membre AdapterPageCount contient le nombre d’éléments de page de l’adaptateur.

pLAMSize

Taille, en octets, de la mémoire tampon au niveau du paramètre pNdkLAM pour l’entrée, ou le nombre réel d’octets écrits pour la sortie.

[out] pFBO

La première valeur de décalage d’octet (FBO) est retournée à cet emplacement. Le FBO est le décalage de départ dans la première page de l’adaptateur.

Valeur retournée

La fonction NdkBuildLam retourne l’un des codes NTSTATUS suivants.

Code de retour Description
STATUS_SUCCESS
L’opération s’est terminée avec succès.
STATUS_PENDING
La requête est en attente, la fonction spécifiée dans le paramètre RequestCompletion (NDK_FN_REQUEST_COMPLETION) est appelée lorsque l’opération de génération LAM est terminée.
STATUS_INVALID_PARAMETER
La partie de la chaîne MDL de l’adresse virtuelle de départ jusqu’au nombre d’octets spécifié dans le paramètre Length ne représente pas une région de mémoire pratiquement contiguë.
STATUS_INSUFFICIENT_RESOURCES
La demande a échoué en raison de ressources insuffisantes.
Important La requête peut échouer en ligne et de manière asynchrone avec ce code status.
 
STATUS_BUFFER_TOO_SMALL
La taille de la mémoire tampon indiquée par le paramètre *pLAMSize est trop petite pour contenir le LAM. Dans ce cas, la valeur de *pLAMSize est mise à jour avec la taille de mémoire tampon requise.
Autres codes status
Une erreur est survenue.

Remarques

La partie de la chaîne MDL de l’adresse virtuelle de départ jusqu’au nombre d’octets spécifié dans le paramètre Length doit représenter une région de mémoire pratiquement contiguë. Sinon, le fournisseur NDK doit échouer la demande. Il incombe au consommateur NDK de s’assurer que la chaîne MDL est verrouillée. Autrement dit, les pages de la modification MDL sont épinglées dans la mémoire physique.

Important Le consommateur NDK ne doit pas utiliser la chaîne MDL tant que NdkBuildLam est en attente d’achèvement.
 
Un adaptateur accède à la mémoire physique avec des adresses logiques. Cela est similaire à un processeur qui accède à la mémoire physique avec des adresses virtuelles. Si un consommateur NDK utilise des pages de mémoire physique directement en tant que mémoires tampons de données locales dans les demandes d’envoi, de réception, de lecture ou d’écriture, il doit obtenir un mappage d’adresses logiques d’adaptateur NDK auprès du fournisseur NDK et utiliser les adresses logiques plutôt que les adresses physiques. De même, un consommateur NDK doit également utiliser des adresses logiques dans les demandes d’inscription rapide.

Un consommateur NDK peut appeler la fonction NdkGetPrivilegedMemoryRegionToken (NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN) pour obtenir un jeton de région de mémoire privilégiée à partir d’un fournisseur NDK.

Toutes les pages d’adaptateur retournées par un fournisseur NDK doivent avoir une longueur de PAGE_SIZE octets, où PAGE_SIZE est la taille de page mémoire prise en charge par la plateforme hôte, telle que définie dans wdm.h.

Le fournisseur doit traiter la valeur d’adresse virtuelle que la macro MmGetMdlVirtualAddress retourne pour la MDL comme un index au début de la région de mémoire en cours de mappage. Le fournisseur ne doit pas utiliser la valeur d’adresse virtuelle comme adresse virtuelle valide pour la lecture ou l’écriture du contenu de la mémoire tampon.

Si un fournisseur a une erreur lors du traitement d’une requête NdkBuildLam , il doit libérer tous les mappages partiels qu’il a générés en interne jusqu’à présent avant de terminer la demande avec échec.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Aucune prise en charge, prise en charge dans NDIS 6.30 et versions ultérieures.
Serveur minimal pris en charge Windows Server 2012
Plateforme cible Windows
En-tête ndkpi.h (incluez Ndkpi.h)
IRQL <=DISPATCH_LEVEL

Voir aussi

MmGetMdlVirtualAddress

Exigences relatives à la durée de vie des objets 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