|
|
|
|
|
|
|
Windows内核调试
帖子发起人: zyq8709 发起时间: 2011-05-18 10:58 上午 回复: 10
|
帖子排序:
|
|
|
|
2011-05-18, 10:58 上午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
先问一下,为何在Dispatch_level级以上级别不能进行文件I/O,请用源代码中的关键语句说明,wrk或ReactOS都行,小弟我找了半天也找不到。
另一个是我在看ReactOS代码时,看了半天也没发现到底是那些代码执行了从内存到磁盘的复制过程,就是如何将直接数据写到磁盘上的代码或函数是那些,请帮忙指出来,在此多谢了!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-18, 14:09 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
第一个问题论坛讨论过:
http://advdbg.org/forums/2897/ShowPost.aspx
第二个问题要结合设备栈来分析。从内核执行层 / 对象管理器解析路径、IopParseDevice 发 IRP 到文件系统驱动,IRP 生命周期还需流经 ( 类似于 ) 卷快照(volsnap.sys)、卷管理器(ftdisk.sys)、分区管理器(partmgr.sys)、磁盘类驱动(disk.sys)、磁盘端口驱动(以IDE系统为例是 atapi.sys)、小端口驱动(以Adaptec 1540 SCSI 为例是 Ahal54x.sys) 等。
另外,描述不准 —— DISPATCH_LEVEL 不能进行文件I/O —— DISPATCH_LEVEL 不能引发页异常。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-18, 15:34 下午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
多谢王宇大哥的回答,那个帖子我看到了,确实是因为那个比较。但是,在DISPATCH_LEVEL 级别上确实不能用CreateFile,WriteFile等文件操作,比如在驱动的派遣函数中调用文件操作例程,像内核级的键盘记录器,必须另创建一个PASSIVE_LEVEL级的线程,书上原话是这样的(来自professional rootkit):我们本章创建的键盘记录器可以运行在dispatch level 上。因为在dispatch
level 上进行文件操作会导致操作系统崩溃,所以必须要有一个线程,一个存储数据的介质
和一个同步方法来保证正常地操作。因为我们在DISPATCH_LEVEL 级别上进行键盘按键数据的收集,而文件I/O 请求在
PAAIVE_LEVEL 级别上,所以必须要创建一个运行在PASSIVE_LEVEL 级别上的线程来把
实际的键盘按键数据写入到磁盘里。
请大哥费费心,用代码解释一下吧!多谢!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-18, 17:19 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
举例来说,下面这个崩溃是在DISPATCH_LEVEL调用ZwWriteFile:
kd> kn 30
# ChildEBP RetAddr
00 f4373014 804f7bad nt!RtlpBreakWithStatusInstruction
01 f4373060 804f879a nt!KiBugCheckDebugBreak+0x19
02 f4373440 80540693 nt!KeBugCheck2+0x574
03 f4373440 80545769 nt!KiTrap0E+0x233
04 f4373528 80514662 nt!ExAllocatePoolWithTag+0x869
05 f4373548 805192ac nt!MiAddViewsForSection+0x92
06 f4373584 804e770e nt!MmMapViewInSystemCache+0x12e
07 f4373628 804e7990 nt!CcGetVacbMiss+0x2ea
08 f4373660 804e2cb0 nt!CcGetVirtualAddress+0x94
09 f43736f0 804e0b12 nt!CcMapAndCopy+0xe8
0a f437377c f842bf83 nt!CcCopyWrite+0x28e
0b f437396c f8428c18 Ntfs!NtfsCommonWrite+0x1d21
0c f43739d0 804ee129 Ntfs!NtfsFsdWrite+0xf3
0d f43739e0 f84cb3ca nt!IopfCallDriver+0x31
0e f43739f0 804ee129 sr!SrWrite+0xaa
0f f4373a00 80574dde nt!IopfCallDriver+0x31
10 f4373a14 805728ca nt!IopSynchronousServiceTail+0x70
11 f4373ac8 8053d648 nt!NtWriteFile+0x602
12 f4373ac8 804ff321 nt!KiFastCallEntry+0xf8
13 f4373b64 f8a736ff nt!ZwWriteFile+0x11
崩溃的直接原因是触发了缺页异常:
DRIVER_CORRUPTED_EXPOOL (c5)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high. This is
caused by drivers that have corrupted the system pool. Run the driver
verifier against any new (or suspect) drivers, and if that doesn't turn up
the culprit, then use gflags to enable special pool.
Arguments:
Arg1: e1064000, memory referenced
Arg2: 00000002, IRQL
Arg3: 00000001, value 0 = read operation, 1 = write operation
Arg4: 80545769, address which referenced memory
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-18, 19:11 下午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
我明白了,是看调用堆栈,看发生崩溃时是由哪个函数引起的,我看到页面异常处理过程,就是有缺页发生了,是这样吧?多谢各位大哥的热心解答,论坛里真是人才济济呀!
还有一个疑问,为何ExAllocatePoolWithTag会引起页面故障,操作的文件又不在页面文件中呀,请帮忙详细的解释一下从写文件到崩溃的过程吧,多谢!!!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-18, 19:48 下午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
另:我在网上看到一段话:
应用程序通过API发出一个IO的请求 → 文件系统驱动负责创建文件对象,以及相关的管理结构。→ 对于已标记不缓存的文件 直接走存储驱动 / 缓存文件则调用CcCopyRead、CcCopyWrite等
→ 缓存管理器MmFlushSection的时候会产生页面错误,由内存管理器调用IoPageRead经由文件系统而直接走存储设备驱动。
照这样说,如果不缓存的话,那么就不会发生页面异常了,那就不会蓝屏了,那这个如何理解?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-18, 20:45 下午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
如果仅仅是页面故障导致的,那么也是不能大于APC_LEVEL,而事实是不能大于PASSIVE_LEVEL,无论是否通过缓存操作,最终都得导致非缓存磁盘I/O。那么我猜想,是否是在FSD的非缓存I/O操作中加入了对
CurrentIrql不能大于PASSIVE_LEVEL的判断,请众位大哥给点提示,多谢!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-22, 11:45 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
<BLOCKQUOTE><table width="85%"><tr><td class="txt4"><img src="/Themes/default/images/icon-quote.gif"> <strong>zyq8709 wrote:</strong></td></tr><tr><td class="quoteTable"><table width="100%"><tr><td width="100%" valign="top" class="txt4">还有一个疑问,为何ExAllocatePoolWithTag会引起页面故障,操作的文件又不在页面文件中呀,请帮忙详细的解释一下从写文件到崩溃的过程吧,多谢!!!</td></tr></table></td></tr></table></BLOCKQUOTE>
是在分页堆上分配用于管理文件的Section结构时触发了缺页异常,还没有读写文件内容。
问题的根本在于这些文件I/O函数在设计时就假定当前的中断级别是是可以使用分页堆的,也就是允许产生缺页异常的
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-24, 10:48 上午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
多谢老师的详解!
那还有为何这些I/O函数必须在PASSIVE级而非<=APC级,而且分配用于管理文件的Section结构时,是否一定会触发缺页异常呢,盼详解!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-24, 10:53 上午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
刚才才注意到,原来帮助我的中有张老师,一直没有注意,在这里向张老师致歉并致以由衷的感谢!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-25, 08:09 上午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
Re: 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
请张老师继续关注,帮忙解答最后一点问题吧(在倒数第三楼),感激不尽!
附:我在NtWriteFile等函数中并没有发现比如Irql进行比较判断的环节,请问他是如何进行对irql的限制的呢?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » 众高手快来帮帮小弟,关于文件I/O与IRQL的问题
|
|
|
|
|
|