《快快乐乐跟我学Windos驱动WDM》
2008/05/17 asdjf@163.com www.armecos.com
“我做了一个专用的USB设备,但我不会写上位机的Windows驱动,怎么办?”
“我开发了一块PCI采集卡,可是我的VC程序怎么才能和硬件通信呢?”
“我们自己设计了一块千兆网卡,如何为其制作网卡驱动呢?”
“我想驱动打印机,怎么写程序?还有显示器驱动呢?”
“我想做个串口监听程序,怎么过滤串口信息呢?另,虚拟串口软件是怎么做的?”
“我想做防火墙/***,怎么拦截网络数据包?我想实时加密、压缩、隐藏文件,控制U盘使用,如何过滤文件?”
......
要想实现以上功能就必须编写Windows驱动程序(WDM驱动)。作为一个硬件产品,如果能工作在Windows平台下,那么无疑会大大增加产品市场占有率,易于推广,增加销路,令用户满意度上升。不过,开发WDM驱动对于初学者来说相当困难,主要原因在于Windows驱动涉及的概念和细节太多,程序相对来说比较庞大,初学者一开始很容易陷入困境,靠自学注定困难重重。
其实,如果你做过类似操作系统驱动,如:ecos、Linux、VxWorks等,那么,WDM驱动就比较容易理解了。市面上的相关书籍一般都不适合于初学者使用,太细节化,只见树木不见森林,初学者使用这样的教材学习WDM驱动,很容易损害自信心,导致学习了很长时间也没什么进展。过来人的经验是:最好从范例源码入手,先编译安装现成代码,然后在此基础上逐渐增加、删除、修改某些部分,直到最后变成自己的驱动程序,大可不必自己从头写,有些不经常变化的部分直接抄范例就行了。对WDM驱动的理解有一个由浅入深的过程,但是必须保证每次都要从全局上把握,否则学了忘,忘了学,没什么积累,效果不会好。
为此,我们提供几个范例源码(USB驱动、PCI卡驱动、千兆网卡驱动、过滤驱动......),手把手交你编译、安装、调试,一上来就直接使用现成代码运行,熟悉这个开发过程后,你就能自行学习WDM驱动了。不过,为了加速学习过程,我们将有针对性地带领大家阅读分析关键源码。
注意:这里的WDM驱动专指Win98、Win2000、WinXP系统下的驱动。
--------
推荐教材
--------
《Windows 2000驱动程序开发大全 第一卷 设计指南》 机械工业出版社出版
《Windows 2000驱动程序开发大全 第二卷 参考手册》 机械工业出版社出版
《Programming the Windows Driver Model》 中文电子书
DDK在线帮助文档和源码
......
--------
开发工具
--------
DDK for Win98、Win2000、WinXP
DriverStudio3.1
WinDriver6.0
SoftICE
VC6
......
DriverStudio适于已精通驱动程序设计的开发者,功能强大且与VC++紧密结合,同时提供了众多的调试工具;WinDriver适于初学者和开发较简单的驱动程序,它完全面向对象,非常简单,开发者不必了解驱动的具体操作就可以进行设计,但如果想深入了解驱动程序设计,还是推荐DDK,它可以完成所有的驱动程序设计,同时也提供了非常详细的文档说明。
------------
千兆网卡驱动
------------
本产品配合路由器使用。众所周知,路由器是IP网络的核心交换设备,其关键技术之一就是高速接口处理技术。本网卡采用 “IP over Optics”技术,让IP包直接在光纤上传送,省去了中间帧封装拆封等步骤,使传送过程简单且易于控制,从而提高了网络传输效率。这是一个非标准的网卡,原来已经有了Linux下的网络驱动,现在增加Windows下的WDM驱动,为将来产品推广和增加市场销路作准备。
该网卡通过PCI总线与PC机相连,PCI选择S5933桥片。
关于PCI卡硬件设计请参考《快快乐乐跟我学高速PCB设计》讲义;
关于PCI规范请参考《PCI2.1规范》;
关于S5933 PCI控制器请参考《S5933 datasheet》;
这里我们要详细讨论的是《Windows 2000网络驱动程序设计规范(NDIS)》。
一直到80年代后期,许多传输协议的实现受限于MAC层接口的独特实现,因为MAC层定义了协议与网卡之间的转换机制。
1989年,Microsoft和3Com两公司提出了一个定义MAC层与OSI模型高层协议驱动程序之间的网络驱动器接口规范(Network Driver Interface Specification :NDIS),NDIS给数据交换提出了一个灵活的环境,它规范了软件接口------称为NDIS接口,传输协议可用它与网卡驱动程序进行通信,这个接口在Windows NT中使用,到了Windows 2000更是成为了Microsoft公司规范驱动程序WDM(Win32 Driver Model)的组成部分。因此在Windows 2000环境下开发核心态网卡驱动程序应遵循NDIS规范。
NDIS驱动程序包括以下三种驱动程序:
Miniport驱动程序
Intermediate驱动程序
Protocol驱动程序
本次设计的驱动程序只完成接收和发送数据两个最基本的功能,只用到Miniport驱动程序。
Miniport驱动程序有两个基本的功能:
1、管理网络接口卡NIC,包括通过网络接口卡发送和接收数据;
2、高层驱动程序的接口,如Intermediate驱动程序和Protocal驱动程序。
Miniport驱动程序只须实现与网络硬件相关的操作,而所有底层网卡驱动程序的通用操作(如同步),一般由NDIS接口程序来实现。
网卡驱动程序加载过程 略
Miniport驱动程序其实就是完成DriverEntry的填写,调用NdisMInitializeWrapper创建与NDIS接口库的联系。我们会详细分析下面各个部分的代码:
MajorNdisVersion
MinorNdisVersion
CheckForHangHandler
DisableInterruptHandler
EnableInterruptHandler
HaltHandler
HandleInterruptHandler
InitializeHandler
ISRHandler
QueryInformationHandler
ReconfigureHandler
ResetHandler
SetInformationHandler
SendHandler
SendPacketsHandler
ReturnPacketHandler
TransferDataHandler
AllocateCompleteHandler
上面这些函数抽象概括出了网络操作的本质,只要完成上面框架函数的填充,任何网卡都可以被系统驱动。
驱动程序的编译与安装 略
感兴趣的读者可以对比VxWorks与WDM网络驱动的异同,Linux网络驱动和WDM驱动的异同,参见《VxWorks之MUX网络驱动在EasyARM2200和SmartARM2200上的实现》、《快快乐乐跟我学Linux驱动》。
-------------
PCI采集卡驱动
-------------
使用Plx9054桥片实现高速数据采集。
关键词:DMA、突发、中断、地址空间转换......
略
-------------
USB钥匙盘驱动
-------------
现在越来越多的企业上网,但是由此带来了安全性问题。如果用***实现一个虚拟专网,就可以降低申请专线的昂贵费用,也可以保证信息安全。***的关键是加密,利用USB接口的密钥盘实现客户端加解密,既快又安全。
关于USB驱动程序需要了解如下知识点:
----------------------
USB客户驱动程序I/O请求
----------------------
IOCTL_INTERNAL_USB_SUBMIT_URB
IOCTL_INTERNAL_USB_RESET_PORT
IOCTL_INTERNAL_USB_GET_PORT_STATUS
IOCTL_INTERNAL_USB_ENABLE_PORT
IOCTL_INTERNAL_USB_GET_HUB_COUNT
IOCTL_INTERNAL_USB_CYCLE_PORT
IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
IOCTL_INTERNAL_USB_GET_HUB_NAME
IOCTL_INTERNAL_USB_GET_BUS_INFO
IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME
---------------
USB客户支持例程
---------------
GET_ISO_URB_SIZE
GET_SELECT_CONFIGURATION_REQUEST_SIZE
GET_SELECT_INTERFACE_REQUEST_SIZE
GET_USBD_INTERFACE_SIZE
UsbBuildFeatureRequest
UsbBuildGetDescriptorRequest
UsbBuildGetStatusRequest
UsbBuildInterruptOrBulkTransferRequest
UsbBuildSelectConfigurationRequest
UsbBuildSelectInterfaceRequest
UsbBuildVendorRequest
USBD_CreateConfigurationRequest
USBD_CreateConfigurationRequestEx
USBD_GetInterfaceLength
USBD_GetUSBDIVersion
USBD_ParseConfigurationDescriptor
USBD_ParseConfigurationDescriptorEx
USBD_ParseDescriptors
USBD_RegisterHcFilter
-------
USB结构
-------
URB
_URB_BULK_OR_INTERRUPT_TRANSFER
_URB_CONTROL_DESCRIPTOR_REQUEST
_URB_CONTROL_FEATURE_REQUEST
_URB_CONTROL_GET_CONFIGURATION
REQUEST
_URB_CONTROL_GET_INTERFACE_REQUEST
_URB_CONTROL_GET_STATUS_REQUEST
_URB_CONTROL_TRANSFER
_URB_CONTROL_VENDOR_OR_CLASS_REQUEST
_URB_FRAME_LENGTH_CONTROL
_URB_GET_CURRENT_FRAME
_NUMBER
_URB_GET_FRAME_LENGTH
_URB_HEADER
_URB_ISOCH_TRANSFER
_URB_PIPE_REQUEST
_URB_SELECT_CONFIGURATION
_URB_SELECT_INTERFACE
_URB_SET_FRAME_LENGTH
USB_CONFIGURATION_DESCRIPTOR
USB_DEVICE_DESCRIPTOR
USB_ENDPOINT_DESCRIPTOR
USB_INTERFACE_DESCRIPTOR
USB_HUB_NAME
USB_ROOT_HUB_NAME
USB_STRING_DESCRIPTOR
USBD_INTERFACE_INFORMATION
USBD_INTERFACE_LIST_ENTRY
USBD_PIPE_INFORMATION
USBD_ISO_PACKET_DESCRIPTOR
USB驱动最核心的概念就是总线驱动,设备驱动程序不直接和USB芯片硬件直接交互,而是通过一个抽象的USB总线驱动进行操作。这样我们书写USB主机驱动的工作就成了构造请求、发送请求至总线驱动。USB有四种传输模式:控制、批量、中断、同步。***密钥盘使用批量传输方式,数据吞吐量大,输入原文数据,输出密文数据,非常方便。除了USB总线驱动,如何将文件名管道和端点建立联系也是学习重点。其余内容如PNP处理等直接抄模板即可。
------------
串口过滤驱动
------------
我们有时需要使用串口监听软件分析串口数据,但是很多监听软件不能监听已打开串口上的数据,此时,要么使用时不监听,监听时不使用,要么增加硬件连线,用额外串口监听数据。这两种解决方法都不好,不是不方便就是要增加额外硬件,当你学习了过滤驱动后,就可以直接监听已打开串口上的数据流了。
略。
......
--------
学习总结
--------
通过上面的学习,可以感觉到WDM驱动内容还是很丰富的,一个人精力有限,不可能把每个细节都涉及到,但是WDM程序比较规范,即使有很多细节没有关注到,直接抄范例程序还是问题不大的,把主要精力放在关键的思路上不失为一种有效的开发方法。学好WDM驱动的关键是多实践,熟能生巧,这是最快的捷径,幸运的是DDK文档和范例源码相当完整系统。
......
--------------------------------------------------------------
如果想学习嵌入式系统,强烈建议选择《ecos增值包》,软硬两方面内容都包括了,是“装在光盘里的培训班”,包含了 bootloader、FS、TCP/IP、GUI、USB等各种内容。www.armecos.com自助商城有售,有免费试用版本,先体验效果,感觉好再说。
《ecos增值包》的驱动设计思路很多都参考了WDM驱动源码,两者对照学习,效果不错! |