我正在编写一个windows驱动程序。
我尝试使用MmProbeAndLockPages()探测虚拟内存页https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-mmprobeandlockpages
首先,我使用IoAllocateMdl()分配MDL。然后探测虚拟内存页。代码如下:
PMDL pMdl = IoAllocateMdl(Dest, (ULONG)Size, FALSE, FALSE, NULL);
if (pMdl) {
__try {
MmProbeAndLockPages(pMdl, KernelMode, IoModifyAccess);
MmUnlockPages(pMdl);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
status = GetExceptionCode();
}
IoFreeMdl(pMdl);
}
我还尝试使用KeStackAttachProcess()附加到进程但是没有效果。
Dest变量对于userland来说是一个PVOID进程的地址。地址是有效的,因为我可以从中读取。
你知道为什么MmProbeAndLockPages()失败了,我的代码进入了除了分支?
异常码为0xC0000005(这是一个访问冲突),但我指定了IoModifyAccess/IoWriteAccess我应该可以从内核区写入用户区进程,对吧?
即使我取消了cr0的WP位,它也不起作用…嗯,有些奇怪的事情发生了
我使用的是windows 10.0.19044
感谢对
我必须把IoModifyAccess
改成IoReadAccess
。
然后用PAGE_READWRITE
呼叫MmProtectMdlSystemAddress()
。