|
|
|
|
|
|
|
Windows内核调试
帖子发起人: ezasm 发起时间: 2009-03-13 01:09 上午 回复: 4
|
帖子排序:
|
|
|
|
2009-03-13, 01:09 上午
|
ezasm
注册: 2009-03-13
发 贴: 3
|
|
|
DriverEntry里搜索地址范围位于base和base+size之间内存,引起崩溃
加MmIsAddressValid()判断后,该函数返回false,
但是硬编码这个地址的函数,是可以直接调用执行的,不会出错,
这样的话似乎有些矛盾了,既然这里的内存可以执行,说明代码在内存中,或者被交换出去了,总之应该是可以读取和执行的,因为DriverEntry是运行在PASSIVE_LEVEL的.
既然这样,为什么搜索读取会蓝呢?
另外不同机器上,情况不同,虚拟机一般不会有这样的地址,测试了几个机器,出问题的地址都不尽相同.同样的系统,相同大小内存,不同cpu,出问题地方都不同
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-03-13, 09:26 上午
|
王宇
注册: 2007-05-08
发 贴: 306
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-03-13, 12:43 下午
|
ezasm
注册: 2009-03-13
发 贴: 3
|
|
|
找到原因了,当某地址内存被交换出去以后MmIsAddressValid返回false,但怎么判断内存是否真的有效呢(1.已被映射到物理内存并且未被交换,2.已被映射但交换出去了,这两种情况至少有一个为true)
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-03-13, 14:37 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
|
|
还是没太看懂楼主描述的问题...
MmIsAddressValid 其实就是判断PDE/PTE Present 位的有效性:
PointerPte->u.Hard.Valid
#define MI_PDE_MAPS_LARGE_PAGE(PDE) ((PDE)->u.Hard.LargePage == 1)
在 dispatch 及以上级别引发页错误肯定蓝屏
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-03-13, 15:09 下午
|
ezasm
注册: 2009-03-13
发 贴: 3
|
|
|
谢谢王老师的解答,我对MmIsAddressValid 的理解有错误,我错误的认为如果该页已经映射,但被交换出去了,也返回true
之前崩溃的地址(addr1),不是我要找的地址(addr2),而是addr2前面的某个地址,addr1所在页还未被使用,所以读取导致蓝屏,
后来加了MmIsAddressValid做判断,当搜索到地址addr2时,由于缺页,函数返回了false,于是搜索代码跳过了,当我使用调试器去反汇编addr2时发现可以读取,所以造成了我的误解
再次感谢王老师的热情回复,调试才是王道
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » 求助,搜索ntoskrnl内存,遇到问题
|
|
|
|
|
|