MmProbeAndLockPages()编码windows驱动程序时失败



我正在编写一个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()