本文摘要:利用DriverStudio3.2研发USB驱动程序利用DriverStudio3.2研发USB驱动程序利用DriverStudio研发驱动程序比必要调用DDK研发一起要方便快捷的多。
利用DriverStudio3.2研发USB驱动程序利用DriverStudio3.2研发USB驱动程序利用DriverStudio研发驱动程序比必要调用DDK研发一起要方便快捷的多。就像利用MFC研发一般的桌面程序一样,而非自由选择SDK展开程序的撰写。
换句话说,DriverStudio和DDK的关系就像MFC和SDK的关系一样,DriverStudio只是对DDK中的各种结构、函数展开了PCB,便利开发人员展开底层函数的调用,如DriverStudio的Kirp类就是对DDK中IRP所有操作者的PCB而已。1/20下面非常简单讲解一下利用DriverStudio3.2研发一个USB驱动程序的步骤。这个USB设备有3个双向端点,每个端点配备如下:EP类型地址buffer(Bytes)0IN/OUTControl0x80/0x0016/161IN/OUTBulk0x81/0x0164/642IN/OUTBulk0x82/0x0264/642/20驱动程序必须构建功能就是掌控设备上LED灯亮和灭亡,以及通过Endpoint2对设备展开读取。
由于DriveStudio由几个部分构成,我们写出这个驱动程序只要中用DriverWork。在这里,我们假设读者早已准确加装了DriverWorks,并且早已编译器了各个库文件(闻本博客前面讲解内容)。
3/201、启动VC,从VCIDE菜单DriverStudio中自由选择DriverWizard,如图1右图对话框中,写出上项目名称。在这里,我们将这个项目称作:TEST,所在目录为D:TEST。然后点按钮Next;4/202、在接下来这个对话框中(如图2),我们必须自由选择驱动程序类型。由于USB设备驱动程序是WDM类型,所以我们在的一个单选按钮中自由选择“WDMDriver”;第二个单选按钮是指所撰写的驱动程序否必须C++框架的反对,如自由选择该项,所分解的驱动程序类被PCB成驱动类和设备类两大类,否则驱动程序类以DDK形式经常出现,一般来说自由选择反对C++框架。
点按钮Next。5/203、在接下来这个对话框中(如图3),我们必须自由选择驱动程序类型。由于USB设备驱动程序是WDM类型,所以我们自由选择第二项并且点按钮Next。6/204、在第4个对话框中(如图4),自由选择我们驱动程序所操作者总线类型。
这里,我们自由选择USB。在USBVendorID和USBProductID中放入USB设备VID和PID。假设我们USB设备VID和PID分别是16十进制0471和1801。
然后点按钮Next。7/205、在接下来对话框中(如5),我们必须重新加入Endpoint1和Endpoint2定义。由于在USB中规定Endpoint0是必需不存在,所以我们不必须对Endpoint0展开定义。
在分解的驱动程序设备类中KusbLowerDevice的实例m_Lower就代表了端点0(Endpoint0),可以通过m_Lower这个配置文件掌控管道来掌控USB设备,如配备USB设备、传输各自掌控和状态催促等。点Add...按钮,插入如图5-1右图对话框,分别加到Endpoint1和Endpoint2的读取定义。
其中,PipeName指端点名称,不能反复;EndPointType指端点类型,附加为掌控、批量、中断和实时四种;EndPointAddress所指各端点的端点号,仅次于偏移量为15(协议规定,USB设备具备除零端点以外最少15个端点),同一端点的输出和输入端点号地址是一样的,范围从1~15。8/20TransferDirect指所定义的是输出端点还是输入端点;MaximunPacketSize指所定义类型的端点一次能传输的仅次于包在大小,掌控和批量端点为8163264字节,中断端点为64字节,实时端点为1023字节。此时,将在设备类头文件种加到如下代码:KusbPipeEndPoint1IN;//PipeforUSBendpointaddress81,typeBULKKusbPipeEndPoint1OUT;//PipeforUSBendpointaddress1,typeBULKKusbPipeEndPoint2IN;//PipeforUSBendpointaddress82,typeBULKKusbPipeEndPoint2OUT;//PipeforUSBendpointaddress2,typeBULK9/20在设备类源文件种加到如下代码://InitializeeachPipeobjectEndPoint1IN.Initialize(m_Lower,81,64);EndPoint1OUT.Initialize(m_Lower,1,64);EndPoint2IN.Initialize(m_Lower,82,64);EndPoint2OUT.Initialize(m_Lower,2,64);10/20从上述源代码中可以显现出,每个输出端点的实际地址从0x81开始,每个输入端点的实际地址从0x01开始逐一减少。例如,地址值为0x82的端点是一个端点号为2的IN端点。
具备接下来,之后按Next按钮。11/20图5-112/206、自由选择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处置应用程序和驱动程序之间的通信工作。13/207、自由选择IO端口的读取方式。IRP_MJ_READ和IRP_MJ_WRITE后面的选项指应用程序用ReadFile或WriteFile与驱动程序展开数据传输时,驱动程序根据设备对象创立时的特征标志位(DO_BUFFER_IO或DO_DIRECT_IO)来要求该如何提供应用程序的缓冲区地址。当自由选择BufferAccess为Buffered时,设备对象创立时的特征标志位被划为DO_BUFFER_IO,驱动程序可分别在Kirp::BufferedReadDest和Kirp::BufferedWriteSource中提供到读取缓冲区的地址;当自由选择BufferAccess为Direct时,设备对象创立时的特征标志位被划为DO_DIRECT_IO,IO管理者将瞄准应用程序的数据缓冲区,并创立一个MDL,驱动程序可在Kirp::Mdl来提供到读取缓冲区的地址。
14/20当应用程序用DeviceIoControl函数和驱动程序展开数据通信时,“Add”等按钮用来定义DeviceIoControl的掌控命令,即给驱动程序减少一些IOCTL模块。如图7-1右图。当自由选择BufferAccess为Buffered时,驱动程序通过Kirp::IoctlBuffer来提供应用程序的输出、输入缓冲区;当自由选择BufferAccess为Direct时驱动程序通过Kirp::IoctlBuffer来提供应用程序的输出缓冲区,通过Kirp::Mdl来获得提供应用程序的输入缓冲区。
第三个自由选择指应用程序关上设备的方式:以符号相连名或GUID接口方式(Interface)。15/20图7-116/208、在如图8右图对话框中,我们不必须创立任何注册表项,所以必要按Next按钮。9、对WDM反对的电源管理选项展开自由选择。WDM驱动程序必需反对电源管理,电源管理器用于IRP命令驱动程序来转变电源状态、等候并号召系统苏醒事件和查找驱动程序的设备。
17/2010、WDM驱动程序可以反对WMI,用作管理计算机。18/20接下来的Installation、Additional和Summary三个自由选择对话框按配置文件方式就可,进右图11、图12和图13右图。这样,利用DriverWizard就创立了一个基本USB驱动程序框架。
本文来源:k1体育·(3915十年品牌)官方网站-www.blfq.net