控制器和多功能设备(pci驱动).pdf

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
控制器和多功能设备(pci驱动)

控制器和多功能设备 在第六章提到过,有两种类型的设备不太符合 PNP的框架。它们是控制器设备和多功 能设备。控制器设备管理一些子设备,而多功能设备在同一个设备上有几种功能。它们的共 同之处在于,必须使用独立的I/O资源来创建多个设备对象。 在 Windows XP 下,支持那些遵守各自总线标准的设备很容易,例如: PCI, PCMCIA,USB 设备等。 PCI 总线驱动可自动识别 PCI 多功能卡。对PCMCIA 设备,可以 参展DDK中的 MF.sys 驱动的详细说明,该驱动是一个多功能卡的功能驱动,MF.sys 可以 枚举卡的各个功能,然后为每个功能加载各自的功能驱动。对具有一个配置的USB 设备, USB 总线驱动会为该配置的每个接口分别加载相应的驱动。 Windows98 和 WindowsXP 相比,只提供了对USB 多功能设备的支持。在Windows98 中,为了支持多功能设备,开发者必须做更多的工作。不仅需要为主设备提供一个功能驱动 还要为连在上面的所有子设备提供单独的功能驱动。主设备的功能驱动需要枚举子设备,提 供对子设备PNP和电源的缺省处理,它有点像一个微型总线驱动。写一个完整的总线驱动 是一个相当大的工程,本文并不试图描述其详细过程。本文会描述一些基本的处理机制,以 使读者可以枚举子设备,完成那些不太符合微软模型的多功能设备的驱动。 总体结构 下图显示了一个有子设备的父设备(就像总线设备)的设备对象的拓扑图。控制器和多 功能设备有相似的拓扑结构。 可以看到,父设备连在一个标准的总线上,总线驱动检测到了这个父设备,然后像对任 何普通设备一样配置它。当启动父设备后, PNP 管理器发出一个次功能码是 IRP_MN_QUERY_DEVICE_RELATIONS 的IRP 给父设备以获得所谓的总线关系。这个请 求会对任何设备发出,事实上,PNP管理器不知道某个设备是否有子设备。 为了对这个请求作出回应,父设备的功能驱动会查找或者创建额外的设备对象,所有这 些设备对象会成为子设备栈栈底的 PDO。然后,PNP管理器接着为子设备加载功能设备和 过滤设备。 父设备的驱动必须担当两种角色:对多功能设备担当 FDO, 对其子设备,担当 PDO。 当它做FDO时,需要处理PNP IRP 和 PowerIRP。当它做PDO 时,它被当作 PNP IRP 和 PowerIRP 最后处理的地方。 子设备对象 父设备必须为自设备创建PDO,有两种方法:  对支持热插拔的设备,应该维护一个PDO的列表,在PNP管理器每次发出得到总 线关系的请求时更新。同时必须有硬件枚举的功能以检测新插入的设备,和被移开的设备, 动态的更新PDO的列表。  对于有固定功能的父设备来讲,可以创建一个固定数目的PDO列表。 设备扩展结构 FDO 和所有的PDO都属于一个多功能设备驱动,这可能是驱动比较复杂的一点。这意 味着所有对PDO和FDO的请求都会由同一组dispatch例程处理。驱动需要自己处理对PDO 和对FDO的PNP请求的差别之处。处理这个问题的一个方法是定义公共的设备扩展结构, 下面是示例代码: //The FDO extension typedefstruct _DEVICE_EXTENSION { ULONG flags; }DEVICE_EXTENSION, *PDEVICE_EXTENSION; //The PDO extension typedef struct _PDO_EXTENSION { ULONG flags; }PDO_EXTENSION, *PPDO_EXTENSION; //The Commen part typedef struct _COMMON_EXTENSION { ULONG flags; }COMMON_EXTENSION, *PCOMMON_EXTENSION; #define ISPDO 0 那么,dispatch例程看起来会是这样: NTSTATUS DispatchSomething(PDEVICE_OBJECT DeviceObject, PIRPIrp) { PCOMMON_EXTENSION pcx = (PCOMMON_EXTENSION)

文档评论(0)

牛X文档 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档