还真复杂...我昨晚从 0x0E 开始简单地跟了一下
从 ENTER_TRAP、VERIFY_BASE_TRAP_FRAME(MODIFY_BASE_TRAP_FRAME)建立、校验 trap frame 开始,到 call _MmAccessFault@16 再到 MiDispatchFault 里的4种区分 —— MiResolveProtoPteFault、MiResolveTransitionFault、MiResolveDemandZeroFault 以及 MiResolvePageFileFault(这就是所谓的 Page resides in paging file)。Build 完 MDL 和其他数据结构之后就要开始 IoPageRead 了(核心的参数就是上述几个例程的 OUT —— PMMINPAGE_SUPPORT) IoPageRead 会给 PMMINPAGE_SUPPORT->FilePointer 对应的设备对象发标志含有 IRP_PAGING_IO 的 IRP: irp->Flags = IRP_PAGING_IO | IRP_NOCACHE | IRP_SYNCHRONOUS_PAGING_IO | IRP_INPUT_OPERATION;IoCallDriver 之后就可以跟踪 IRP 了。但后面我昨晚就没跟踪了,我猜是发到了 sr!SrPassThrough -> Ntfs!NtfsFsdRead,或是 FatFsdRead?跟踪完也许可以写更强悍的 Shadow Walker 了...