-
-
[原创]对内核函数IoCompleteRequest的分析
-
发表于:
2010-3-16 22:32
9788
-
[原创]对内核函数IoCompleteRequest的分析
今天是我的18周岁生日,突然就想发表篇文章,而前几天刚好在做IopfCompleteRequest的分析,所以今天就赶赶急,把分析做做完,发表出来。
我在网上认识的一个前辈说过,看网上的文章,学网上已经有的技术,不是真技术;而只有自己研究才是自己所学的,所得的。而其中最为重要的是:开创自己的技术。而开创自己的技术,就需要自己先有研究的基础。
本文自然不是什么开创之作,IopfCompleteRequest的伪代码早已漫天飞IopfCompleteRequest也早已没有什么秘密可言。但是我还是坚持一个人独立地看windows的二进制码,凭自己所学,分析那一个个指令。
鉴于本人水平有限,从接触编程到现在也才2个年头多,虽兢兢业业,勤奋学习,却也因为走过不少弯路而浪费了很多的时间。所以本文会有一些甚至许多错误,请前辈们斧正。
下面是总结的IoCompleteRequest流程:
总结流程:
;当调用IoCompleteRequest时,首先检查当前堆栈位置,和IRP类型;然后判断IRP堆栈里的Control,来完成设置IRPPendingReturn和
;判断是否成功,取消,错误,时调用完成例程,然后再边回卷堆栈,边调用完成例程,然后一直回转到堆栈位置比windows的自设的空堆栈还大的时候
;结束回转,进入对IRP事件,回调函数,IRP,MDL释放等的工作中去.
;结束回转后,首先判断是否有事件或回调函数,若无,则释放IRP和MDL,并返回、;若有,则先判断是否需要重解析,若需要,则将AuxiliaryBuffer释放掉,并清零,(大概就是清零后能达到重解析的目的,可以说是一个标志位吧)
;若不需要,则判断用户态设置的通信方法,是用事件的方法,还是用回调函数的方法。
;若为事件,则设置事件,然后无论IRP是Reserved还是正常的,都进行释放,释放后返回
;若为回调函数,则又分为三种情况,一是成功的情况下,二是取消的情况下,三是等待的情况下。
;成功和取消相仿,都是先初始化再插入队列
;只不过取消的情况下还和上面的AuxiliaryBuffer清零结合在一起,如果清零了,则直接返回。
;等待的状态下只初始化APC,并不插入队列。
;KeBugCheckEx 是错误报告,只有两处会产生错误报告,一是调用IoCompleteRequest时,堆栈CurrentLocation大于StackCount+1,而是IRP类型不为6
附件是IoCompleteRequest的二进制码,和我对二进制码的注释,还有总结的一些对IoCompleteRequest的结论。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)