120 likes | 318 Views
USB 驱动程序的设计. 艾小溪. WDM 简介. WDM 是微软最新推出的一种驱动程序模型。 采用分层驱动的方法,即在用户应用程序和硬件之间存在几个不同的驱动程序。 每个驱动程序对应一层,且不同层上的驱动程序可以相互调用。. WDM 层次结构. 总线驱动程序:已经包含在操作系统里了,用户不必安装。 功能驱动程序:实现设备的具体功能,一般由生产商来编写。分为类驱动程序和微型驱动程序,前者实现某一类设备的常用操作,由微软提供;后者由开发者编写去处理具体设备的特殊操作。 过滤驱动程序:拦截对具体设备,类设备,总线的请求,做相应的处理,以改变设备的行为或添加新的功能。.
E N D
USB驱动程序的设计 艾小溪
WDM简介 • WDM是微软最新推出的一种驱动程序模型。 • 采用分层驱动的方法,即在用户应用程序和硬件之间存在几个不同的驱动程序。 • 每个驱动程序对应一层,且不同层上的驱动程序可以相互调用。
WDM层次结构 • 总线驱动程序:已经包含在操作系统里了,用户不必安装。 • 功能驱动程序:实现设备的具体功能,一般由生产商来编写。分为类驱动程序和微型驱动程序,前者实现某一类设备的常用操作,由微软提供;后者由开发者编写去处理具体设备的特殊操作。 • 过滤驱动程序:拦截对具体设备,类设备,总线的请求,做相应的处理,以改变设备的行为或添加新的功能。
WDM功能模块组成 • 驱动程序初始化 • 创建和删除设备 • 处理WIN32程序打开和关闭句柄的请求 • 处理WIN32程序输入/输出的请求 • 实现对设备的串行化访问 • 访问硬件 • 取消I/O请求 • 超时I/O请求 • 调用其他驱动程序 • 处理电源管理请求 • 使用Windows管理诊断(WMI )向系统管理员报告 • 处理一个可热插拔设备被加入或删除的情况
USB驱动程序介绍 • USB驱动程序的编写采用WDM驱动程序。 • 分为底层驱动程序和功能驱动程序,后者由开发者编写 。 • 功能驱动程序位于底层驱动程序的上面不与实际的硬件打交道。 应用程序调用Windows API函数 I/O管理器构造IRP USB功能驱动程序构造新的IRP USB底层驱动程序执行响应的操作(如对USB设备读取数据)
WDM驱动程序是一些例程的集合,等待主机系统软件(PnP管理器,I/O管理器,电源管理器等)调用或激活它们。WDM驱动程序是一些例程的集合,等待主机系统软件(PnP管理器,I/O管理器,电源管理器等)调用或激活它们。 • 一个WDM驱动程序基本组成包括一下5个例程: • 驱动程序入口例程:处理驱动程序的初始化 • 即插即用例程:处理PnP设备的添加、删除和停止 • 分发例程:处理用户应用程序发出的各种I/O请求 • 电源管理例程:处理电源管理请求 • 卸载例程:处理驱动程序的卸载
一般的驱动程序 驱动程序入口,在启动驱动程序的时候,操作系统将调用这个入口。 。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的例程 { //………. }
应用程序和设备驱动程序打交道主要是通过CreateFile、 ReadFile、WriteFile和DeviceIoControl等Win32 API来进行的。 • 这些API其实都对应着驱动程序的一些Dispatch例程。例如调用Win32 API CreateFile的时候,操作系统最终转化为对驱动程序IRP_MJ_CREATE功能代码所对应的 Dispatch例程的调用,如果驱动程序没有提供该例程, CreateFile调用就会失败。
功能代码 说明 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
驱动程序开发环境 • 一是利用微软提供的WIN(2K,XP)DDK驱动程序开发包,另一个是专用驱动程序开发工具,如CompuwareNumega公司提供的DriverStudio。 • 本系统采用DDK开发WDM驱动程序,开发工作包括:开发环境设置(VC编译环境)、驱动程序设计、INF文件设计。
开发驱动程序的基本步骤 • 1、 写一个DriverEntry例程,在里面调用IoCreateDevice创建 一个Device对象。 • 2、 写一个处理IRP_MJ_CREATE请求的Dispatch例程的基本框架 (当然写了DispatchCreate例程后, 要在DriverEntry例程为IRP_MJ_CREATE初始化例程入口)。如果驱动程序创建了多于一个Device对象,则必须为IRP_MJ_CLOSE 请求写一个例程,该例程通常情况下可以和DispatchCreate共用一个例程。 • 3、 编译连接你的驱动程序。