MmMapLockedPagesWithReservedMapping, fonction (wdm.h)
La routine MmMapLockedPagesWithReservedMapping mappe toutes ou une partie d’une plage d’adresses précédemment réservée par la routine MmAllocateMappingAddress.
PVOID MmMapLockedPagesWithReservedMapping(
[in] PVOID MappingAddress,
[in] ULONG PoolTag,
[in] PMDL MemoryDescriptorList,
[in] __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE CacheType
);
[in] MappingAddress
Pointeur vers le début de la plage de mémoire virtuelle réservée. Il doit s’agir d’une adresse précédemment retournée par MmAllocateMappingAddress.
[in] PoolTag
Spécifie la balise de pool pour la mémoire tampon réservée. Cela doit être identique à la valeur spécifiée dans le paramètre PoolTag de l’appel à MmAllocateMappingAddress qui a réservé la mémoire tampon.
[in] MemoryDescriptorList
Pointeur vers le MDL à mapper. Ce MDL doit décrire les pages physiques verrouillées. Un MDL verrouillé peut être généré par la routine MmProbeAndLockPages ou MmAllocatePagesForMdlEx.
[in] CacheType
Spécifie la valeur MEMORY_CACHING_TYPE à utiliser pour créer le mappage.
MmMapLockedPagesWithReservedMapping retourne un pointeur vers le début de la mémoire mappée, ou NULL si le système n’a pas pu mapper la mémoire. Cette routine retourne null uniquement s’il existe une erreur dans les paramètres de fonction (par exemple, l’adresse de mappage du pilote n’est pas suffisamment grande pour couvrir le MDL fourni). Cette fonction est destinée à permettre aux pilotes de progresser même dans les scénarios de faible ressource.
L’appelant peut utiliser MmMapLockedPagesWithReservedMapping pour mapper une sous-plage de la plage de mémoire virtuelle réservée par MmAllocateMappingAddress comme suit :
Utilisez IoAllocateMdl pour allouer un MDL. Le MDL retourné est généré à l’aide de l’adresse de départ et de la taille spécifiées de la sous-plage de mémoire virtuelle à mapper.
Utilisez MmProbeAndLockPages pour verrouiller les pages physiques décrites par le MDL obtenu à l’étape 1.
Utilisez MmMapLockedPagesWithReservedMapping pour mapper réellement la mémoire virtuelle à la mémoire physique verrouillée à l’étape 2. Notez que l’adresse virtuelle retournée par cette fonction inclut le décalage d’octet spécifié par le MDL. Toutefois, le champ MapSystemVa du MDL défini par cette fonction n’inclut pas le décalage d’octet.
Une fois que l’appelant n’a pas besoin d’accéder à la mémoire, il annule le mappage de la mémoire avec MmUnmapReservedMapping. L’appelant peut mapper et annuler le mappage de la mémoire tampon en fonction des besoins, et doit le mapper avant de libérer la plage de mappage avec MmFreeMappingAddress.
Notez que le paramètre MappingAddress spécifie le début de la plage de mémoire précédemment réservée par l’appelant, et non le début de la sous-plage de mémoire à mapper. L’appelant spécifie l’adresse de départ et la longueur de la mémoire tampon lorsqu’il alloue le MDL avec IoAllocateMdl. La mémoire tampon doit s’adapter à la plage de mémoire réservée, mais il peut s’agir d’un sous-ensemble strict.
La routine utilise le paramètre CacheType uniquement si les pages décrites par mdL n’ont pas encore de type de cache associé. Toutefois, dans presque tous les cas, les pages ont déjà un type de cache associé, et ce type de cache est utilisé par le nouveau mappage. Une exception à cette règle concerne les pages qui sont allouées par MmAllocatePagesForMdl, qui n’ont pas de type de cache spécifique associé. Pour ces pages, le paramètre CacheType détermine le type de cache du mappage.