Funzione MmMapLockedPagesWithReservedMapping (wdm.h)
La routine MmMapLockedPagesWithReservedMapping esegue il mapping di tutti o parte di un intervallo di indirizzi precedentemente riservato dalla routine MmAllocateMappingAddress.
Sintassi
PVOID MmMapLockedPagesWithReservedMapping(
[in] PVOID MappingAddress,
[in] ULONG PoolTag,
[in] PMDL MemoryDescriptorList,
[in] __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE CacheType
);
Parametri
[in] MappingAddress
Puntatore all'inizio dell'intervallo di memoria virtuale riservato. Deve essere un indirizzo restituito in precedenza da MmAllocateMappingAddress.
[in] PoolTag
Specifica il tag del pool per il buffer di memoria riservato. Deve essere identico al valore specificato nel parametro PoolTag della chiamata a MmAllocateMappingAddress che ha riservato il buffer.
[in] MemoryDescriptorList
Puntatore al file MDL di cui eseguire il mapping. Questo file MDL deve descrivere le pagine fisiche bloccate. Un MDL bloccato può essere compilato dalla routine MmProbeAndLockPages o MmAllocatePagesForMdlEx.
[in] CacheType
Specifica il valore MEMORY_CACHING_TYPE da utilizzare per creare il mapping.
Valore restituito
MmMapLockedPagesWithReservedMapping restituisce un puntatore all'inizio della memoria mappata oppure NULL se il sistema non è riuscito a eseguire il mapping della memoria. Questa routine restituisce NULL solo se si verifica un errore nei parametri della funzione ( ad esempio, l'indirizzo di mapping del driver non è sufficientemente grande da estendersi all'MDL fornito). Questa funzione è progettata per consentire ai driver di avanzare in avanti anche in scenari con risorse basse.
Osservazioni
Il chiamante può usare MmMapLockedPagesWithReservedMapping per eseguire il mapping di un intervallo secondario dell'intervallo di memoria virtuale riservato da MmAllocateMappingAddress come indicato di seguito:
Usare IoAllocateMdl per allocare un MDL. Il file MDL restituito viene compilato usando l'indirizzo iniziale e le dimensioni specificati dell'intervallo di memoria virtuale da mappare.
Usare mmProbeAndLockPages per bloccare le pagine fisiche descritte dal file MDL ottenuto nel passaggio 1.
Usare MmMapLockedPagesWithReservedMapping per eseguire effettivamente il mapping della memoria virtuale alla memoria fisica bloccata nel passaggio 2. Si noti che l'indirizzo virtuale restituito da questa funzione include l'offset di byte specificato da MDL. Tuttavia, il campo MappedSystemVa del file MDL impostato da questa funzione non include l'offset dei byte.
Quando il chiamante non deve accedere alla memoria, rimuove il mapping della memoria con MmUnmapReservedMapping. Il chiamante può eseguire il mapping e rimuovere il mapping del buffer di memoria in base alle esigenze e deve eseguirne il mapping prima di liberare l'intervallo di mapping con MmFreeMappingAddress.
Si noti che il parametro MappingAddress specifica l'inizio dell'intervallo di memoria precedentemente riservato dal chiamante, non l'inizio del sottorange di memoria di cui eseguire il mapping. Il chiamante specifica l'indirizzo iniziale e la lunghezza del buffer quando alloca il file MDL con IoAllocateMdl. Il buffer deve rientrare nell'intervallo di memoria riservata, ma può essere un subset rigoroso.
La routine usa il parametro CacheType solo se le pagine descritte dal linguaggio MDL non dispongono già di un tipo di cache associato. Tuttavia, in quasi tutti i casi, le pagine hanno già un tipo di cache associato e questo tipo di cache viene usato dal nuovo mapping. Un'eccezione a questa regola riguarda le pagine allocate da MmAllocatePagesForMdl, che non dispongono di un tipo di cache specifico associato. Per tali pagine, il parametro CacheType determina il tipo di cache del mapping.