首页
社区
课程
招聘
[求助]驱动小白问一个小白的问题
发表于: 2016-8-8 20:53 5407

[求助]驱动小白问一个小白的问题

2016-8-8 20:53
5407
教程原文:
// 所有的分发函数都设置成一样的。
for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
{
driver->MajorFunction[i] = cwkDispatch;
}

问题:MajorFunction数组里有IRP_MJ_MAXIMUM_FUNCTION+1个成员,为什么只初始化IRP_MJ_MAXIMUM_FUNCTION个成员后教程就说所有的分发函数都已经设置成一样的了?

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 6
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
来个前辈解答一下吧,这个要是想不通,难受死了,强迫症哎...
2016-8-8 22:10
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
3
如楼下大神所言,加上等号就对了
2016-8-8 22:54
0
雪    币: 6
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=shayi;1440332]你的 driver 指针指向的 DRIVER_OBJECT 结构中的最后一个成员 MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1] ,是一个函数指针数组,长度为
IRP_MJ_MAXIMUM_FUNCTION + 1,该数组本质上是一个调用表,由28个函数(分发例...[/QUOTE]

没表达清楚问题,数组有1c个函数指针,这个for却只初始化了0-1a,少初始化一个没关系吗
2016-8-8 23:20
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
5
加上等号是正确的,否则最后一个没有初始化
2016-8-8 23:52
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
教材BUG
改为  i<=IRP_MJ_MAXIMUM_FUNCTION
2016-8-9 10:59
0
雪    币: 6
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
对嘛,我之前还以为是最后一个指针不用初始化,已经废弃的
2016-8-9 11:58
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
8
加上等号是正确的,否则最后一个没有初始化
2016-8-9 12:11
0
雪    币: 6
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
上面循环就是这样
int arg[27+1];
for(int i=0,i<27,++i)
{
arg[i]=1;
}
最后一个循环arg[26]=1;自增后i==27跳出循环,数组下标27的成员没有被初始化,改成i<=27就完美了
2016-8-9 12:31
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
#define IRP_MJ_CREATE                   0x00	offset:0x38
#define IRP_MJ_CREATE_NAMED_PIPE        0x01	offset:0x3C
#define IRP_MJ_CLOSE                    0x02	offset:0x40
#define IRP_MJ_READ                     0x03	offset:0x44
#define IRP_MJ_WRITE                    0x04	offset:0x48
#define IRP_MJ_QUERY_INFORMATION        0x05	offset:0x4C
#define IRP_MJ_SET_INFORMATION          0x06	offset:0x50
#define IRP_MJ_QUERY_EA                 0x07	offset:0x54
#define IRP_MJ_SET_EA                   0x08	offset:0x58
#define IRP_MJ_FLUSH_BUFFERS            0x09	offset:0x5C
#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a	offset:0x60
#define IRP_MJ_SET_VOLUME_INFORMATION   0x0b	offset:0x64
#define IRP_MJ_DIRECTORY_CONTROL        0x0c	offset:0x68
#define IRP_MJ_FILE_SYSTEM_CONTROL      0x0d	offset:0x6C
#define IRP_MJ_DEVICE_CONTROL           0x0e	offset:0x70
#define IRP_MJ_INTERNAL_DEVICE_CONTROL  0x0f	offset:0x74
#define IRP_MJ_SHUTDOWN                 0x10
#define IRP_MJ_LOCK_CONTROL             0x11
#define IRP_MJ_CLEANUP                  0x12
#define IRP_MJ_CREATE_MAILSLOT          0x13
#define IRP_MJ_QUERY_SECURITY           0x14
#define IRP_MJ_SET_SECURITY             0x15
#define IRP_MJ_POWER                    0x16
#define IRP_MJ_SYSTEM_CONTROL           0x17
#define IRP_MJ_DEVICE_CHANGE            0x18
#define IRP_MJ_QUERY_QUOTA              0x19
#define IRP_MJ_SET_QUOTA                0x1a
#define IRP_MJ_PNP                      0x1b
#define IRP_MJ_PNP_POWER                IRP_MJ_PNP      // Obsolete....
#define IRP_MJ_MAXIMUM_FUNCTION         0x1b


贴点东西,自己看吧,到底索引最大是多少,有多少个成员,一个简单的数组问题还数不明白吗?
2016-8-9 12:42
0
雪    币: 333
活跃值: (161)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
楼上的大神要疯了 ···
2016-8-9 12:48
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=zy人生;1440403]上面循环就是这样
int arg[27+1];
for(int i=0,i<27,++i)
{
arg[i]=1;
}
最后一个循环arg[26]=1;自增后i==27跳出循环,数组下标27的成员没有被初始化,改成i<=27就完美了[/QUOTE]

对不起,是我弄错了,0x1b 应该是 27,那么加上等号就是正确的,MajorFunction[0]等于第1个成员,MajorFunction[1b]等于第28个成员,没有越界访问。下次得看仔细点。。。
2016-8-9 12:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
细心是很重要的
2016-8-9 14:01
0
雪    币: 0
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我的天。。。
2016-8-11 17:39
0
游客
登录 | 注册 方可回帖
返回
//