『壹』 win7系统usb驱动程序开发使用什么开发工具
Windows平台开发驱动主要有如下工具:
1、VC\VS,主要用于编辑源、编译驱动程序源代码,WIN7平台上现在依然正常使用VC6.0,虽然这款IDE很老啦,但是相对来说,运行简单,占用资源少,因此不少程序员会即安装VS也会安装VC,用VC进行源代码编写,用VS进行编译,更多的是使用makefile文件操作。
2、WDK,(Windows Driver Kit)是一种完全集成的驱动程序开发系统,它包含Windows Driver Device Kit (DDK),用于测试 Windows 驱动器的可靠性和稳定性。可以从微软官网下载。
『贰』 如何安装WDK并运行编译一个工程
方法/步骤 1 WDK的安装 WDK的安装,点击exe文件,然后如图选中,继续下一步操作完成安装,点击OK即可。 2 打开程序 从“开始”菜单中打开WDK的build环境配置,从“开始”菜单中选择“所有程序”,然后选择“Windows Driver Kits”在WDK的版本(这里“WDK 6001 18001”)“Build Enieiroments”到“Windows XP”到“Launch Windows XP x86 Checked Build Enviroment”。 3 编译程序 出现一个控制台,这个控制台已经配置好编译环境。现在输入cd命令,进入我们先前建立的first目录;进入之后,输入build命令。现在编译结束,First.svs出现在\First\objchk_wxp_x86\i386下。 4 安装srvinstw.exe 接下来安装srvinstw.exe,执行这个工具,把我们编写的first.sys安装到自己的计算机上。 5 服务选择 选择“安装服务”并单击“下一步”按钮。然后选择“本地计算机”,单击“下一步”按钮。 6 服务名称配置 这时要输入服务名称,这里输入文件的名字“first”。但这个名称不一定要 和文件名相同,可以随意输入,只是不能和已经存在的服务冲突。接下来,这个位置是需要手工输入sys文件的路径。 7 选择“设备驱动” 接下来选择“设备驱动”。输入“NT驱动器目标名”不需要输入任何内容,直接单击“下一步”按钮即可。选择启动类型:请一定选择“手动”。 8 安装DehugView.exe DehugView.exe的安装非常简单,直接打开DehugView.exe之后,界面如图所示。 9 启动.sys文件 要把Capture Kernel勾上,由于前面已经安装了服务,所以,现在打开控制台(所有程序附件一命令提示符),输入net start first就可以启动first.sys了。反之,可以输入net stop first来停止它的运行。 注意事项 第二步:先前建立的first目录,这个到时候根据自己的条件自己建立就可以了。
『叁』 windows系统下的wdk和ddk是咋回事呀
原来的驱动开发工具包叫做DDK(Driver Develpment Kit),现在新版本的叫做WDK(Windows Driver Kit)。
DDK是Device Development Kit,设备开发包的意思。一般指windows设备驱动程序开发包。如果你想开发一个设备驱动程序,如显卡驱动程序,就必须使用DDK。
得到DDK需要二级订阅MSDN光盘,但是微软公司也经常不定期开放DDK的网络下载。
『肆』 如何把ndis filter框架利用到日膚indows驱动开发工作中
NDIS Filter NET_BUFFER_LIST NET_BUFFER MDL
1
网络数据结构如下图:
5
第二种方法:
/*******************************************************************GetNetBufferData函数的功能:从1个NET_BUFFER里面获取数据。1个NET_BUFFER里面含有1个或者多个的MDL*******************************************************************/VOIDGetNetBufferData(PNET_BUFFERNetBuffer,PUCHAROutputBuffer,ULONGOutputBufferSize,PULONGOutputBytesCopied){PMDLMdl=NetBuffer->CurrentMdl;*OutputBytesCopied=0;if(NetBuffer->DataLength>OutputBufferSize){#ifDBGDbgPrint("Notenoughoutputbufferspace,in:%d,out:%d ",NetBuffer->DataLength,OutputBufferSize);#endifreturn;}NdisMoveMemory(OutputBuffer,(PUCHAR)MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority)+NetBuffer->CurrentMdlOffset,Mdl->ByteCount-NetBuffer->CurrentMdlOffset);OutputBuffer+=Mdl->ByteCount-NetBuffer->CurrentMdlOffset;*OutputBytesCopied+=Mdl->ByteCount-NetBuffer->CurrentMdlOffset;////循环MDL链表,获取每一个结点的数据,数据被保存到OutputBuffer里面//OutputBuffer的空间不断地扩大。//当链表不为空,并且OutputBuffer的长度<1个NET_BUFFER的总长度while(((Mdl=Mdl->Next)!=NULL)&&(*OutputBytesCopied<NetBuffer->DataLength)){NdisMoveMemory(OutputBuffer,MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority),Mdl->ByteCount);OutputBuffer+=Mdl->ByteCount;//数据被保存到OutputBuffer里面*OutputBytesCopied+=Mdl->ByteCount;//OutputBuffer的空间不断地扩大}if(Mdl!=NULL){NdisMoveMemory(OutputBuffer,MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority),NetBuffer->DataLength);OutputBuffer+=Mdl->ByteCount;*OutputBytesCopied+=Mdl->ByteCount;}#ifDBGDbgPrint("buffercopied:%dbytes ",*OutputBytesCopied);#endif}
6
上面的2种方法,只是获取数据。而原本NDISFilter框架提供的这4个函数默认的代码,都没有做任何操作,没有实质性质的功能,这4个函数原本默认的代码,我们都不需要,因为我们的驱动程序需要处理网络数据包。这4个函数分别是:
7
在我们的NDISFilter工程里面,我们需要修改掉这4个函数的功能,把它们替换成我们所想要的功能。比如,你在发送数据包或者接收数据包的时候,需要实现自己的一些业务逻辑,而不是去使用MicrosoftNDISFilter提供的原始代码的功能。
8
函数的功能:NDIS调用把发送的结构和数据返还给FilterDriver。NDIS可以收集多次NdisFSendNetBufferLists发送的结构和数据形成一个单链表传递给。除非到NDIS调用,否则一个发送请求的当前状态总是未知的。一个过滤驱动是不能在NDIS调用返回结构之前对NET_BUFFER_LIST和其关联的数据做检查的。要完成一个发送请求完成后的任何必要的后继处理。当NDIS调用时,FilterDriver就重新获地对结构及结构相关资源的所有权。可以在中释放相关的资源和准备下一个NdisFSendNetBufferLists调用。NDIS总是按照过滤驱动调用NdisFSendNetBufferLists提交的顺序传递给下层驱动,但是回返的顺序则是任意的。FilterDriver可以请求一个回环发送请求,只要把NdisFSendNetBufferLists的SendFlags设置成NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK就行了。NDIS会引发一个包含发送数据的接收包指示。
9
一个FilterDriver应该对自己引发的发送请求保持跟踪并确保在完成时不调用NdisFSendNetBufferComplete例程。
步骤阅读
10
FilterSendNetBufferLists函数的功能:NDIS调用一个FilterDriver的FilterSendNetBufferLists例程来过滤上层驱动的发送请求。FilterDriver不能改变其它驱动传来的NET_BUFFER_LIST结构中的SourceHandle成员的值。它可以过滤数据并发送过滤的数据到下层驱动。
11
对每一个提交到FilterSendNetBufferLists的NDIS_BUFFER_LIST,我们可做下面的操作:
1)可以把缓冲区通过NdisFSendBufferLists传递给下层驱动,NDIS保证上下文空间对FilterDriver的有效性。过滤驱动可以在发送前修改缓冲区的内容。可以像处理自己引发的发送请求的缓冲区一样处理这个缓冲区。2)可以调用拒绝传递这个包3)排队缓冲区内容到本地的供以后处理。例如要在一定超时后处理或要接收到特定包后才处理等。如果支持这种处理方式就要支持取消请求的操作。4)可以拷贝缓冲区并引发一个发送请求。它类似自己引发一个发送请求,但必须先调用NdisFSendNetBufferComplete返回上层驱动的缓冲区。
12
发送请求在驱动栈继续完成,当一个微端口驱动调用完成一个发送请求时,NDIS会调用微端口
13
在一个发送操作完成后,FilterDriver可以做在FilterSendNetBufferLists中所有修改的相反操作。返回一个NET_BUFFER_LIST结构的单链表和发送请求的最终状态给上层的驱动。当最顶层的FilterMole的被调用完成后NDIS会调用引发发送请求的协议驱动的。如果FilterDriver不提供FilterSendNetBufferLists它还是可以引发一个发送操作的,但它必须提供一个并且不能在这个例程里把这个事件传递给上层驱动。
14
一个FilterDriver可以传递或过滤一个上层驱动的回环请求,要传递一个回环请求,NDIS会设置FilterSendNetBufferLists的SendFlags参数为NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK,FilterDriver在调用NdisFSendNetBufferLists时把这个标记传给它即可。在回环请求的情况下NDIS会指示一个包含发送数据的接收包。
15
如果一个FilterDriver修改的任何行为不是NDIS提供的标准服务,那么它应该当自己为NDIS提供相应的服务。例如,如果一个FilterDriver修改了一个硬件地址请求,就必须处理直接到这个新地址回环包。在这种情况下,因为FilterDriver已经更改了地址NDIS是不能提供一个回环服务的。
16
_Use_decl_annotations_VOIDFilterSendNetBufferLists(NDIS_HANDLEFilterMoleContext,PNET_BUFFER_LISTNetBufferLists,NDIS_PORT_NUMBERPortNumber,ULONGSendFlags){PMS_FILTERpFilter=(PMS_FILTER)FilterMoleContext;PNET_BUFFERNetBuffer;UCHARTempBuffer[MAX_BUFFER_SIZE];ULONGBytesCopied;pEthHdrEthernetHeader;pIPHdrIpHeader;#ifDBGDbgPrint(">>>FilterSendNetBufferLists:%p ",NetBufferLists);#endiffor(NetBuffer=NetBufferLists->FirstNetBuffer;NetBuffer!=NULL;NetBuffer=NetBuffer->Next){GetNetBufferData(NetBuffer,TempBuffer,MAX_BUFFER_SIZE,&BytesCopied);if(BytesCopied==0){#ifDBGDbgPrint("Netbuffercatcherror ");#endif}else{EthernetHeader=TempBuffer;if(EthernetHeader->Type==0x0800)//以太网类型{IpHeader=EthernetHeader+sizeof(EthHdr);//去掉以太网头,抓出IP头#ifDBGDbgPrint("Getippacket ");#endif}}}NdisFSendNetBufferLists(pFilter->FilterHandle,NetBufferLists,PortNumber,SendFlags);}
17
FilterReturnNetBufferLists函数的功能:如果FilterDriver设置了的状态为NDIS_STATUS_SUCCESS,NDIS通过驱动的FilterReturnNetBufferLists返回指示数据。在这种情况下FilterDriver失去了对NET_BUFFER_LIST的所有权,直到FilterReturnNetBufferLists被调用。FilterDriver调用NdisFIndicateNetBufferLists传递接收指示给驱动栈上的上层驱动,如果上层驱动保留了对缓冲区(NET_BUFFER_LIST)的所有权,NDIS会调用FilterDriver的FilterReturnNetBufferLists例程。在FilterReturnNetBufferLists中应该撤消在接收路径上(如在FilterReciveNetBufferLists中做的一些处理)的操作。当最底层的FilterMole完成对缓冲区(NET_BUFFER_LIST)的处理后,NDIS把缓冲区返回给微端口驱动。如果FilterReceiveNetBufferLists的ReceiveFlags没有设置NDIS_RECEIVE_FLAGS_RESOURCES标记,FilterDriver调用NdisFReturnNetBufferList返回这个缓冲区数据,如果设置了FilterReceiveNetBufferLists直接返回时就把缓冲区返还给了下层微端口驱动。
步骤阅读
18
FilterReceiveNetBufferLists函数的功能:FilterDriver调用来指示发送数据。这个函数通过NET_BUFFER_LIST结构给上层驱动指示数据。FilterDriver可以从池中分配这个结构。如果FilterDriver设置了的状态为NDIS_STATUS_SUCCESS,NDIS通过驱动的FilterReturnNetBufferLists返回指示数据。在这种情况下FilterDriver失去了对NET_BUFFER_LIST的所有权直到FilterReturnNetBufferLists被调用。如果FilterDriver在调用时设置ReceiveFlags为NDIS_RECEIVE_FLAGS_RESOURCES,在函数返回后FilterDriver会立即恢复对NET_BUFFER_LIST的所有权,这时FilterDriver必须立即处理这个NET_BUFFER_LIST的返回,因为NDIS在这种情况下是不会调用FilterReturnNetBufferLists返回NET_BUFFER_LIST结构的。注意:一个FilterDriver应该跟踪自己引发的接收指示确保它在FilterReturnNetBufferLists中不调用NdisFReturnNetBufferLists。
19
_Use_decl_annotations_(NDIS_HANDLEFilterMoleContext,PNET_BUFFER_LISTNetBufferLists,NDIS_PORT_NUMBERPortNumber,ULONGNumberOfNetBufferLists,ULONGReceiveFlags){PMS_FILTERpFilter=(PMS_FILTER)FilterMoleContext;PNET_BUFFERNetBuffer;UCHARTempBuffer[MAX_BUFFER_SIZE];ULONGBytesCopied;pEthHdrEthernetHeader;pIPHdrIpHeader;#ifDBGDbgPrint(">>>FilterReceiveNetBufferLists:%p ",NetBufferLists,ReceiveFlags,NumberOfNetBufferLists);#endifdo{for(NetBuffer=NetBufferLists->FirstNetBuffer;NetBuffer!=NULL;NetBuffer=NetBuffer->Next){GetNetBufferData(NetBuffer,TempBuffer,MAX_BUFFER_SIZE,&BytesCopied);if(BytesCopied==0){#ifDBGDbgPrint("Netbuffercatcherror ");#endif}else{EthernetHeader=TempBuffer;if(EthernetHeader->Type==0x0800){IpHeader=EthernetHeader+sizeof(EthHdr);#ifDBGDbgPrint("IPpacketexist ");#endif}}}}while(FALSE);
20
调用来指示发送数据。如果FilterDriver设置了的状态为NDIS_STATUS_SUCCESS,NDIS通过驱动的FilterReturnNetBufferLists返回指示数据。如果FilterDriver设置了的ReceiveFlags值为NDIS_RECEIVE_FLAGS_RESOURCES,那么在函数返回后FilterDriver会立即恢复对NET_BUFFER_LIST的所有权,这时FilterDriver必须立即处理这个NET_BUFFER_LIST的返回。在这种情况下是不会调用FilterReturnNetBufferLists返回NET_BUFFER_LIST结构的。
『伍』 看雪论坛的那些驱动代码怎么用
你要把微软的WDK下载下来
建立驱动开发环境,你可以用vc,也可以用mingw gcc编写驱动程序
WDK里面有很多驱动例子代码
够你学习的了
C/C++编程感兴趣的,欢迎到网络codeblocks贴吧耍
『陆』 Windows设备驱动程序WDF开发的本书内容
本书主要讨论KMDF,KMDF是WDM的继续,可以把WDM驱动程序转换为KMDF驱动程序。还对UMDF设备驱动程序作了编程入门介绍。
过去,我研究过如何用DriverStudio开发工具开发Windows下的WDM设备驱动程序,承蒙电子工业出版社的厚爱,出版了《Windows 2000/XP WDM设备驱动程序开发》一书。
WDF的简单化编程,导致DriverStudio退出了Windows设备驱动程序的开发,将DriverStudio定格在3.2版本。
从形式上看,KMDF的对象和DriverStudio的类,具有相似的地方。本书的内容安排和《Windows 2000/XP WDM设备驱动程序开发》的基本一致,具体安排如下:
章 名 主 要 内 容
第1章 Windows 2000和WDM驱动程序 KMDF是WDM的继续,KMDF构建在WDM之上。对于一些Windows驱动程序的基本概念,初学者仍需要了解,如Windows 2000中的组件、驱动程序种类,以及WDM驱动程序特点等
第2章 KMDF驱动程序框架 KMDF驱动程序框架由对象和事件回调例程构成。KMDF框架中所有的事物都由对象来表示,各种事件处理都由事件回调例程来完成。学习KMDF编程,主要是学习KMDF的各种对象、对象函数和事件回调例程的编程
第3章 基本对象 KMDF提供了许多对象,本章只介绍一些基本的对象,如WDFREQUEST对象、WDFQUEUE对象等,还介绍了数据同步访问、字符串操作和QueueSample实例
第4章 KMDF驱动程序编程入门 介绍Windows Vista下的KMDF驱动程序编程入门,包括KMDF驱动程序编程环境的建立,KMDF的创建、生成及安装过程,以及Win32 Console和MFC两种应用程序的编程
第5章 KMDF驱动程序和应用程序之间的通信 介绍应用程序与KMDF之间的通信,包括应用程序对KMDF的通信,以及KMDF对应用程序的通信
第6章 即插即用例程 主要介绍PnP组件、即插即用例程的加载和卸载顺序及PnpPowerSample实例等
第7章 电源管理 主要介绍系统电源状态与设备电源状态、电源管理控制标志位、设备的唤醒特征和空闲检测、电源管理编程及IdleSample实例等
第8章 KMDF过滤器驱动程序 描述如何写一个过滤器驱动程序,该驱动程序可位于功能驱动程序的上面或下面,它通过过滤流经它的IRP来修改设备的行为
第9章 USB设备开发 主要介绍USB设备的配置/接口/端点、USB数据的传输方式、USB描述符、USB编程对象、USB编程(如激活配置与中止配置、同步操作、异步操作)及USBSample实例等
第10章 PCI设备驱动程序开发 本章就硬件访问、中断处理和DMA传输3个方面展开讨论,并以CY7C09449芯片为例,给出一个经过测试的PCI设备驱动程序实例——PCISample实例。另外,还给出了一个不依靠硬件设备的DMASample实例
第11章 UMDF驱动程序编程入门 介绍UMDF驱动程序编程入门,包括UMDF驱动程序的创建、生成及安装,以及一个简单的实例编程
第12章 WinDbg使用介绍 WinDbg是微软提供的一个功能非常强大的调试软件,可以在源代码级别调试Windows下的WDF驱动程序。本章主要介绍用WinDbg调试KMDF和UMDF
微软推荐的WDF书籍是《Developing Drivers with the Microsoft Windows Driver Foundation》,作者是Penny Orwick和Guy Smith。
微软提供的学习WDF的中文网站地址是:www. microsoft. com/china/whdc。
开发工具
微软提供的WDF驱动程序开发工具包WDK的最新版本是WDK 1.7,可以从其网站下载。
本书实现WDF驱动程序及应用程序实例所用的工具是:Visual C++ 6.0和WDK 1.7。
本书配套光盘
本书配套光盘中含有书中所有实例的驱动程序和应用程序的全部源代码,以及生成的驱动程序和可执行的应用程序。除USBSample和PCISample实例因需要硬件设备的支持,读者无法运行外,其他11个实例均可在Windows XP和Vista下运行。
本书特点
编程入门:详细的步骤介绍,初学者的良师益友。
应用实例:对程序作了必要的注释,了解驱动程序编程的捷径。
简单实用:KMDF的编程非常简单,Winows硬件开发工程师必须掌握。
理解深刻:笔者精通Winows设备驱动程序开发和硬件开发,所有实例均为自己创造,每个实例都有其独特意义,笔者用实例诠释自己对KMDF的理解和认识。
微软推荐的WDF书籍是“理论派”,以讲解理论为主,讲得非常详细和全面;本书是“实战派”,全书以实例为主,用实例带你快速入门。
善于学习,勤于思考,勇于实践。用这句话与投身硬件开发的青年学子共勉。
希望这本书能对您现在或将来的工作有所帮助。
本书得以顺利出版,要特别感谢周利莉的一贯支持;感谢何海洋和赵庆花的支持;感谢陈建波和何亚垒的支持;感谢朱沭红编辑和电子工业出版社。
由于作者的理论水平有限,书中难免出现差错和遗漏,敬请广大计算机应用开发人员批评指正,
十年时间,跟踪Windows设备驱动程序的开发,驱动程序VxD->WDM->KMDF,工具VtoolsD->DDK、DriverWorks->WDK,但愿WDF长久。别了WDM,别了DriverStudio。
缺月挂疏桐,漏断人初静。谁见幽人独往来,缥缈孤鸿影。……
武安河
2009年元旦
『柒』 vs2010连接WDK读不出驱动头文件ntddk.h
需要搭建WDK环境的,你的可能没有搭建wdk环境,关于“WDK环境搭建”可以看:
http://jingyan..com/article/e75057f2df3493ebc91a89ab.html
我是ndk吧吧主,有问题可以ndk吧留言,谢谢!
『捌』 wdk与DDK有什么区别
首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发Java程序,我们可能需要一个JDK,开发 WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发WINDOWS下的驱动程序,我们需要一个DDK/WDK。
2.DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的区别:
这个要说说驱动相关的一些历史:
1).95/98/ME下,驱动模型为:Vxd,相关资料可以看《编程高手箴言》的前几个章节,里面有很详细的介绍,虽然这个东西已经过时,但大概看看还是会增长见识的。
2).2000/XP/2003下,Windows采用WDM驱动模型(Windows Driver Model),开发2000/XP/2003的驱动开发包为:DDK。
3).Vista及以后版本,采用了WDF驱动模型(Windows Driver Foudation),对应的开发包:WDK。
其实WDK可以看做是DDK的升级版本,现在一般的WDK是包含以前DDK相关的功能,现在XP下也可以用WDK开发驱动,WDK能编译出2000-2008的各种驱动。
3.Vxd驱动文件扩展名为:.vxd。
WDM和WDF驱动文件扩展名为:.sys。
『玖』 Windows内核(驱动)编程中的线程问题
可以使用函数PsCreateSystemThread,用起来和ring3差不多,ring0编程更要注意线程同步问题,否则很容易BSOD(蓝屏死机)
『拾』 WDK与WDM区别,兼容吗
WDK(WindowsDriverKit)是一种完全集成的驱动程序开发系统,它包含WindowsDDK,用于测试Windows驱动器的可靠性和稳定性.WDM是Win32设备驱动程序体系结构Windows设备驱动程序,过去是WDM(WindowsDriverModel)框架,编程复杂,初学者难以掌握其编程要领。为了解决这一问题,微软对WDM驱动程序的架构做了改进,形成了全新的WDF(WindowsDriverFoundation)框架结构。它提供了面向对象和事件驱动的驱动程序开发框架,大大降低了开发难度。从现在开始,掌握Windows设备驱动程序的开发人员,由过去的专业人士,将变为普通大众。