MmMapLockedPagesWithReservedMapping 函式 (wdm.h)
MmMapLockedPagesWithReservedMapping 例程會對應先前由 MmAllocateMappingAddress 例程保留的所有或部分地址範圍。
語法
PVOID MmMapLockedPagesWithReservedMapping(
[in] PVOID MappingAddress,
[in] ULONG PoolTag,
[in] PMDL MemoryDescriptorList,
[in] __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE CacheType
);
參數
[in] MappingAddress
保留虛擬記憶體範圍的開頭指標。 這必須是先前由 MmAllocateMappingAddress傳回的位址。
[in] PoolTag
指定保留記憶體緩衝區的集區標記。 這必須與保留緩衝區之呼叫 MmAllocateMappingAddressPoolTag 參數中指定的值相同。
[in] MemoryDescriptorList
要對應的 MDL 指標。 此 MDL 必須描述鎖定的實體頁面。 MmProbeAndLockPages 或 MmAllocatePagesForMdlEx 例程可以建置鎖定的 MDL。
[in] CacheType
指定要用來建立對應的 MEMORY_CACHING_TYPE 值。
傳回值
MmMapLockedPagesWithReservedMapping 會傳回對應記憶體開頭的指標,如果系統無法對應記憶體,NULL。 只有當函式參數發生錯誤時,這個例程才會傳回 NULL (例如,驅動程式的對應地址不夠大,無法跨越提供的 MDL)。 此函式旨在讓驅動程式即使在低資源案例中也能夠向前推進。
言論
呼叫端可以使用 MmMapLockedPagesWithReservedMapping 來對應 MmAllocateMappingAddress 所保留之虛擬記憶體範圍的子範圍,如下所示:
使用 IoAllocateMdl 來配置 MDL。 傳回的 MDL 是使用要對應之虛擬記憶體範圍的指定起始位址和大小來建置。
使用 MmProbeAndLockPages 來鎖定步驟 1 中取得之 MDL 描述的實體頁面。
使用 MmMapLockedPagesWithReservedMapping 實際將虛擬記憶體對應至步驟 2 中鎖定的實體記憶體。 請注意,此函式傳回的虛擬位址確實包含 MDL 指定的位元移。 不過,此函式所設定之 MDL 的 MappedSystemVa 字段不包含位移。
呼叫端不需要存取記憶體之後,它會使用 MmUnmapReservedMapping取消對應記憶體。 呼叫端可以視需要對應和取消對應記憶體緩衝區,而且必須先取消對應,才能使用 MmFreeMappingAddress釋放對應範圍。
請注意,MappingAddress 參數會指定呼叫端先前保留之內存範圍的開頭,而不是要對應的記憶體子範圍的開頭。 呼叫端會在配置具有ioAllocateMdl 的 MDL 時,指定緩衝區的起始位址和長度。 緩衝區必須符合保留的記憶體範圍,但可以是嚴格的子集。
只有當 MDL 所描述的頁面還沒有相關聯的快取類型時,例程才會使用 CacheType 參數。 不過,在幾乎所有情況下,頁面已經有相關聯的快取類型,而且新對應會使用此快取類型。 此規則的例外狀況是由 MmAllocatePagesForMdl配置的頁面,這些頁面沒有相關聯的特定快取類型。 對於這類頁面,CacheType 參數會決定對應的快取類型。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 適用於 Windows XP 和更新版本的 Windows。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport) |