When I try to probe and lock a piece of memory for IoWriteAccess, an exception of STATUS_ACCESS_VIOLATION occured. I also tried IoReadAccess, the same thing happeded.
NTSTATUS WriteToVirtualMemory(PVOID dest, PVOID src, SIZE_T size)
{
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
PMDL Mdl = NULL;
PVOID MappedAddress = NULL;
PVOID SeMem = NULL;
DebugPrint(“[WriteToVirtualMemory] dest=%08X src=%08X size=%d”, dest, src, size);
Mdl = IoAllocateMdl(dest, size, FALSE, FALSE, NULL);
if(Mdl==NULL)
{
DebugPrint(“[WriteToVirtualMemory]: Allocate MDL failed!”);
ntStatus = STATUS_UNSUCCESSFUL;
goto clean_up;
}
ntStatus = MmProtectMdlSystemAddress(Mdl, PAGE_EXECUTE_READWRITE);
if(NT_SUCCESS(ntStatus))
{
DebugPrint(“[WriteToVirtualMemory]: Protect pages failed with %s!”, OsrNTStatusToString(ntStatus));
goto clean_up;
}
try
{
MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess);
}
except(EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
DebugPrint(“[WriteToVirtualMemory]: Probe for write failed with %s”, OsrNTStatusToString(ntStatus));
IoFreeMdl(Mdl);
return ntStatus;
}
MappedAddress = MmMapLockedPagesSpecifyCache(Mdl, KernelMode, MmCached, NULL, FALSE, NormalPagePriority);
if(NULL==MappedAddress)
{
DebugPrint(“[WriteToVirtualMemory]: Map pages failed!”);
ntStatus = STATUS_UNSUCCESSFUL;
goto clean_up;
}
RtlCopyMemory(MappedAddress, src, size);
ntStatus = STATUS_SUCCESS;
clean_up:
if(MappedAddress)
{
MmUnmapLockedPages(MappedAddress, Mdl);
}
if(Mdl)
{
MmUnlockPages(Mdl);
IoFreeMdl(Mdl);
}
return ntStatus;
}