标签:
ring0下的安全拷贝
BOOLEAN SafeCopyMemory(PVOID pDestination, PVOID pSourceAddress, SIZE_T SizeOfCopy) { PMDL pMdl = NULL; PVOID pSafeAddress = NULL; if(!MmIsAddressValid(pDestination) || !MmIsAddressValid(pSourceAddress)) return FALSE; pMdl = IoAllocateMdl(pDestination, (ULONG)SizeOfCopy, FALSE, FALSE, NULL); if(!pMdl) return FALSE; __try{ MmProbeAndLockPages(pMdl, KernelMode, IoReadAccess); } __except(EXCEPTION_EXECUTE_HANDLER){ IoFreeMdl(pMdl); return FALSE; } pSafeAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority); if(!pSafeAddress) return FALSE; __try{ RtlMoveMemory(pSafeAddress, pSourceAddress, SizeOfCopy); } __except(EXCEPTION_EXECUTE_HANDLER){ ; } MmUnlockPages(pMdl); IoFreeMdl(pMdl); return TRUE; }
标签:
原文地址:http://www.cnblogs.com/Lthis/p/4687952.html