首页
社区
课程
招聘
[原创]通俗解析IRP和I/O设备栈在内核程序中的作用
发表于: 2010-4-23 12:19 18450

[原创]通俗解析IRP和I/O设备栈在内核程序中的作用

2010-4-23 12:19
18450

楔子:
申请看雪已经将要满一年了,可是发现还是临时用户,很惭愧。现在正在写毕业论文,刚好可以屡一下思路。一直都在研究Windows内核驱动程

序,对驱动程序有自己的一点看法,不知道是否能够申请到邀请码。
正文:
言归正传,所有的I/O请求都是以IRP(I/O请求包)的形式来提交的,同时内核程序的所有分发函数(Dispatch Function)的第二个参数都是

PIRP(也即是指向IRP的指针)。为了说明问题,防止跳跃性太大,先解释几个名词(都按自己理解的),可以帮助会的人复习,不会的人学习

1:DRIVER_OBJECT:
驱动对象,由即插即用管理创建和传递到DriverEntry,作为DriverEntry的第一个参数,函数原型如下:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
                     IN PUNICODE_STRING pRegistryPath);
代表了一个内核驱动程序,一个驱动程序有且只有一个DRIVER_OBJECT,在wdm.h里有定义,也可以使用WinDbg查看其结构(保留最重要的

,并作了注释):

  

////////////////DRIVER_OBJECT//////////////////////////////////////////////////////
[COLOR="RoyalBlue"]typedef struct _DRIVER_OBJECT {
   。。。。
    PDEVICE_OBJECT DeviceObject;//指向驱动程序中创建的第一个设备对象
。。。    
    PDRIVER_EXTENSION DriverExtension;//驱动扩展,里面有一个AddDevice,对于WDM程序很重要
。。。
   PDRIVER_STARTIO DriverStartIo;//很重要,IRP串行化
    PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];//0x1E个分发函数,是内核驱动程序的核心,可以理解为回调函数(

只需要告诉驱动程序的分发函数名,并且编写函数实体,由系统I/O管理器完成调用)。若有机会,我会专门写一篇关于回调函数的文章

} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; [/COLOR]
  
///////////////////DEVICE_OBJECT//////////////////////////////////
[COLOR="royalblue"]typedef struct _DEVICE_OBJECT {
........  
    struct _DRIVER_OBJECT *DriverObject;//指出设备对象归属于哪个驱动程序(驱动对象)
    struct _DEVICE_OBJECT *NextDevice;//下一个设备对象(一个驱动程序可以创建多个设备对象),这个设备对象是同一层的(为了对比

设备栈)
    struct _DEVICE_OBJECT *AttachedDevice;//指向下一层驱动程序的设备对象(可以理解被挂载的设备对象)
    struct _IRP *CurrentIrp;//使用IRP串行化时很重要,用来决策当前IRP完成还是挂起等

    CCHAR StackSize;//设备栈的个数

     PVOID DeviceExtension;// 设备扩展,是一个自定义的大小的结构,很重要。因为驱动程序中的每个分发例程都有可能工作在不同的线

程和进程中,所以全局变量很危险,为了防止这一点,把全局变量都定义到设备扩展里,而设备对象又作为每个分发例程都带有设备对象,所

以都可以通过设备对象得到设备扩展里面的信息(在这一点上,个人认为有点像C++的封装性      
} DEVICE_OBJECT;
typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT; [/COLOR]

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (35)
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
小弟也是初学者~~拜读了~~哈哈~~
2010-4-23 14:19
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
精神可嘉,你一定能进级成功。
2010-4-23 14:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark~~~楼主加油
2010-5-4 16:04
0
雪    币: 97
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
真的很高兴,这篇文章能够被管理员加精,可以肯定我这两年来的学习和努力没有白费,我会继续努力,继续挖掘Windows内核,希望能给更多的驱动初学者打开Windows的神秘大门。
2010-5-6 17:14
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看不懂啊  比英语都难
2010-5-6 20:12
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
小弟新手,学习了!
2010-5-7 13:10
0
雪    币: 97
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
呵呵,看不懂是对的,看懂了那Windows驱动就不会有那么多人不敢碰触。刚学时也是这样,稀里糊涂的,多动手多调试就好多了,习惯使用WinDbg,可以查看很多Windows内核未知的东西
2010-5-8 12:02
1
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
入门方法问题而已
学习知识毕竟和解决迷题不同
合适的学习曲线 正常智商的人坚持下载都没问题
可惜一个合适的学习曲线 一个坚持
说易行难啊
2010-5-11 14:46
1
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好东西  学习了。
2010-5-20 00:24
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
可以采取两种方式,使用IoSkipCurrentIrpStackLocation()把指针拨回去(和IoCallDriver()方向相反)这句里面的指针怎么理解·~相反何解?
2010-5-21 18:08
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
厉害!期待你的新文章!呵呵!继续潜水学习!
2010-5-22 01:07
0
雪    币: 1681
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
itf
13
研究生论文?  缺乏必要的解释啊  呵呵 ~~~
2010-5-22 13:10
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
windows内核。太深奥了~~
2010-5-22 14:11
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
完全的一窃 不通啊

楼主太专业了
2010-5-26 18:19
0
雪    币: 55
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
厉害,这个完全不懂。
2010-5-30 19:26
0
雪    币: 364
活跃值: (91)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
写得太好!看到楼主的文章真是太及时。
2010-5-30 22:08
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
先谢谢分享, 在详看。
2010-7-15 16:56
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
还是不怎么明白 irp 堆栈。。  为扫描要专门弄个 IO_STACK_LOCATION  全部放到irp里不行吗?
2010-7-15 19:27
0
雪    币: 201
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
写的很辛苦吧,码字不少哟...
2010-7-15 20:08
0
雪    币: 2477
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
楼主太专业了
2010-7-23 14:33
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
向楼主学习,不要再潜水啦。。。
2010-7-23 16:04
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
好东西
,刚好我在学习驱动开发
2011-2-10 14:03
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
24
不错哦 对驱动程序的理解又有了加深
2011-2-17 17:16
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习啦!
2011-2-18 11:39
0
游客
登录 | 注册 方可回帖
返回
//