1 / 12

USB 驱动程序的设计

USB 驱动程序的设计. 艾小溪. WDM 简介. WDM 是微软最新推出的一种驱动程序模型。 采用分层驱动的方法,即在用户应用程序和硬件之间存在几个不同的驱动程序。 每个驱动程序对应一层,且不同层上的驱动程序可以相互调用。. WDM 层次结构. 总线驱动程序:已经包含在操作系统里了,用户不必安装。 功能驱动程序:实现设备的具体功能,一般由生产商来编写。分为类驱动程序和微型驱动程序,前者实现某一类设备的常用操作,由微软提供;后者由开发者编写去处理具体设备的特殊操作。 过滤驱动程序:拦截对具体设备,类设备,总线的请求,做相应的处理,以改变设备的行为或添加新的功能。.

nyla
Download Presentation

USB 驱动程序的设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. USB驱动程序的设计 艾小溪

  2. WDM简介 • WDM是微软最新推出的一种驱动程序模型。 • 采用分层驱动的方法,即在用户应用程序和硬件之间存在几个不同的驱动程序。 • 每个驱动程序对应一层,且不同层上的驱动程序可以相互调用。

  3. WDM层次结构 • 总线驱动程序:已经包含在操作系统里了,用户不必安装。 • 功能驱动程序:实现设备的具体功能,一般由生产商来编写。分为类驱动程序和微型驱动程序,前者实现某一类设备的常用操作,由微软提供;后者由开发者编写去处理具体设备的特殊操作。 • 过滤驱动程序:拦截对具体设备,类设备,总线的请求,做相应的处理,以改变设备的行为或添加新的功能。

  4. WDM功能模块组成 • 驱动程序初始化 • 创建和删除设备 • 处理WIN32程序打开和关闭句柄的请求 • 处理WIN32程序输入/输出的请求 • 实现对设备的串行化访问 • 访问硬件 • 取消I/O请求 • 超时I/O请求 • 调用其他驱动程序 • 处理电源管理请求 • 使用Windows管理诊断(WMI )向系统管理员报告 • 处理一个可热插拔设备被加入或删除的情况

  5. USB驱动程序介绍 • USB驱动程序的编写采用WDM驱动程序。 • 分为底层驱动程序和功能驱动程序,后者由开发者编写 。 • 功能驱动程序位于底层驱动程序的上面不与实际的硬件打交道。 应用程序调用Windows API函数 I/O管理器构造IRP USB功能驱动程序构造新的IRP USB底层驱动程序执行响应的操作(如对USB设备读取数据)

  6. WDM驱动程序是一些例程的集合,等待主机系统软件(PnP管理器,I/O管理器,电源管理器等)调用或激活它们。WDM驱动程序是一些例程的集合,等待主机系统软件(PnP管理器,I/O管理器,电源管理器等)调用或激活它们。 • 一个WDM驱动程序基本组成包括一下5个例程: • 驱动程序入口例程:处理驱动程序的初始化 • 即插即用例程:处理PnP设备的添加、删除和停止 • 分发例程:处理用户应用程序发出的各种I/O请求 • 电源管理例程:处理电源管理请求 • 卸载例程:处理驱动程序的卸载

  7. 一般的驱动程序 驱动程序入口,在启动驱动程序的时候,操作系统将调用这个入口。 。DriverEntry除了做一些必 要的设备初始化工作外,还初始化一些Dispatch例程入口。 • DriverEntry(…) { … DeviceObject->MajorFunction[IRP_MJ_CREATE] = XXDriverCreateClose; //XX对应的是你自己给你的驱动程序的命名DeviceObject->MajorFunction[IRP_MJ_CLOSE] = XXDriverCreateClose; DeviceObject->MajorFunction[IRP_MJ_READ] = XXDriverReadWrite; DeviceObject->MajorFunction[IRP_MJ_WRITE] = XXDriverReadWrite; … } XXDriverCreateClose(…) // 对应IRP_MJ_CREATE和IRP_MJ_CLOSE的例程 { //………. } XXDriverDeviceControl(…)// 对应IRP_MJ_DEVICE_CONTROL的例程 { //………. } XXDriverReadWrite(…) // 对应IRP_MJ_READ和IRP_MJ_WRITE的例程 { //………. }

  8. 应用程序和设备驱动程序打交道主要是通过CreateFile、 ReadFile、WriteFile和DeviceIoControl等Win32 API来进行的。 • 这些API其实都对应着驱动程序的一些Dispatch例程。例如调用Win32 API CreateFile的时候,操作系统最终转化为对驱动程序IRP_MJ_CREATE功能代码所对应的 Dispatch例程的调用,如果驱动程序没有提供该例程, CreateFile调用就会失败。

  9. 功能代码                                                                  说明 IRP_MJ_CREATE                                                 打开设备CreateFileIRP_MJ_CLEANUP                                              在关闭设备时,取消挂起的I/O请求CloseHandleIRP_MJ_CLOSE                                                   关闭设备CloseHandleIRP_MJ_READ                                                    从设备获得数据ReadFileIRP_MJ_WRITE                                                       向设备发送数据WriteFileIRP_MJ_DEVICE_CONTROL                               对用户模式或内核模式客户程序可用的控制操作DeviceIoControlIRP_MJ_INTERNAL_DEVICE_CONTROL            只对内核模式客户程序可用的控制操作 IRP_MJ_QUERY_INFORMATION                           得到文件的长度GetFileLengthIRP_MJ_SET_INFORMATION                                 设置文件的长度SetFileLengthIRP_MJ_FLUSH_BUFFERS                                  写输出缓冲区或丢弃输入缓冲区 FlushFileBuffersFlushConsoleInputBufferPurgeCommIRP_MJ_SHUTDOWN                                           系统关闭InitialSystemShutdown

  10. 驱动程序开发环境 • 一是利用微软提供的WIN(2K,XP)DDK驱动程序开发包,另一个是专用驱动程序开发工具,如CompuwareNumega公司提供的DriverStudio。 • 本系统采用DDK开发WDM驱动程序,开发工作包括:开发环境设置(VC编译环境)、驱动程序设计、INF文件设计。

  11. 开发驱动程序的基本步骤 • 1、 写一个DriverEntry例程,在里面调用IoCreateDevice创建 一个Device对象。 • 2、 写一个处理IRP_MJ_CREATE请求的Dispatch例程的基本框架 (当然写了DispatchCreate例程后, 要在DriverEntry例程为IRP_MJ_CREATE初始化例程入口)。如果驱动程序创建了多于一个Device对象,则必须为IRP_MJ_CLOSE 请求写一个例程,该例程通常情况下可以和DispatchCreate共用一个例程。 • 3、 编译连接你的驱动程序。

More Related