sxslyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-28
  • 最后登录2009-07-28
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望24点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2166回复:3

一个驱动程序中是不是可以建立多个设备对象,而这些设备对象是不是共用相同的派遣例程?

楼主#
更多 发布于:2009-07-24 15:30
抛开实际应用,是不是可以这样理解,在一个驱动程序中无论建立几个设备对象,也不论其中设备对象是否挂接在什么设备上或没挂,当相同的IRP请求到来时,都会调用驱动程序同一个派遣例程.如:我建了一个串口过滤对象,一个磁盘过滤对象,一个独立的设备对象,当IRP_MJ_READ请求到来时,这些对象都会调用我自己指定的ComSpy_Read回调函数对吗?(前提是ComSpy_Read可重入).

不知道我理解的对不对!
spin
驱动小牛
驱动小牛
  • 注册日期2001-04-17
  • 最后登录2015-10-27
  • 粉丝1
  • 关注0
  • 积分46分
  • 威望354点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-07-25 10:37
错误
lyflash
驱动牛犊
驱动牛犊
  • 注册日期2009-07-29
  • 最后登录2009-10-15
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望181点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-08-03 21:32
同问
albert21st
驱动牛犊
驱动牛犊
  • 注册日期2006-09-27
  • 最后登录2009-09-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望97点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-08-04 19:27
楼主,正是如此,每个设备对象都有一个 _DRIVER_OBJECT 指针栏位,当你创建一个设备对象的时候会填入一个 _DRIVER_OBJECT 指针,这个指针将会存储在你即将创建的这个 DeviceObject 的 _DRIVER_OBJECT 指针栏位里。
一旦要向这个设备对象发送 IRP 的时候,就会用其 _DRIVER_OBJECT 指针栏位作为查找 Dispatch routine 的依据。
    所以楼主的观点是对的,那么在同一个 Dispatch routine 里怎么去区分到底这个 IRP 是发给谁的呢?这就需要编写这个 Driver 的人自已去处理了,有很多方法,较常用的方法是在创建每个设备对象时都指定一个设备对象扩展 (DeviceExtension),然后在这个 DeviceExtension 里设置一个栏位 Flag,每个设备对象存不一样的值,然后你进行 switch case。
游客

返回顶部