利用DriverStudio3.2开发USB驱动程序

利用DriverStudio开发驱动程序比直接调用DDK开发起来要方便快捷的多。就像利用MFC开发一般的桌面程序一样,而非选择SDK进行程序的编写。换句话说,DriverStudio和DDK的关系就像MFC和SDK的关系一样,DriverStudio只是对DDK中的各种结构、函数进行了封装,方便开发人员进行底层函数的调用,如DriverStudio的Kirp类就是对DDK中IRP所有操作的封装而已。
下面简单介绍一下利用DriverStudio3.2开发一个USB驱动程序的步骤。这个USB设备有3个双向端点,每个端点配置如下:
EP      类型          地址         buffer(Bytes)
    0     IN/OUTControl    0x80/0x00      16/16
1     IN/OUTBulk      0x81/0x01      64/64
2     IN/OUTBulk      0x82/0x02      64/64
驱动程序需要实现功能就是控制设备上LED灯亮和灭,以及通过Endpoint2对设备进行读写。
由于DriveStudio由几个部分组成,我们写这个驱动程序只要用到DriverWork。在这里,我们假定读者已经正确安装了DriverWorks,并且已经编译了各个库文件(见本博客前面介绍内容)。
1、启动VC,从VC IDE菜单"DriverStudio"中选择"DriverWizard",如图1所示对话框中,写上项目名称。在这里,我们将这个项目称为:TEST,所在目录为D:\TEST。然后点按钮"Next>";
图1
2、在接下来这个对话框中(如图2),我们需要选择驱动程序类型。由于USB设备驱动程序是WDM类型,所以我们在的一个单选按钮中选择“WDM Driver”;第二个单选按钮是指所编写的驱动程序是否需要C++框架的支持,如选择该项,所生成的驱动程序类被封装成驱动类和设备类两大类,否则驱动程序类以DDK形式出现,通常选择支持C++框架。点按钮"Next >"。
图2
3、在接下来这个对话框中(如图3),我们需要选择驱动程序类型。由于USB设备驱动程序是WDM类型,所以我们选择第二项并且点按钮"Next >"。

图3
4、在第4个对话框中(如图4),选择我们驱动程序所操作总线类型。这里,我们选择USB。在USB Vendor ID和USB Product ID中填入USB设备VID和PID。假定我们USB设备VID和PID分别是16进制0471和1801。然后点按钮"Next >"。

图4
5、在接下来对话框中(如5),我们需要加入Endpoint1和Endpoint2定义。由于在USB中规定Endpoint0是必须存在,所以我们不需要对Endpoint 0进行定义。在生成的驱动程序设备类中 KusbLowerDevice 的实例m_Lower就代表了端点0(Endpoint 0),可以通过m_Lower这个默认控制管道来控制USB设备,如配置USB设备、传输各自控制和状态请求等。点"Add..."按钮,弹出如图5-1所示对话框,分别添加Endpoint1和Endpoint2的读写定义。其中,PipeName指端点名称,不可重复;EndPoint Type指端点类型,可选为控制、批量、中断和同步四种;EndPoint Address指各端点的 端点号,最大偏移量为15(协议规定,USB设备具有除零端点以外最多15个端点),同一端点的输入和输出 端点号地址是一样的,范围从1~15。Transfer Direct指所定义的是输入端点还是输出端点;Maximun Packet Size指所定义类型的端点一次能传输的最大包大小,控制和批量端点为8163264字节,中断端点为64字节,同步端点为1023字节。此时,将在设备类头文件种添加如下代码:
KusbPipe      EndPoint1IN ;       // Pipe for USB endpoint address 81, type BULK
KusbPipe      EndPoint1OUT ; // Pipe for USB endpoint address 1, type BULK
KusbPipe      EndPoint2IN ;       // Pipe for USB endpoint address 82, type BULK
KusbPipe      EndPoint2OUT ; // Pipe for USB endpoint address 2, type BULK
在设备类源文件种添加如下代码:
// Initialize each Pipe object
EndPoint1IN . Initialize ( m_Lower , 81, 64);
EndPoint1OUT . Initialize ( m_Lower , 1, 64);
EndPoint2IN . Initialize ( m_Lower , 82, 64);
EndPoint2OUT . Initialize ( m_Lower , 2, 64);
从上述源代码中可以看出,每个输入端点的实际地址从 0x81 开始,每个输出端点的实际地址从 0x01 开始逐个增加。例如,地址值为 0x82 的端点是一个端点号为 2 IN 端点。具有接下来,继续按"Next >"按钮。
图5
图5-1
6、选择TRP处理类型。WDM驱动程序必须支持IRP_MJ_SYSTEM_CONTROL、IRP_MJ_POWER和IRP_MJ_PNP。IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_CLOSE、IRP_MJ_CLEANUP或IRP_MJ_DEVICE_CONTROL处理应用程序和驱动程序之间的通信工作。
图6
7、选择IO端口的读写方式。
IRP_MJ_READ和IRP_MJ_WRITE后面的选项指应用程序用ReadFile或WriteFile与驱动程序进行数据传输时,驱动程序根据设备对象创建时的特征标志位(DO_BUFFER_IO或DO_DIRECT_IO)来决定该如何获取应用程序的缓冲区地址。当选择Buffer Access为Buffered时,设备对象创建时的特征标志位被设为DO_BUFFER_IO,驱动程序可分别在Kirp::BufferedReadDest和Kirp::BufferedWriteSource中获取到读写缓冲区的地址;当选择Buffer Access为Direct时,设备对象创建时的特征标志位被设为DO_ DIRECT _IO,IO管理者将锁定应用程序的数据缓冲区,并创建一个MDL,驱动程序可在Kirp::Mdl来获取到读写缓冲区的地址。
当应用程序用DeviceIoControl函数和驱动程序进行数据通信时,“Add”等按钮用来定义DeviceIoControl的控制命令,即给驱动程序增加一些IOCTL接口。如图7-1所示。当选择Buffer Access为Buffered时,驱动程序通过Kirp::IoctlBuffer来获取应用程序的输入、输出缓冲区;当选择Buffer Access为Direct时驱动程序通过Kirp::IoctlBuffer来获取应用程序的输入缓冲区,通过Kirp::Mdl来获获取应用程序的输出缓冲区。
第三个选择指应用程序打开设备的方式:以符号连接名或GUID接口方式(Interface)。

图7

图7-1
8、在如图8所示对话框中,我们不需要创建任何注册表项,所以直接按"Next >"按钮。

图8
9、对WDM支持的电源管理选项进行选择。WDM驱动程序必须支持电源管理,电源管理器使用IRP指示驱动程序来改变电源状态、等待并响应系统唤醒事件和查询驱动程序的设备。

图9
10、WDM驱动程序可以支持WMI,用于管理计算机。

图10
接下来的Installation、Additional和Summary三个选择对话框按默认方式就可,入下图11、图12和图13所示。这样,利用DriverWizard就创建了一个基本USB驱动程序框架。

图11

图12
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DriverStudio 3.2是迄今为止最完备的驱动开发工具套件,它所提供的工具覆盖了 驱动开发的方方面面。DriverStudio套件中的所有工具都与Visual Studio IDE环 境集成在一起。开发人员可以在Visual Studio .NET 2002和2003环境中编写并测 试驱动程序,并且通过使用Microsoft C++编译器与Microsoft DDK完全保持兼容。 在这个版本中,所有工具的功能都得到了加强并且让开发人员可以更容易的开发优 质的驱动程序,这个版本的DriverStudio包括下列工具: DriverWorks DriverNetworks Visual SoftICE SoftICE BoundsChecker Driver Edition TrueTime Driver Edition TrueCoverage Driver Edition DriverWorks和DriverNetworks是DriverStudio的两个主要框架工具,可以提高开发 驱动程序的速度。DriverWorks简化了开发NT和WDM驱动程序的工作;DriverNetworks 则帮助开发人员毫不费力的创建和定制网络驱动程序。目前的版本可以让驱动程序 开发人员来回切换开发工具而无需改变开发环境。 DriverWorks和DriverNetworks还都提供了全新的DriverWizard,可以用C语言来创建 Windows设备驱动程序。另外,DriverWorks和DriverNetworks还为Visual Studio .NET 提供了全新的菜单和工具条,让开发人员可以使用Windows DDK编译器和链接器来build 驱动程序。 DriverWorks的类库和实例现在已经支持开发虚拟COM端口的驱动程序了。 Visual SoftICE是一个双机的系统级调试器,提供了多窗口,可配置的图形化用户界面 来帮助开发人员调试核心级的驱动程序,应用程序甚至于整个操作系统。 Visual SoftICE的最新版本在性能,功能以及用户界面上都有很大提高,其他新特性还 包括: 完全支持AMD 64位的Opteron和Athlon64处理器所提供的10个新命令: SYMLINK, DEVMGR, DP, TDIR, TMKDIR, TMOVE, TRENAME, TRMDIR, TRMFILE和TVOL。 SoftICE支持单机,用串行线连接的双机或是通过TCP/IP连接的远程计算机上的核心 级和用户级的调试。在DriverStudio 3.1版本中,SoftICE可以: 支持VMware 4.0 在"DriverStudio Config"中提供了一个新的反编译选项页 符号加载器提供了改进后的新界面 BoundsChecker Driver Edition是一个错误侦测工具,可以实施分析和侦测设备驱动 程序的错误。开发人员可以马上发现并修正这些错误,不用像以前那样要在数小时后 才能完成。新增的改进还有: 开发人员修改程序设置之后无需重启计算机 让开发人员可以记录驱动程序中的user-written函数。开发人员可以清楚地看到开发驱动程序在运行时的情况 可以查看DriverWorkbench内置的事件页汇总信息,包括记录了多少错误和泄漏问题 提供SoftICE事件命令的新开关参数,用来标示BoundsChecker当前监视的驱动程序 改进的自旋锁(spinlock)错误侦测 TrueTime Driver Edition可以用来改善驱动程序的性能问题,它可以准确地指出导致 速度变慢的代码和性能瓶颈。在DriverStudio 3.1版本中,用户可以将两个或多个测试 数据文件合并为一个,用来比较不同条件下改变代码所带来的性能提高情况。新增的改 进还有: 从系统性能计数器中收集数据 全新的"Custom Chart"为所有的函数,IRP和性能数据提供了集成可定制的显示方式 在文件系统可用之前即可开始收集性能数据 显示的数据可以导出为以逗号分割的文本文件,以备后续处理 TrueCoverage Driver Edition是一个代码辅助工具,它可以在没有源代码和符号文件的 情况下收集代码的辅助信息。驱动开发人员可以以图形化的方式查看代码结构,另外: 同时支持NMS和PDB符号文件 可以获取以下辅助数据:每个线程的基本信息,符合条件的辅助信息和部分执行的代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值