基于DDK的USB接口WDM驱动开发

合集下载

WDM驱动开发之路(1)

WDM驱动开发之路(1)

WDM驱动开发之路(1)WDM开发之路(1)--驱动开发网WDM教程WDM驱动开发之路写在前面:在专栏的前几期中,我们一起初步学习了vxd的开发技术。

Vxd技术是很深奥的,不是一篇两篇文章能讲清楚,但你已经入了门,剩下的就要看你的修行了。

多看书,多泡论坛(当然是上咱们的驱动开发网论坛了:->),多写程序…我的手不够用了。

功到自然成嘛。

不过话又说回来,vxd只是权宜之计,WDM才符合当今的潮流(程序员都是时髦人士,君不见先是VB、VC然后是asp、JSP、PHP,数也数不过来呀),Win9x寿终正寝时也就是vxd的末日,你不想随它而去吧(开个玩笑),那就随我来。

按笔者的想法,这篇文章写成连载形式,一次讲一个主题,并且必要时带着例子,让大伙step by step地把WDM驱动弄个透底,不想让大家觉得稀里糊涂,也不想让大家觉得白买杂志了。

今天我们一起讨论第一部分,了解篇。

(一)了解篇WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。

它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。

不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。

作为驱动开发人员来说,它在两者中有很多的不同。

并且Windows98中的WDM只能算是Windowss2000中的WDM的一个了集。

在Windows98中有一些驱动程序只能使用VXD来实现,如串行通讯驱动等。

要写驱动程序,首先要了解操作系统的结构。

在WDM体系中,windows2000操作系统中是最标准的实现方式,Windows98则是部分兼容WDM结构。

照微软的说法,Windows98和Windows2000 X86(Intel 架构)版本实现二进制码兼容(参见98DDK),Windows2000 x86版本与其它CPU平台版本实现源码级兼容(因为Windows 2000是基本NT相似的结构,最底层是硬件抽象层HAL,所有我们相信它们之间能源码级兼容)。

基于WINDOWS DDK的USB键盘驱动开发

基于WINDOWS DDK的USB键盘驱动开发








…Leabharlann …一美展. 。 I
基  ̄' W I N DOW S DD K的 USB键 盘 驱 动 开 发
江西赣 州农 业学校 卢晓娟 陈根生
【 摘要】U S B 接 口具有方便快速 等优 点, 已经发展成为一种 比较普遍 的计 算机 与外设 的接口。基于微软w i n d o ws 统D DK,本 文介 绍了一种非标准U S B 键盘  ̄w i n d o w s 设 备 驱 动程序的开发过程与方法 。 【 关键 词】设备驱动 ;驱动开发包 ;非标准键 盘
1 . 引言
w i n m a i n 函数 的控制 下执行 ,驱动 程序不 存在
U S B 总线 的成功 关键 是使用 户感 到 了使 用 这样 的 函数 ,而 只是 一个 由I / 0 管理 组件 根据 U S B 设备 的方便 。即插 即用 ( P n P ) 概念的使用 使 需要 调用 的子例 程 的集合 ,i / 0 管理 组件 根据 某 些硬 件的 安装过 程得 到 了简 化 。U S B 规范 中 不 同的情 况调用 驱动程序 中不同的例程 。构成 指 出,适合迁 移 ̄U S B I . 1 上 的硬 件限定于那 些 内核模 式驱动程序 的主要例程 包括 :初 始化和 / o 系 统服务 调度 例程 ,数据 传输 低 速到 中速 的外设 ,包括键盘 ,鼠标等 。即这 清 除例程 ,i 些 设备 的数据 传输速率低 于1 2 M b / s e c ,并且 能 例程和 资源 回调例程 ,下面 是一个基本 的驱动
通 过单一 的P c 接 口被 系统软件识 别。现在标 准 例程架构 : e x t e r n” C” 的u s b 键盘 设备只 需要 遵循一些h i d 设备 的协 议 N T S T A T U S 就 可 以被 w i n d o w s 操 作系 统 自动 识别无 需设备 制造 商开发驱 动程序 ,但 有些键盘 带有特殊 功 D ri v e r E nt r Y( I N P D RI V E R — O B J EC T

USB驱动程序的编写采用WDM 驱动程序

USB驱动程序的编写采用WDM 驱动程序

USB驱动程序的编写采用WDM 驱动程序。

WDM 驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件(PnP 管理器、I/O 管理器、电源管理器等)来调用或激活它们。

具体驱动程序不同,其所包含的例程也不同。

一个WDM 驱动程序的基本组成包括以下5个例程:(1)驱动程序入口例程:处理驱动程序的初始化。

(2)即插即用例程:处理PnP 设备的添加、删除和停止。

(3)分发例程:处理用户应用程序发出的各种 I/O 请求。

(4)电源管理例程:处理电源管理请求。

(5)卸载例程:处理驱动程序的卸载。

包含文件:ezusbsys.c, ezusbsys.h,ezusbsys.rc, resource.h, version.h, makefile,sources)在ezusbsys.c文件中,包含了上述五个例程:ezusbsys.h中定义了各种数据结构还有各种IOCTL控制码,用于不同数据的读写。

Ezusbsys.c 中实现了各种驱动例程。

包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动程序入口例程得出一些信息。

驱动程序入口例程:NTSTATUSDriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){NTSTATUS ntStatus = STATUS_SUCCESS;PDEVICE_OBJECT deviceObject = NULL;DriverObject->MajorFunction[IRP_MJ_CREATE] = Ezusb_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ezusb_Close;//分发例程DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Ezusb_ProcessIOCTL;//即插即用例程DriverObject->MajorFunction[IRP_MJ_PNP] = Ezusb_DispatchPnp;//电源管理例程DriverObject->MajorFunction[IRP_MJ_POWER] = Ezusb_DispatchPower;//设备添加例程DriverObject->DriverExtension->AddDevice = Ezusb_PnPAddDevice;//卸载例程DriverObject->DriverUnload = Ezusb_Unload;return ntStatus;}在原有框架下,主要实现了的代码段在于ezusbsys.c文件中的如下例程:NTSTATUSEzusb_Read_Write( IN PDEVICE_OBJECT fdo, IN PIRP Irp )在该例程中实现对大数据块的读写控制和实现。

USB驱动程序的编写采用WDM驱动程序

USB驱动程序的编写采用WDM驱动程序

U S B驱动程序的编写采用W D M驱动程序Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】USB驱动程序的编写采用WDM 驱动程序。

WDM 驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件(PnP 管理器、I/O 管理器、电源管理器等)来调用或激活它们。

具体驱动程序不同,其所包含的例程也不同。

一个WDM 驱动程序的基本组成包括以下5个例程:(1)驱动程序入口例程:处理驱动程序的初始化。

(2)即插即用例程:处理PnP 设备的添加、删除和停止。

(3)分发例程:处理用户应用程序发出的各种 I/O 请求。

(4)电源管理例程:处理电源管理请求。

(5)卸载例程:处理驱动程序的卸载。

包含文件:, ,, , , makefile,sources)在文件中,包含了上述五个例程:中定义了各种数据结构还有各种IOCTL控制码,用于不同数据的读写。

中实现了各种驱动例程。

包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动程序入口例程得出一些信息。

驱动程序入口例程:NTSTATUSDriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){NTSTATUS ntStatus = STATUS_SUCCESS;PDEVICE_OBJECT deviceObject = NULL;DriverObject->MajorFunction[IRP_MJ_CREATE] = Ezusb_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ezusb_Close; ources. If you want to add a new source # file to thiscomponent. This file merely indirects to the real make file # that is shared by all thedriver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV) 不要编辑这个文件。

USB驱动开发实例

USB驱动开发实例

USB驱动开发实例本节具体介绍如何进行USB驱动的开发,本节采用的源码来源自DDK的源程序,其位置在DDK子目录的src\wdm\usb\bulkusb目录下。

该示例很全面地支持了即插即用IRP的处理,也很全面地支持了电源管理,同时很好地支持了USB设备的bulk读写。

如果从头开发USB驱动,往往很难达到USB驱动的稳定性,所以强烈建议读者在此驱动修改的基础上进行USB驱动开发。

1 功能驱动与物理总线驱动DDK已经为USB驱动开发人员提供了功能强大的USB物理总线驱动(PDO),程序员需要做的事情是完成功能驱动(FDO)的开发。

驱动开发人员不需要了解USB如何将请求转化成数据包等细节,程序员只需要指定何种管道,发送何种数据即可。

当功能驱动想向某个管道发出读写请求时,首先构造请求发给USB总线驱动。

这种请求是标准的USB请求,被称为URB(USB Request Block),即USB请求块。

这种URB被发送到USB物理总线驱动以后,被USB总线驱动所解释,进而转化成请求发往USB HOST 驱动或者USB HUB驱动,如图17-21所示。

图17-21 总线驱动与功能驱动的关系可以看出,USB总线驱动完成了大部分工作,并留给USB功能驱动标准的接口,即URB请求。

USB驱动开发人员只需要根据不同的USB设备的设计要求,在相应的管道中发起URB 请求即可。

2. 构造USB请求包USB驱动在与USB设备通信的时候,如在控制管道中获取设备描述符、配置描述符、端点描述符,或者在Bulk管道中获取大量数据,都是通过创建USB 请求包(URB)来完成的。

URB中填充需要对USB的请求,然后将URB作为IRP的一个参数传递给底层的USB总线驱动。

在USB总线驱动中,能够解释不同URB,并将其转化为USB总线上的相应数据包。

DDK提供了构造URB的内核函数UsbBuildGetDescriptorRequest,其声明如下:VOID UsbBuildGetDescriptorRequest(IN OUT PURB Urb,IN USHORT Length,IN UCHAR DescriptorType,IN UCHAR Index,IN USHORT LanguageId,IN PVOID TransferBuffer OPTIONAL,IN PMDL TransferBufferMDL OPTIONAL,IN ULONG TransferBufferLength,IN PURB Link OPTIONAL);z Urb:用来输出的URB结构的指针。

基于WDM模型的USB设备驱动程序开发

基于WDM模型的USB设备驱动程序开发

通 用串 行总 线 US ( i r l ea B s是 C m a、B 等 B Un es rl u) v a S i o pqIM
P C大 厂商 联合 开发 的一种 新型 的 、 于令 牌 的 、 速 的串 行 总线 基 高
标准 。它具 有许 多其 他 总 线 无 法 比拟 的 优 点 。由 于 其 能够 以较
动程 序模 式 。它 源于 Wi o s T 的 分层 3 设备 驱 动 程序 模 n w d N 2位
型, 支持更多的特性 , 如即插即用( n , l n l )电源管理 P P Pu adP y 、 g a
( M。 o e Maae n) Wi o s管 理 诊 断 ( P P w T ngmet、 n w d WMI Wi o s , n w d
前的 U B20协议 速 度高 达 40 p。c S . 8 Mbs .易 于扩 展 。通 过 使 用
WI 20 N 0 0间实现源 代码 级 兼容 , 为 Wi o s 它 n w 操作 系统的 设备 驱 d
动 程序 提供 了统 一的框 架 , Wi o s 台上 , M 将 成 为主流 在 n w平 d WD
象( uc0aD v eO j tF O 。在 FX 的上 面 和下 面 还会 有 F ntnl ei b c,1 ) i c e ) I)

些 过滤 器设 备 对象 ( ie D v e i t。位 于 F O上 面 的 过 Flr i e ) t c Ob e e D
Maae I tls u ettn 和 N 事 件 。 并 能 在 WI 9 ngI n nt m nao ) T r e i T N 8和
U B是把低 速 或 中 速 外 部 设 备 连 接 到 计 算 用 方 便 。支 持 热 拔插 , 涉 及 中 断 请 求 a 不 (R ) I Q 冲突 等 问题 , 真正 做到 。 能 即插 即用 ’ b 。 .传输 速 率 高 。目

《设备驱动程序开发技术》大作业

《设备驱动程序开发技术》大作业

《设备驱动程序开发技术》大作业WDM驱动程序的开发流程和要点班级:计算机科学与技术1004摘要DWDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。

它源于 Windows NT的分层32位设备驱动程序模型,它支持更多的特性,如即插即用( PnP ,Plug and Play )、电源管理( PM ,Power Management )、Windows管理诊断( WMI ,Windows Management Instrumentation )和 NT 事件。

它为Windows操作系统的设备驱动程序提供了统一的框架,在Windows平台上,WDM将成为主流的驱动模式。

WDM是Windows98和Windows2000使用的新的驱动程序设计规范。

使用WDM使得硬件驱动程序更加稳定,让操作系统对硬件更加有效地控制硬件。

除了定义一个驱动程序与操作系统连接的标准接口以外,WDM也指明了驱动程序应该采用的更加模块化的设计。

关键词: WDM、驱动程序、操作系统1 概述WDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。

相对于以前的KDM、VXD来说,它的性能更高、系统之间移植更加方便。

随着Microsoft的操作系统的不断升级,WDM已逐步取代了KDM、VXD,成为了Microsoft系统下驱动程序开发的主流。

WDM是通过一个128位的全局唯一标识符(GUID)实现驱动程序的识别。

应用程序与WDM 驱动程序通信时,应用程序将每个用户请求形成I/O请求包(IRP)发送到驱动程序。

驱动程序识别出IRP请求后指挥硬件执行相应操作。

2 WDM驱动模型WDM模型为存在于Windows 98和Windows 2000操作系统中的设备驱动程序提供了一个参考框架。

开发WDM型USB设备驱动程序

开发WDM型USB设备驱动程序

开发WDM型USB设备驱动程序USB设备驱动程序开发⼯具开发USB设备驱动程序需要专门的开发⼯具,⽬前应⽤⼴泛的⼯具主要有两⼤类。

⼀类是Microsoft公司提供的Windows DDK(Device Driver Kit)。

它有Windows 98 DDK 和Windows 2000 DDK两个版本。

Windows 98 DDK能够开发Windows 95/98/Me/NT下的VxD、KMD和WDM驱动程序。

Windows 2000 DDK 能够开发Windows 98/Me/NT/2000下的KMD和WDM驱动程序。

由于DDK基于汇编语⾔的编程⽅式和内核模式的调⽤,对没有深厚的OS原理和编程⽔平的⼈员来说,任务相当艰巨。

另⼀类是NuMega公司提供的DriverStudio,它是⼀个⼤的开发⼯具包,包含VtoolsD、SoftICE和DriverWorks等开发⼯具。

VtoolsD开发包提供了对VxD编程的C/C++类库⽀持,利⽤VtoolsD中的QuickVxD⼯具可以快速⽣成VxD的C/C++代码框架,开发者可以在此基础上根据各⾃的需要添加⾃⼰的代码。

DriverWorks⽤于开发KMD和WDM驱动程序,并且对DDK函数进⾏了类的封装,从⽽为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供了⼀个⾃动化的⽅法。

DriverWorks,提供了VC++下的开发向导Driver Wizard,按照它的提⽰可以迅速地⽣成驱动程序的框架。

这个框架结构提供可以正确执⾏WDM动态环境中IRP的请求,⽽且,也包含⽤于简化系统提供的标准类驱动程序(如HID、流)和总线驱动程序(如PCI和USB)接⼝的类等。

总之,利⽤DriverWorks开发WDM驱动程序,可以⼤⼤简化开发⼈员的⼯作量、缩短开发周期以及降低开发驱动程序的难度。

[1]⽤DriverWorks开发WDM型USB设备驱动程序要想使⽤DriverWorks,必须先安装以下软件:DriverStudio2.5,VisualStudio6.0,以及Windows2000DDK。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于DDK的USB接口WDM 驱动开发一、WDM介绍在Windows2000 系统中,软件要么执行在用户模式,要么执行在内核模式。

在x86 计算机上,当用户模式程序需要读取设备数据时,先是通过系统服务接口调用内核模式的服务例程,内核模式的服务例程首先检查传递给它们的参数,然后创建一个称为“I/ O 请求包( IRP) ”的数据结构,并把这个数据结构送到指定驱动程序的入口,执行IRP 的设备驱动程序通过硬件抽象层(HAL) 访问硬件读取数据。

设备驱动程序是一个软件组件,装入后即成为操作系统内核的一部分,为硬件和用户应用程序提供通信桥梁。

Windows 2000 系统可以使用多种驱动程序,包括虚拟设备驱动程序和内核模式驱动程序, PnP 驱动程序是一种遵循Windows 2000 即插即用协议的内核模式驱动程序, 而WDM 驱动程序又是一种PnP 驱动程序。

WDM(Windows Driver Model) 是Microsoft 公司推出的新型驱动程序模型,它增加了对即插即用( PnP) 、电源管理( Power Management) 、WMI 的支持。

在一个WDM 驱动程序模型中,每个硬件至少有两个驱动程序:一个是功能驱动程序, 负责初始化I/ O 操作、处理I/ O 操作完成时所带来的中断事件并为用户提供一种设备适合的控制方式; 另一个是总线驱动程序,负责管理硬件与计算机的连接[1 ] 。

WDM 驱动程序模型使用了如图1 所示的层次结构[2 ] ,一旦总线驱动程序检查到新硬件存在,则响应PnP 管理器的IRP- MN- QUERY- DEVICE- RELATIONS 请求并创建一个PDO ,之后PnP 管理器参照注册表中的信息载入与这个PDO 相关的过滤器和功能驱动程序,驱动程序调用AddDevice 例程构建相应设备对象。

AddDevice 例程通常是调用IoCreateDevice 函数创建设备对象,并用IoAttachDeviceToDeviceStack 函数把设备对象连接到当前设备堆栈的顶部,完成如图1 所示层次结构的构造。

之后, PnP 管理器向该设备的驱动程序发出副功能码为IRP- MN- START- DEVICE 的IRP ,为其分配资源并启动设备。

之后,该设备将进入启动状态,可以开始通信。

图1 WDM 中设备对象和驱动程序的层次结构Windows 2000 中, I/ O 管理器使用驱动程序对象来代表设备驱动程序,当操作系统加载一个驱动程序时, I/ O 管理器负责为其建立一个驱动程序对象,而驱动程序栈中的每个驱动程序都要为其控制的设备建立一个设备对象( 如图1所示) 。

驱动程序对象和设备对象是WDM驱动程序中两种非常重要的数据结构,它们结构形式和两者之间的关系如图2 所示。

图2 驱动程序对象与设备对象的结构以及它们之间的关系如前所述,Windows2000 操作系统使用I/ O 请求包( IRP) 的数据结构与内核模式驱动程序通信, 所以IRP 在WDM 驱动程序中也起着至关重要的作用,因此要掌握WDM 驱动开发, 还必须正确理解和使用IRP。

IRP 数据结构定义于wdm. h文件中,其重要的域有MdlAddress、AssociatedIrp 、IoStatus、CurrentLo2cation、PendingReturned、CancelRoutine 以及Tail 。

其中, CurrentLocation 为非透明域, 它和Tail. Overlay.CurrentStackLocation( PIO- STACK- LOCATION) 都没有公开给驱动程序使用。

CurrentLocation 为当前I/ O堆栈单元的索引而CurrentStackLocation 就是指向它的指针。

当某个“实体”创建IRP 时,同时还创建了一个与之关联的I/ O 堆栈( IO- STACK- LOCATION) 结构数组。

I/ O 堆栈中重要的域有MajorFunction、Mi2norFunction、Parameters、DeviceObject 、Completion2Routine 等。

MajorFunction 域为IRP 的主功能码,与驱动程序对象中MajorFunction 表的某个派遣函数指针相对应,而MinorFunction 是该IRP 的副功能码。

De2viceObject 是与该堆栈单元对应的设备对象的地址,由IoCallDriver 函数填写。

因此,可以清晰地给出WDM驱动程序模型中非常重要而又难于理解的IRP、I/ O堆栈、设备对象以及驱动程序对象之间的关系,如图3所示( 图中只给出重要的域) 。

至此, 已经对一个WDM 驱动程序的核心数据结构有了完整的了解。

一个完整的WDM 驱动程序就像一个包含许多例程的容器,当操作系统遇到一个IRP 时,它就调用驱动程序中的例程来执行该IRP 相关的各种操作。

一个WDM 驱动程序的基本例程有驱动程序人口例程、即插即用例程、分发例程、电源管理例程和卸载例程,而一些复杂的WDM 驱动程序还包含中断服务例程( ISR) 、延时过程调用(DPC) 等例程,一些高级的驱动程序还将处理IRP 串行化、同步、WMI、DMA 等问题,因此,开发WDM 驱动程序的主要工作就是根据具体设备的要求实现这些例程。

图3 IRP、I/ O 堆栈、设备对象以及驱动程序对象之间的关系二、Win32驱动程序模型在Windows内执行的USB设备驱动程序,必须符合Microsoft定义的Win32驱动程序模型(Win32 Driver Model,WDM)规范.。

WDM使用在Windows 98及Window2000/XP系统内。

这些驱动程序称为WDM驱动程序,文件的扩展名是“.sys”。

三、Windows如何选择驱动程序当Windows检测到一个新的USB设备时,有一件必须做的事情找到此设备的驱动程序,并且在需要时加载此驱动程序。

这是Windows的设备管理器的工作,设备管理器使用类别和设备安装程序及“*.inf”文件,来寻找符合的驱动程序。

设备管理器位于Windows的控制面板中,负责安装、设置以及移除设备,另外还将设备的信息注册部署在系统注册表内。

四、USB驱动程序设计一个完整的USB 系统包括主机和USB 设备,其多层次的通信模型如图4 所示[4 ] ,其中,USB 主控制器负责处理主机与设备之间电气和协议层的互连,USB 系统还使用USB 主控制器来管理主机和USB 设备之间的数据传输,而应用软件不能直接访问USB 设备硬件。

微软提供的一组驱动程序占据了图4 中USB系统软件方块的底部,包括主控制器驱动程序(OPEN2HCI. SYS 或者UHCD. SYS) ,hub 驱动程序(USBHUB.SYS) ,和一个类驱动程序(USBD. SYS) ,更具体的USB 驱动结构如图5 所示。

图4 USB 通信模型图5 USB 驱动体系结构通常,一个USB 设备可以有一个或者多个配置,每个配置可有一个或多个接口,一个接口又可有一个或多个端点,它们分别与各自的描述符对应,可通过发送一个类型为- URB- CONTROL - DESCRIPTORREQUEST的URB 来获取这些信息。

在USB 系统中,USB 设备驱动程序一般不直接与硬件通信,而是通过创建URB 并把URB 提交到总线驱动程序来完成相应操作。

URB 是USB 请求块的缩写,它是一种共用体类型的数据结构,在DDK 的usb2di . h[3 ]文件中有定义,其成员中除了- URB- HEADER外的其他成员均以- URB- HEADER 结构开始, 即-URB- HEADER 是每个URB 的开始,其定义如下:struct - URB - HEADER {USHORT Length ;USHORT Function ;USBD - STATUS Status ;/ / 仅由USBD 使用的域⋯⋯} ;Length 字段指明了URB 所含的字节数, Function字段指明了URB 的功能代码,两者应在使用URB 前设置,而各个URB 结构的具体定义可参考DDK 中的相关定义。

可以说,在理解了WDM 驱动程序模型的基础上,理解URB 和- URB- HEADER 结构就成了掌握WDM型USB 驱动程序的关键。

根据USB 协议[4 ] ,USB 的数据传输方式有4 种:块( bulk ) 、控制( control ) 、中断( interrupt ) 、同步(isochronous) 。

为了进行数据传输,通常有两种方法可以创建URB :一种是用DDK定义的宏;另一种是手动创建。

在系统中,图像数据采用块传输,而控制命令采用控制传输。

下面是用DDK定义的宏创建和发送块传输类型的URB 的关键代码:{ ⋯⋯/ / 创建URBURB urb ;UsbBuildInterruptOrBulkTransferRequest ( &urb , sizeof ( - URB -BUL K- OR - INTERRUPT - TRANSFER) ,hpipe ,NULL , Irp - >MdlAddress ,ubufferlength ,USBD - TRANSFER - DIRECTION - IN| USBD - SHORT - TRANSFER - OK, NULL) ;⋯⋯/ / 发送URBPIRPIrp = IoBuildDeviceIoControlRequest ( IOCTL - INTERNAL - USB -SUBMIT - URB ,pdx - > StackDeviceObject ,NULL ,0 ,NULL ,0 ,TRUE , &event , &iostatus) ;PIO - STACK- LOCATION stack = IoGetNext IrpStackLocation( Irp) ;/ *IO堆栈* /stack - > Parameters. Others. Argument1 = ( PVOID) urb ;/ * 把URB 的地址填入I/ O 堆栈的Parameters. Others. Ar gument1 域* /NTSTATUS status = IoCallDriver ( pdx - > StackDeviceObject ,Irp) ;/ *发送请求到下一层驱动程序* / }由于控制命令的数据较少, 可用- URB- CON2TROL - VENDOR- OR- CLASS- REQUEST 类型的URB 来完成, 此URB 可用宏UsbBuildVendorRequest构造,若在某些特殊场合需要自己构造一个控制传输的URB(手动创建) 时,其代码应具有如下格式:{PURB urb = NULL ;urbSize = sizeof (struct - URB - CONTROL - TRANSFER) ;urb = ExAllocatePool (NonPagedPool ,urbSize) ;RtlZeroMemory(urb ,urbSize) ;urb - > UrbHeader . Length = sizeof ( struct - URB - CONTROL -TRANSFER) ;urb - > UrbHeader . Function = URB - FUNCTION - CONTROL -TRANSFER;/ / 功能代码/ / 设置其他域urb - > UrbControlTransfer . PipeHandle = pipehandle ;⋯⋯}五、inf文件介绍.inf是一个文本文件,此文件用来告诉Windows使用哪一个驱动程序,以及储存在注册表内的设备信息。

相关文档
最新文档