开发WDM型USB设备驱动程序(二)

转载 2006年06月26日 12:03:00


  开发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。由于DriverWorks所用的类库是对DDK的库函数的封装,还必须在Visual C++中编译需要的库文件[3],下面介绍怎样在VC环境中创建自己的库文件。

  (1) 启动Visual C++。

  (2) 选择菜单File/Open Workspace。打开位于DriverStudio/DriverWorks/Source/vdwlibs.dsw的工作空间文件。

  (3) 选择菜单Build/Batch Build,在弹出的对话框架中选择你想编译的库。

  (4) 点击对话框中的Build即可编译你选择的库。

  下面就通过一个例子来说明利用DriverWorks开发USB设备驱动程序的方法。

  这个USB设备有3个双向端点,每个端点的配置如下:

端点 类型 地址 缓冲区(字节) 0 IN/OUT 控制(Control) 0x80/0x00 16/16 1 IN/OUT 块(Bulk) 0x81/0x01 16/16 2 IN/OUT 块(Bulk) 0x82/0x02 64/64
  驱动程序需要实现的功能就是控制设备上的LED灯的亮和灭,以及通过端点2对设备进行读写。

  (1) 首先,通过快捷方式“Setup DDK and Start MSVC”来启动VC IDE。这个快捷方式所指向的程序,会进行一些必要的设置,然后再启动VC IDE,这样我们的程序就可以使用DDK和DW的头文件和库了。

  (2) 从VC IDE的菜单“DriverStudio”中选择“DriverWizard”,之后按对话框的提示填写项目名称及所在目录。并按向导选择驱动程序类型为WDM,总线类型为USB。

  (3) 按端点的配置表进行端点的设置。由于在USB中规定端点0是必须存在的,所以我们只需对端点1和端点2进行定义即可。

  (4) 选择端点2产生BULK Read及BULK Write 的代码,DriverWorks会自动产生对端点2的读写代码,不用修改,就可以直接使用。

  (5) 增加一个IOCTL来控制USB设备的LED灯。IOCTL代码名称取为TEST_IOCTL_LED,其他值默认。

  (6) 最后按下“ Finish”按钮,就结束了Wizard。

  在此过程中只针对需要修改的步骤进行了说明,未加说明的部分均可直接按“Next”按钮。

  到此,我们已经创建好了一个基本的驱动程序,其中的块读写代码都由DriverWorks自动生成,无需另外加代码,只有厂商请求通过Ioctl来进行,控制LED灯的亮灭。代码如下:

NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)
{
 NTSTATUS status = STATUS_SUCCESS;

 t << "Entering TESTDevice::TEST_IOCTL_LED_Handler, " << I << EOL;
 // TODO: Verify that the input parameters are correct
 // If not, return STATUS_INVALID_PARAMETER
 if(I.IoctlOutputBufferSize()||!I.IoctlBuffer()||(I.IoctlInputBufferSizer()!=sizeof(UCHAR)))
  // TODO: Handle the the TEST_IOCTL_LED request, or
  // defer the processing of the IRP (i.e. by queuing) and set
  // status to STATUS_PENDING.
  PURB pUrb=m_Lower.BuildVendorRequest(NULL,//transfer buffer
   0, //transfer buffer size
   0, //request reserved bits
   (UCHAR)(*PUCHAR)I.IoctlBuffer()), //request. 1=LED_ON, 0=LED_OFF
   0 // Value
  );
  //transmit
  status=m_Lower.SubmitUrb(pUrb,NULL,Null,5000L);
 }
 // TODO: Assuming that the request was handled here. Set I.Information
 // to indicate how much data to copy back to the user.
 I.Information() = 0;
 I.Status()=status;
 return status;
}
  这个函数控制LED灯,它是通过USB Vendor Request来向设备传送的。其中request=1的时候表示让L ED亮,request=0的时候让LED来。它通过DeviceIoControl由上层应用程序传下来。

  现在,驱动程序完成了,为确保最后生成的USB驱动程序能编译成功,一定要注意设置DriverWorks中的Driver Build Setting(在VC++6.0的菜单中)中的[basedir]和[CPU]等项。设置好后,选择“Build/Batch Build”,在弹出的对话框中进行正确的选择,之后按下”Rebuild”按钮,稍等片刻即可生成最终的.sys驱动程序。

  结束语

  WDM作为一种设备驱动程序模型,自Windows 2000以来已成为一种统一的模式。同时USB技术得到广泛应用,进行USB设备驱动程序的开发成为必不可少的技术环节,而使用DriverWorks开发USB设备驱动程序,简单方便。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=775594

开发WDM型USB设备驱动程序

  通用串行总线USB是1995年康柏、微软、IBM、DEC等公司推广的一种新型的通信标准,该总线接口具有安装方便、高带宽、易于扩展等优点,已逐渐成为现代数据传输的发展趋势。而在开发USB设备时,设备...
  • ark1111
  • ark1111
  • 2004年10月23日 14:37
  • 2472

开发WDM型USB设备驱动程序(二)

USB设备驱动程序开发工具  开发USB设备驱动程序需要专门的开发工具,目前应用广泛的工具主要有两大类。  一类是Microsoft公司提供的Windows DDK(Device Driver Kit...
  • qianjintianguo
  • qianjintianguo
  • 2006年06月06日 09:53
  • 3140

开发WDM型USB设备驱动程序(一)

 关键词 WDM;USB设备驱动程序;Driverworks   导言  通用串行总线USB是1995年康柏、微软、IBM、DEC等公司推广的一种新型的通信标准,该总线接口具有安装方便、高带宽、易于扩...
  • djsky
  • djsky
  • 2006年06月26日 12:01
  • 1019

开发WDM型USB设备驱动程序(转贴)

[文章信息]作者:李虹时间:2004-10-06出处:计算机与信息技术责任编辑:方舟 摘要 本文介绍WDM型USB设备驱动程序的基本概念、结构和特性,并说明了利用Driverworks进行开发的方法。...
  • huangxuhao
  • huangxuhao
  • 2004年10月27日 19:01
  • 2825

开发WDM型USB设备驱动程序(一)

摘要 本文介绍WDM型USB设备驱动程序的基本概念、结构和特性,并说明了利用Driverworks进行开发的方法。  关键词 WDM;USB设备驱动程序;Driverworks   导言  通用串行总...
  • qianjintianguo
  • qianjintianguo
  • 2006年06月06日 09:52
  • 4119

谈WDM与WDF (windows驱动开发)

WDF驱动模型 如所周知,自Windows 2000开始,开发驱动程序必以WDM为基础的,但其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易。为改善这种局面,微软推出了新的驱动程序开发环境。...
  • u011191259
  • u011191259
  • 2014年12月10日 21:25
  • 1450

Windows驱动开发WDM (1) - 基本结构

陆陆续续做过一些驱动的开发,但是一直以来都没有系统的学习过。这次重新阅读《windows驱动开发技术详解》(张帆,史彩成等编著),写博客记录一下,用以加深自己对驱动的理解。   驱动对象(DRIV...
  • zj510
  • zj510
  • 2012年11月21日 14:13
  • 9232

WDM型USB设备驱动程序开发

  摘要 本文介绍WDM型USB设备驱动程序的基本概念、结构和特性,并说明了利用Driverworks进行开发的方法。关键词 WDM;USB设备驱动程序;Driverworks   导言  通用串行总...
  • peterico007
  • peterico007
  • 2008年09月25日 14:58
  • 757

NT式驱动和WDM式驱动程序

1.Windows驱动程序分为两类,一类是不支持即插即用功能的NT式的驱动程序;另一类是支持即插即用功能的WDM式的驱动程序。   2.NT式的驱动程序要导入的头文件时NTDDK.H,而WDM式的...
  • whatday
  • whatday
  • 2015年03月28日 15:27
  • 2908

编写WDM驱动,如何写AddDevice例程

AddDevice例程 在前一节中,我讲述了当WDM驱动程序被第一次装入时如何初始化。通常,一个驱动程序可以被多个设备利用。WDM驱动程序有一个特殊的AddDevice函数,PnP管理器为每个设...
  • kinhum
  • kinhum
  • 2013年10月19日 02:44
  • 882
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开发WDM型USB设备驱动程序(二)
举报原因:
原因补充:

(最多只允许输入30个字)