构造USB过滤驱动程序.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
构造USB过滤驱动程序

电子下载站 资料版权归合法所有者所有 严禁用于商业用途 如何构造一个简单的USB过滤驱动程序 本文分三部分来介绍如何构造一个简单的 USB 过滤驱动程序,包括“基本原理”、“程序的 实现”、“使用 INF 安装”。此文的目的在于希望读者了解基本原理后,可以使用除 DDK 以 外最流行也最方便的驱动开发工具 DriverStudio 来实现一个自己的过滤驱动,并正确地安 装。 一、基本原理 我们知道,WDM(和 KDM)是分层的,在构造设备栈时,IO 管理器可以使一个设备对象附加到 另外一个初始驱动程序创建的设备对象上。与初始设备对象相关的驱动程序决定的IRP,也将 被发送到附加的设备对象相关的驱动程序上。这个被附加的驱动程序便是过滤驱动程序。如 右图,过滤驱动可以在设备栈的任何层次中插入。IO管理器发出的IRP将会沿着右图的顺序 从上往下传递并返回。因此,我们可以使用过滤驱动程序来检查、修改、完成它接收到的IRP, 或者构造自己的IRP。 上面这种文字是很枯燥的,好在“前人”已经写过一些范例以供我们更好地理解这些概 念。读过 Waltz Oney 的《Programming Windows Driver Mode》一书的读者大概都知道 Waltz Oney 提供的范例中有一个关于 USB 过滤器(第九章)的例子,而在此基础上, 《USB Design By Example》()的作者 John Hyde 实现了一 个USB键盘过滤驱动程序,即给此程序增加了一个“拦截(Intercept)”功能来处理USB键盘 的 Report 以实现特定的功能:当驱动程序在 IRP_MJ_INTERNAL_DEVICE_CONTROL 设置的完成 例程从USB设备拦截到一个Get_Report_Descriptor时,拦截程序将此Descriptor中的USAGE 值从“Keyboard”改为“UserDefined”,再返回给系统。 我们可以从这个例子中获得一些灵感,比如,在Win2k下,键盘是由OS独占访问的,我们可 以通过这种方式使之可以让用户自由访问;我们也可以拦截其他 Report_Descriptor,将部 分键重新定义,以满足特殊的要求;如果你愿意再做一个用户态的程序,你还可以将你拦截 到的键值传递给你的用户态程序,以实现象联想、实达等国内电脑大厂出品的那些键盘上的 各种实用的功能。 二、程序的实现 Waltz Oney和John Hyde的例子已经写得很详细了,读者可以不用修改一个字节便顺利地编 译生成一个过滤驱动程序。本文的目的在于使用DriverStudio组件Driverworks来实现同样 的功能。 相信读者读到这篇文章时,已经对 DriverStudio 有了很多的了解。DriverStudio 作为一个 以 C++为基础的“快速”驱动开发工具,它封装了基本上所有的 DDK 的函数,其集成在 VC++ 中的DriverWizard,可以很方便地引导你完成设备驱动程序开发的全过程,能根据你的硬件 种类自动生成设备驱动程序源代码,并提供了很多范例程序。当然,这些例子中便包含一个 USB Filter 驱动程序的框架。在不侵犯版权的前提下,充分利用现有共享的、免费的、授权 的代码是我们的一贯作法。我们下面便以此范例为基础来作修改。 我们的目的是做一个 HID 小驱动程序 hidusb.sys 的 Lower Filter,它附加在“人机接口设 备” ,通过拦截 USB 的 Get_Report_Descriptor 来修改其返回值,当它发现该 Descriptor 的 Usage 为“Keyboard”时,将其改为“UserDefined”,如此我们便可以完全控制这只键 盘。具体做法是,拦截 IRP_MJ_INTERNAL_DEVICE_CONTROL,并检查其 IOCTL 代码及 URB,如 果满足 IOCTRL 功能代码为 IOCTL_INTERNAL_USB_SUBMIT_URB 以及 URB 功能代码为 欢迎光临中国最大的电子工程师应用网站 网址: 电子下载站 资料版权归合法所有者所有 严禁用于商业用途 URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 的 条 件 , 即 上 层 驱 动 发 来 Get_Report_Descriptor请求时,设置一个完成例程,在这个完成例程中,我们将判断Usage 的值,将Usage由“6(Keyboard)”

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档