Função MmMapLockedPagesWithReservedMapping (wdm.h)
A rotina MmMapLockedPagesWithReservedMapping mapeia todo ou parte de um intervalo de endereços que foi previamente reservado pela rotina de MmAllocateMappingAddress.
Sintaxe
PVOID MmMapLockedPagesWithReservedMapping(
[in] PVOID MappingAddress,
[in] ULONG PoolTag,
[in] PMDL MemoryDescriptorList,
[in] __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE CacheType
);
Parâmetros
[in] MappingAddress
Ponteiro para o início do intervalo de memória virtual reservado. Esse deve ser um endereço retornado anteriormente por MmAllocateMappingAddress.
[in] PoolTag
Especifica a marca de pool para o buffer de memória reservado. Isso deve ser idêntico ao valor especificado no parâmetro PoolTag da chamada para MmAllocateMappingAddress que reservaram o buffer.
[in] MemoryDescriptorList
Um ponteiro para o MDL que deve ser mapeado. Este MDL deve descrever páginas físicas bloqueadas. Um MDL bloqueado pode ser criado pelo MmProbeAndLockPages ou rotina de MmAllocatePagesForMdlEx.
[in] CacheType
Especifica o valor MEMORY_CACHING_TYPE a ser usado para criar o mapeamento.
Valor de retorno
MmMapLockedPagesWithReservedMapping retorna um ponteiro para o início da memória mapeada ou NULL se o sistema não puder mapear a memória. Essa rotina retornará NULL somente se houver um erro nos parâmetros de função (por exemplo, o endereço de mapeamento do driver não é grande o suficiente para abranger o MDL fornecido). Essa função destina-se a permitir que os drivers avancem mesmo em cenários de baixo recurso.
Observações
O chamador pode usar MmMapLockedPagesWithReservedMapping para mapear um subconjunto do intervalo de memória virtual reservado MmAllocateMappingAddress da seguinte maneira:
Use IoAllocateMdl para alocar um MDL. O MDL retornado é criado usando o endereço inicial especificado e o tamanho do subconjunto do intervalo de memória virtual a ser mapeado.
Use MmProbeAndLockPages para bloquear as páginas físicas descritas pelo MDL obtidas na etapa 1.
Use MmMapLockedPagesWithReservedMapping para realmente mapear a memória virtual para a memória física que foi bloqueada na etapa 2. Observe que o endereço virtual retornado por essa função inclui o deslocamento de bytes especificado pelo MDL. No entanto, o campo MappedSystemVa do MDL definido por essa função não inclui o deslocamento de bytes.
Depois que o chamador não precisar acessar a memória, ele removerá o vírgula da memória com MmUnmapReservedMapping. O chamador pode mapear e cancelar o mapa do buffer de memória conforme necessário e deve desacompactá-lo antes de liberar o intervalo de mapeamento com MmFreeMappingAddress.
Observe que o parâmetro MappingAddress especifica o início do intervalo de memória previamente reservado pelo chamador, e não o início do subconjunto de memória a ser mapeado. O chamador especifica o endereço inicial e o comprimento do buffer quando ele aloca o MDL com IoAllocateMdl. O buffer deve caber dentro do intervalo de memória reservado, mas pode ser um subconjunto estrito.
A rotina usa o parâmetro CacheType somente se as páginas descritas pelo MDL ainda não tiverem um tipo de cache associado a eles. No entanto, em quase todos os casos, as páginas já têm um tipo de cache associado e esse tipo de cache é usado pelo novo mapeamento. Uma exceção a essa regra é para páginas alocadas por MmAllocatePagesForMdl, que não têm um tipo de cache específico associado a elas. Para essas páginas, o parâmetro CacheType determina o tipo de cache do mapeamento.