MmGetSystemAddressForMdlSafe和MmGetSystemAddressForMdl其實都是宏,都直接或間接的調用了MmMapLockedPagesSpecifyCache內核函數。
MmMapLockedPagesSpecifyCache的聲明如下:
NTKERNELAPI PVOID
MmMapLockedPagesSpecifyCache(
IN PMDL MemoryDescriptorList,
IN KPROCESSOR_MODE AccessMode,
IN MEMORY_CACHING_TYPE CacheType,
IN PVOID BaseAddress,
IN ULONG BugCheckOnFailure,
IN MM_PAGE_PRIORITY Priority
);
注意到倒數第二個參數 BugCheckOnFailure了吧,如果是TRUE,在map發生錯誤的時候會引發bugcheck(就是藍屏)。如果是FALSE,則不會引發bugcheck,而是函數返回NULL。
MmGetSystemAddressForMdlSafe之所以安全,就是把這個參數設置爲FALSE,不會引發藍屏。