当前位置: 代码迷 >> 驱动开发 >> IRP 派遣函数的有关问题
  详细解决方案

IRP 派遣函数的有关问题

热度:65   发布时间:2016-04-28 11:19:34.0
IRP 派遣函数的问题
我在写一个
应用层和驱动层交互的程序中发现了一个问题

应用层
1.CreateFile 访问驱动
2.DeviceIoControl

驱动层
在我故意没有对
IRP_MJ_CREATE做处理,也就是说在我的驱动层的代码中根本就没有写
pDriverObject->MajorFunction[IRP_MJ_CREATE]=DispatchRoutine;
运行的结果:
驱动加载成功,应用层与驱动层交互 在DeviceIoControl出getlasterror 返回为2 但是如果我加上对IRP_MJ_CREATE的处理(上面的那句代码)反正就可以正常。
问题如下:
1.如果不写的话,按照道理来说它应该按照默认的情况来出来才对,难道默认的是不允许打开?还是什么情况?
2.在看书的适合发现示例代码中都有对相关的IRP做处理,不同的API发出来的IRP应该有所不同的吧,那么我怎么知道该处理什么IRP呢?如果该出来的IRP我没有处理的话,那么就会遇到我今天遇到的这个问题了。


写了很多不知道大家能否看明白呢?谢谢大家!

------解决方案--------------------
你绑定的并不一定是物理设备,所以与其说是驱动程序,不如说是过滤程序,虽然都叫做设备,所有的irp类型都要处理,所谓的处理两种情况,自己确实对irp进行了读出来 写出来,或者完成请求,另一种情况处理就是把IRP的全部参数传递给下一个设备,当然这也叫处理,既然你的设备已经进入了设备栈,就有义务传递或者完成请求。

你的第二个问题,你是处理的针对当前设备的IRP,IO管理区会根据物理设别 在寻找与之绑定的设备栈,而你的设备就在栈顶,针对当前设备的请求就是那些,例如键盘的读写,网卡的读写。
------解决方案--------------------
1、返回错误是正常的,你没有写处理例程,肯定不会返回正确值。
2、没有崩溃也是正常的,因为驱动对象里面的IRP Function数组里面的函数指针是被操作系统预先定义好的,有个固定的函数处理的,你不填就会调用默认的例程,所以不会崩溃。
3、你反编译下这个默认的函数,看看它的返回值是什么。
  相关解决方案