约有 3 项符合查询结果, 以下是第 1 - 1项。
费时 < 1 秒。
谢谢王老师的解答,我对MmIsAddressValid 的理解有错误,我错误的认为如果该页已经映射,但被交换出去了,也返回true
之前崩溃的地址(addr1),不是我要找的地址(addr2),而是addr2前面的某个地址,addr1所在页还未被使用,所以读取导致蓝屏,
后来加了MmIsAddressValid做判断,当搜索到地址addr2时,由于缺页,函数返回了false,于是搜索代码跳过了,当我使用调试器去反汇编addr2时发现可以读取,所以造成了我的误解
再次感谢王老师的热情回复,调试才是王道
Posted in Windows内核调试
by
ezasm
on 2009-03-13
找到原因了,当某地址内存被交换出去以后MmIsAddressValid返回false,但怎么判断内存是否真的有效呢(1.已被映射到物理内存并且未被交换,2.已被映射但交换出去了,这两种情况至少有一个为true)
Posted in Windows内核调试
by
ezasm
on 2009-03-13
DriverEntry里搜索地址范围位于base和base+size之间内存,引起崩溃
加MmIsAddressValid()判断后,该函数返回false,
但是硬编码这个地址的函数,是可以直接调用执行的,不会出错,
这样的话似乎有些矛盾了,既然这里的内存可以执行,说明代码在内存中,或者被交换出去了,总之应该是可以读取和执行的,因为DriverEntry是运行在PASSIVE_LEVEL的.
既然这样,为什么搜索读取会蓝呢?
另外不同机器上,情况不同,虚拟机一般不会有这样的地址,测试了几个机器,出问题的地址都不尽相同.同样的系统,相同大小内存,不同cpu,出问题地方都不同
Posted in Windows内核调试
by
ezasm
on 2009-03-13