devil209
驱动牛犊
驱动牛犊
  • 注册日期2007-01-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分732分
  • 威望94点
  • 贡献值0点
  • 好评度73点
  • 原创分0分
  • 专家分0分
阅读:923回复:1

问一个关于传递irp的问题

楼主#
更多 发布于:2007-02-02 09:47
  小弟刚接触驱动不久,有个问题一直感到很迷惑:
一般对irp不做处理的传递是:
IoSkipCurrentIrpStackLocation(Irp);
IoCallDriver(dx->NextStackDevice,Irp);
以上NextStackDevice是本驱动邦定到的设备驱动,那么能知道具体是什么驱动吗?
如果一直按照这样传递,是不是有可能这个Irp会经过系统所有的驱动?
如果自己写了个驱动Wdm1,使用IoAttackDeviceToDeviceStack()邦定到设备堆栈后,自己又写了个Wdm2的驱动程序,使用IoAttackDeviceToDeviceStack()是不是就邦定到Wdm1上了?这时自己又写一个Wdm3的驱动程序使用IoAttackDeviceToDeviceStack(),那么发向Wdm1的Irp包就会经过Wdm2和Wdm3吗?
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-02-02 16:04
引用第0楼devil2092007-02-02 09:47发表的“问一个关于传递irp的问题”:
  小弟刚接触驱动不久,有个问题一直感到很迷惑:
一般对irp不做处理的传递是:
IoSkipCurrentIrpStackLocation(Irp);
IoCallDriver(dx->NextStackDevice,Irp);
以上NextStackDevice是本驱动邦定到的设备驱动,那么能知道具体是什么驱动吗?
.......

当然能知道是什么驱动。在驱动绑定设备的时候,一般有两种方式,一种是主动绑定,就是你提供设备名,然后调用函数来将他绑定,例如:
RtlInitUnicodeString( &nameString, L"\\Device\\RawDisk" );
 status = IoGetDeviceObjectPointer(
                    &nameString,
                    FILE_READ_ATTRIBUTES,
                    &fileObject,
                    &rawDeviceObject );
这样就会得到返回的rawDeviceObject 。
另外一种就是注册回呼函数,例如静态文件过滤系统经常用到的IoRegisterFsRegistrationChange( DriverObject, SfFsNotification );当有文件系统启动或关闭的时候就会调用SfFsNotification函数。这样你就可以根据传递给SfFsNotification的参数来得到你需要的信息
游客

返回顶部