﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-旅途-文章分类-驱动开发</title><link>http://www.cppblog.com/mydriverc/category/4797.html</link><description>如果想飞得高，就该把地平线忘掉</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:38:27 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:38:27 GMT</pubDate><ttl>60</ttl><item><title>windows驱动程序开发环境配置</title><link>http://www.cppblog.com/mydriverc/articles/35281.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Fri, 26 Oct 2007 16:32:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/35281.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/35281.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/35281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/35281.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/35281.html</trackback:ping><description><![CDATA[ 网上有很多关于驱动开发环境的资料，但大多不全。
<p>    这里，个人推荐使用vc6.0＋ds＋windows ddk。</p><p>    vc6.0大家再熟悉不过的了，也许你可能喜欢使用vc8.0，也就是.net 2005，它功能强大，调试方便，但这里还是推荐6.0，因为，ds会在vc6.0开发环境中另外增加一个导航工具条，很方便，同时也会增加一个菜单栏。</p><p>    vc6.0安装完毕后，再安装windows ddk，其安装包可以在网上搜索到，建议去微软官方网站下载。具体下载哪个，得根据你电脑的操作系统来定，我的是windows xp，所以安装了windows xp ddk。</p><p>    最后，安装DriverStudio，全称<a href="http://down.upsdn.net/html/1/2.html">Compuware DriverStudio </a>，目前通用版本为3.2。</p><p>   
编译ddk包。进入到......\Compuware\DriverStudio目录下，我们可以看到两个文件夹，DriverNetworks 和
DriverWorks，里面分别有BuildAllDNW.bat和BuildAllDW.bat，我们在命令行下面分别cd至这两个目录，再运行这两
个批处理文件，可以看到提示，提示中说明了运行的格式，即：BuildAllDNW（或者BuildAllDW）
D:\winddk\2600（ddk的安装路径，这个是我机器上的路径） WinXP（操作系统版本）
x86（我的CPU类型）。回车即可。把两个批处理类似运行，就可以了，如果不编译，系统会报错，说没有.lib静态库文件。</p><p>    开始第一个工程。打开vc6.0，设置ddk路径，选择菜单中或者工具条中的 ddk build
settings，把ddk的根目录root
directory设置好，我的是“D:\WINDDK\2600”。然后选择菜单或工具条第一项，启动新建工程向导，一步步下去就可以了。编译时选择菜
单或工具条第四项。</p><p>    </p><p style="text-indent: 2em;"><a href="http://blog.csdn.net/meson/archive/2007/03/16/1530903.aspx"> don't know how to make 'D:\WINDDK\2600\lib\wxp\i386\ntstrsafe.lib' 解决办法</a></p><p style="text-indent: 2em;">driverstudio产生的驱动工程都会要连接ntstrsafe.lib这个库，但实际上这个库并不存在，在Project的Settings里的Link项中去掉这个库，然后在工程中的sources文件里边，找到下面一行：</p><p style="text-indent: 2em;">TARGETLIBS=$(DDK_LIB_PATH)\ntstrsafe.lib $(DDK_LIB_PATH)\csq.lib</p><p style="text-indent: 2em;">直接删除即可。</p><p style="text-indent: 2em;">有时候还会提示没有ntstrsafe.h，#include&lt;ntstrsafe.h&gt;出错，把它注释掉即可。</p><p style="text-indent: 2em;"> </p><p style="text-indent: 2em;">上面这个错误出现在windows xp操作系统中，我曾经帮别人在2003 server中配置开发环境，结果发现，不会存在上述问题，而且可以使用vc6.0的编译按钮进行编译，这在windows xp下是不行的。</p><p style="text-indent: 2em;">调试。调试方法很多，我一般都用DbgPrint。</p><p style="text-indent: 2em;">check和free的区别。简单地说，check相当于debug，free相当于release，前者是调试版本，后者是发布版本。你可以使用以下语句实现仅在check版本中输出调试语句：</p><p style="text-indent: 2em;">#if dug</p><p style="text-indent: 2em;">#define dprintf DbgPrint</p><p style="text-indent: 2em;">#else</p><p style="text-indent: 2em;">#define dprintf(x)</p><p style="text-indent: 2em;">#endif</p><p style="text-indent: 2em;">然后使用dprintf代替DbgPrint。</p><p style="text-indent: 2em;">调试工具。ds自带的softice，DriverMonitor，等。此外，Dbgview和DriverMonitor类似，可以从网上下载到的。Dbgview和DriverMonitor可以看到DbgPrint的字符串。</p><p style="text-indent: 2em;">驱动的加载。这个比较复杂，有dosname等细节。还有动态和静态加载的区别。动态加载可以参看FwHookDrv个人防火墙的例子，其中关键部分就是TDriver类，注意dosname。静态加载就是注册为服务即可，相对比较简单。</p><p style="text-indent: 2em;">转换为vc工程。开始－－程序－－Compuware DriverStudio－－develop－－DDK sources to vcproj Converter，即可转换，不会使用的多试几次就会了，什么都说了，就没有悬念了，呵呵。</p><p style="text-indent: 2em;">驱动开发调试环境。建议采用虚拟机或者双机的配置。因为驱动调试常常会出现蓝屏等等，所以得双机或者虚拟机，免得老是重启，浪费时间和心神。</p><img src ="http://www.cppblog.com/mydriverc/aggbug/35281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-10-27 00:32 <a href="http://www.cppblog.com/mydriverc/articles/35281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>10分钟完成一个USB驱动程序 </title><link>http://www.cppblog.com/mydriverc/articles/35186.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 25 Oct 2007 16:55:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/35186.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/35186.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/35186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/35186.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/35186.html</trackback:ping><description><![CDATA[
		<table id="19650" cellspacing="0" cellpadding="0" width="96%" align="center" border="0">
				<tbody>
						<tr>
								<td class="bt" id="19650">10分钟完成一个USB驱动程序</td>
						</tr>
						<tr>
								<td class="bt1" id="19650" height="30">责任编辑：admin 　 更新日期：2005-8-6</td>
						</tr>
						<tr>
								<td class="nrxq" id="19650">
								</td>
						</tr>
						<tr>
								<td style="PADDING-TOP: 5px">  很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的。但是，现在也有不少人都开始借助一些辅助工具。笔者去年开始接触到riverStudio，发现它真的是一个不错的开发工具，不仅写代码的时候思路清晰，而且和DDK的结合很好。<br /><br />    当然，也有很多人觉得用DriverStudio不够正宗，或者说不能很好的理解Windows Device Driver的架构。我感觉这就有点像MFC和SDK的关系，关于这个问题在很多地方都有争论，比如在万千新闻组上，就讨论了将近2个月。每个人都有自己的最爱，都有自己的习惯，只要你能把事情做好，我想用什么方法应该都是一样的。如果你已经习惯了用DDK开发，那完全还可以继续用下去；如果你觉得DriverStudio不错，那尝试用一个可以给你按照OOP概念来<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">编程</font></a>的工具有什么不好呢？<br /><br /><br /><br />在驱动开发网上，经常看到有人询问一些关于DriverStudio的使用的问题。我正好很有幸用它作了几个驱动程序，包括VXD, KMD和WDM，稍微有点心得，因此想写下来给大家作一个小小的参考。如果其中有错误，欢迎大家给我指出，谢谢。<br /><br /><br /><br />下面我就介绍一下用DriverStudio开发一个USB驱动程序的过程。这个USB设备有3个双向端点，每个端点的配置如下：<br /><br />EP 类型 地址 buffer(Bytes)<br /><br />0 IN/OUT Control 0x80/0x00 16/16<br /><br />1 IN/OUT Bulk 0x81/0x01 16/16<br /><br />2 IN/OUT Bulk 0x82/0x02 64/64<br /><br />我们的驱动程序需要实现的功能就是控制设备上的LED灯的亮和灭，以及通过Endpoint 2对设备进行读写。<br /><br /><br /><br />由于DriveStudio由几个部分组成，我们写这个驱动程序只要用到DriverWorks，因此下面我们就简称它为DW。在这里，我们假定读者已经正确的安装了DW，并且已经编译好了各个库文件。<br /><br /><br /><br />1. 首先，我们通过快捷方式“Setup DDK and Start MSVC“来启动VC IDE。这个快捷方式所指向的程序，会进行一些必要的设置，然后再启动VC IDE，这样我们的程序就可以使用DDK和DW的头文件和库了。<br /><br />2. 从VC IDE的菜单"DriverStudio"中选择"DriverWizard", 在如图1所示的对话框中, 写上项目名称. 在这里, 我们将这个项目称为: TEST, 所在的目录为D:\TEST. 然后点按钮"Next &gt;".<br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image001.png" width="474" /><br /><br />图1<br /><br />3. 在接下来的这个对话框中(如图2), 我们需要选择驱动程序的类型. 由于USB设备驱动程序是WDM类型的, 所以我们选择第二项并且点按钮"Next &gt;".<br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image003.png" width="474" /><br />图2<br /><br />4. 在第3个对话框中(如图3), 选择我们的驱动程序所操作的总线类型. 这里, 我们选择USB. 在USB Vendor ID和USB Product ID中填入USB设备的VID和PID. 假定我们的USB设备的VID和PID分别是16进制的0471和1801. 然后点按钮"Next &gt;". 关于VID和PID的规定请参考USB-IF的规范.<br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image005.png" width="474" /><br /><br />图3<br /><br />5. 在接下来的对话框中(如图4), 我们需要加入Endpoint 1和Endpoint 2的定义. 由于在USB中规定Endpoint 0是必须存在的, 所以我们不需要对Endpoint 0进行定义. 点"Add..."按钮, 弹出一个如图5所示的对话框. 我们将它修改成如图6所示. 其中, 按照USB的规定, 对于端点, 它的地址是1; 按照前面说明的设备的特点, Endpoint 1的最大的包大小为16字节, 因此在"Max Transer Size"中填入16; Endpoint Name可以通过"Suggest Name"得到. 按照这些原则, 继续设置其他的配置, 以使对话框4变成如图7所示. 接下来, 继续按"Next &gt;"按钮.<br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image007.png" width="474" /><br />图4<br /><br /><img height="292" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image009.png" width="269" /><br />图5<br /><br /><img height="292" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image011.png" width="269" /><br /><br /><br />图6<br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image013.png" width="474" /><br />图7<br /><br />6. 在如图8所示的对话框中, 可以填入我们需要的Driver Class的名字和文件名. 一般我们不需要更改. 继续按"Next &gt;"按钮.<br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image015.png" width="474" /><br />图8<br /><br />7. 在如图9所示的对话框中, 因为不需要给其他的驱动程序提供接口, 也不需要提供Flush功能, 所以不需要任何修改, 直接按"Next &gt;"按钮.<br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image017.png" width="474" /><br /><br />图9<br /><br />8. 在如图10所示的对话框中, 我们选择给端点2产生BULK Read的代码, 并且按"Next &gt;"按钮. DW会给我们产生一套对端点2进行读的代码, 不用修改, 就可以直接使用.<br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image019.png" width="474" /><br />图10<br /><br />9. 在如图11所示的对话框中, 我们选择给端点2产生BULK Write的代码, 并且按"Next "按钮. 这样, DW也会给我们产生一套对端点2进行写的代码, 不用修改, 就可以直接使用.<br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image021.png" width="474" /><br />图11<br /><br />10. 对于如图12的对话框, 我们直接按"Next &gt;"按钮. 这里是设置是否要将I/O请求排队, 在这里, 我们不需要排队.<br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image023.png" width="474" /><br />图12<br /><br />11. 在如图13所示的对话框中, 我们不需要创建任何注册表项, 所以直接按"Next &gt;"按钮.<br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image025.png" width="474" /><br /><br />图13<br /><br />12. 如图14所示的对话框, 是让我们设置一些驱动程序的属性, 比如接口, 缓冲区之类的. 一般的都可以使用缺省设置. 继续按"Next &gt;"按钮. <br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image027.png" width="474" /><br /><br />图14<br /><br />13. 在如图15所示的对话框中, 是让我们给驱动程序增加一些IOCTL接口. 我们只增加一个如图16所示的IOCTL来控制USB设备的LED灯. 然后按"Next &gt;"按钮. <br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image029.png" width="474" /><br />图15<br /><img height="259" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image031.png" width="236" /><br /><br />图16<br /><br />14. 在最后一个如图17所示的对话框中, 可以设置一些驱动程序的属性, 产生一个console测试程序. 按下"Finish"按钮, 就结束了Wizard. <br /><br /><img height="364" src="http://www.3800hk.com/Article/cxsj/cjing/sjkbccj/2005-08-06/img_c++/image033.png" width="474" /><br />图17<br /><br />这样, 我们就创建好了一个基本的驱动程序, 下面来看看还要做哪些工作才可以和我们的设备以及上层的应用程序通讯. <br /><br /><br /><br />把函数NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)改成如下面的样子：<br /><br />NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)<br /><br />{<br /><br />NTSTATUS status = STATUS_INVALID_PARAMETER;<br /><br /><br /><br />t &lt;&lt; "Entering TESTDevice::TEST_IOCTL_LED_Handler, " &lt;&lt; I &lt;&lt; EOL;<br /><br /><br /><br />__try<br /><br />{<br /><br />// TODO: Verify that the input parameters are correct<br /><br />// If not, return STATUS_INVALID_PARAMETER<br /><br />if(I.IoctlOutputBufferSize() || !I.IoctlBuffer() ||<br /><br />(I.IoctlInputBufferSize() != sizeof(UCHAR)))<br /><br />__leave;<br /><br />// TODO: Handle the the ZBUARD_IOCTL_LED_ON request, or <br /><br />// defer the processing of the IRP (i.e. by queuing) and set<br /><br />// status to STATUS_PENDING.<br /><br />PURB pUrb = m_Lower.BuildVendorRequest(<br /><br />NULL, // transfer buffer<br /><br />0, // transfer buffer size<br /><br />0, // request reserved bits<br /><br />(UCHAR)(*(PUCHAR)I.IoctlBuffer()), // request. 1 = LED_ON, 0 = LED_OFF<br /><br />0 // Value<br /><br />);<br /><br /><br /><br />// transmit<br /><br />status = m_Lower.SubmitUrb(pUrb, NULL, NULL, 5000L);<br /><br />}<br /><br />__finally<br /><br />{<br /><br />// TODO: Assuming that the request was handled here. Set I.Information<br /><br />// to indicate how much data to copy back to the user.<br /><br />I.Information() = 0;<br /><br />I.Status() = status;<br /><br />}<br /><br /><br /><br />return status;<br /><br />}<br /><br />这个函数是控制LED灯的，它是通过USB Vendor Request来向设备传送的。其中，request=1的时候表示让LED亮，request=0的时候让LED灭。它是通过DeviceIoControl由上层应用程序传下来。<br /><br /><br /><br />再看看读写部分，经过检查NTSTATUS TESTDevice::Read(KIrp I)和NTSTATUS TESTDevice::Write(KIrp I)可以发现，DW已经给我们写好了读写的代码，我们可以直接使用了。这些代码就是在上面的第8和第9步中产生的代码。<br /><br /><br /><br />最后，修改编译一下DriverStudio产生的测试程序Test_TEST程序，我们就可以通过命令行来测试我们的驱动程序了。对于LED的控制，我们可以直观的在设备上看到，但对于读写的操作就需要和firmware程序配合，这已经超出了本文的范围，不在这里讨论了。<br /><br /><br /><br />通过上面的讲解，我们可以看到有了DriverStudio，就可以快速的产生一个驱动程序，然后在里面作一些小的改动就可以使用了。即使是写一个比较复杂的USB驱动程序，我们也可以不用管一些系统的IRP处理，只要专注于我们自己的特定应用就可以了。而且它把一个驱动程序概括成几个类的概念，并且DW还附带有一些很有用的STL类，在VC IDE里面有了一个很清晰直观的表示。这样，对一些从上层应用转向驱动程序的开发人员，或者一些对C++/OOP很熟悉但不太了解系统内核的开发人员，都比较容易上手。即使对于推崇直接用DDK<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">编程</font></a>的人来说，通过阅读DriverStudio附带的源代码，也可以对驱动程序的开发有一个更加深入的了解。<br />　</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/mydriverc/aggbug/35186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-10-26 00:55 <a href="http://www.cppblog.com/mydriverc/articles/35186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DriverStudio工具包介绍</title><link>http://www.cppblog.com/mydriverc/articles/35184.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 25 Oct 2007 16:37:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/35184.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/35184.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/35184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/35184.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/35184.html</trackback:ping><description><![CDATA[
		<table class="jjt" id="19648" cellspacing="0" cellpadding="0" width="950" align="center" border="0">
				<tbody>
						<tr>
								<td class="bk1" id="19648" valign="top">
										<table id="19648" cellspacing="0" cellpadding="0" width="96%" align="center" border="0">
												<tbody>
														<tr>
																<td style="PADDING-TOP: 5px"> DriverStudio 是一套用来简化微软Windows 平台下设备驱动程序的开发，调试和测试的工具包。<br />DriverStudio 当前的版本包括下列工具模块：<br />DriverAgent<br />    DriverAgent 为Win32 应用程序提供直接访问硬件的功能。即使你没有任何设备驱动程序开发的经验或经历，你也能编写出DriverAgent应用程序来直接访问硬件设备。DriverAgent 应用程序可以运行在 Windows 98, Windows 95, Windows NT 和 Windows 2000平台上。(当前版本不支持Windows XP平台。)<br />VToolsD<br />    VToolsD 是一个用来开发针对Win9X (Windows 95 和 Windows 98)操作系统下设备驱动程序(VxD)的工具。VToolsD 中包括生成驱动程序源代码的工具，run-time 和 interface 库，以及一些驱动程序样本，可以用来作为各种类型的设备驱动程序的基础部分。<br />DriverWorks<br />    DriverWorks对于Windows NT下和 Windows 98 与 Windows 2000共同支持的Win32驱动模型(WDM)设备驱动程序的开发提供完全的支持。DriverWorks中包含一个非常完善的源代码生成工具(DriverWizard) 以及相应的类库和驱动程序样本，它提供了在C++下进行设备驱动程序开发的支持。 <br />DriverNetworks<br />    DriverNetworks 是针对Windows<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">网络</font></a>驱动开发人员的一个模块。在它的核心部分，DriverNetworks 是一个针对NDIS drivers 和 TDI clients (DriverSockets)的 C++ 的类库。DriverNetworks 中也有Quick Miniport Wizard 用来直接开始一个NDIS Miniport 或 Intermediate Driver 工程。它可以让你快速的生成所有采用DriverNetworks C++ 类库编写的NDIS驱动程序的编译，安装和调试所需要的文件 <br />SoftICE<br />    SoftICE 是一个功能极其强大的内核模式调试器，它支持在配置一台单独的计算机或两台计算机下进行设备驱动程序的调试。<br />    BoundsChecker Driver Edition<br />BoundsChecker 驱动程序版采用了NuMega针对应用程序开发的一种创新的错误检测<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">技术</font></a>。BoundsChecker 驱动程序版中提供了参数确认和系统实施可以用来监视和跟踪在不同的设备驱动程序与其它的操作系统的组件之间的所有的交互作用。配置向导提供了对于BoundsChecker 采集到的各种类型的大量信息的精确的控制。 <br />BoundsChecker 驱动程序版当前支持Windows NT, Windows 2000, Windows Millennium Edition和 Windows 98。(当前版本不支持Windows XP)<br />DriverWorkbench<br />    DriverWorkbench 可以使你进一步了解系统崩溃时的dump 文件和当时的事件。由于与BoundsChecker Driver Edition集成在一起, 在DriverWorkbench 中可以看到在系统崩溃前或其登录的时候由BoundsChecker 采集到的<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">数据</font></a>。这种独特的查看系统的方式提供了空前的能力，使得可以通过查看在系统崩溃之前系统实际活动的踪迹来发现问题之所在。 <br />DriverWorkbench 中也包含了 TrueTime Driver Edition. TrueTime Driver Edition 是一个性能分析工具，可让Windows NT 的设备驱动开发人员发现并修正驱动程序的性能瓶颈。TrueTime Driver Edition 是用来满足对于设备驱动程序和内核模式下代码开发人员的需求。一些额外的功能将出现在TrueTime Driver Edition 的下一个版本中。<br />DriverWorkbench 当前支持 Windows NT 和 Windows 9x. (当前版本不支持Windows XP)<br />FieldAgent<br />    FieldAgent 可让你对运行在客户的计算机上的驱动程序进行处理。由FieldAgent收集到的信息可用于追捕到那些可能只发生在特定的配置环境下问题的原因。<br />FieldAgent 当前支持 Windows NT 和 Windows 9x. (当前版本不支持Windows XP)<br />TrueCoverage Driver Edition<br />    用来确保对于所有的代码都已经完全被测试的方法是使用代码覆盖率工具。TrueCoverage 可以帮助你检测代码中的哪些部分已经被测试，哪些部分还没有被测试。通过在开发过程中测量和跟踪代码的执行情况和稳定程度，可以节约测试时间并提高代码的可靠性。TrueCoverage 能够很轻松的收集驱动程序的覆盖率<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">数据</font></a>，在源代码的上下文中查看这些<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">数据</font></a>，也可以将多次会话的结果合并以累加覆盖率的<a class="channel_keylink" href="http://www.3800hk.com/"><font face="宋体" color="#0810b7">数据</font></a>。<br />TrueCoverage Driver Edition当前支持 Windows NT 4.0 (Service Pack 3 or later) 和 Windows 2000. (当前版本不支持Windows XP)<br />在我们推荐你使用DriverWorks 或 VToolsD来开发设备驱动程序的同时，DriverStudio 中的工具与Microsoft DDK在一起也能很好的与其配合使用来开发出高质量的驱动程序。 
<p></p></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td align="middle" height="40"> </td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/mydriverc/aggbug/35184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-10-26 00:37 <a href="http://www.cppblog.com/mydriverc/articles/35184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是WDM驱动</title><link>http://www.cppblog.com/mydriverc/articles/28969.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Sun, 29 Jul 2007 07:55:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/28969.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/28969.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/28969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/28969.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/28969.html</trackback:ping><description><![CDATA[近来笔者刚刚装了一台新机，以为可以尽情的玩CS了，可不知为什么在CS中却没有声
音，这下可把我急坏了。我装的这个版本的CS（1.6版）在学校宿舍的电脑上玩的时候就经常死机，但是有声音，开始我还以为是游戏版本的问题，于是买了张
公认最稳定的1.4版本来试，但问题还是无法解决，难道是硬件的故障？ <br><br>　　抱着试一试的态度在学校的电脑上进入了CS，有声音！赶紧
退出游戏，进入&#8220;设备管理器&#8221;中一看，用的声卡和我的一样，都是&#8220;Creative PCI
128&#8221;。那为什么在我的电脑上就没有声音呢？经常反复的检查我发现，本机安装的是声卡驱动是支持WDM的，而我在家用的则是完整版的驱动（不支持
WDM），难道问题在这儿？ <br><br>　　迫不及待地赶回家中，从新安装支持WDM的声卡驱动，安装完成后，怀着忐忑不安的心情进入了CS&#8230;&#8230;哇，有声音了! <br><br>　　问题就这样解决了，不知道有没有人也遇到了类似的问题，如果有的话，那么赶紧安装一个支持WDM的驱动吧！ <br><br>　　什么是WDM驱动？ <br><br>
WDM（Win32 Driver
Model），即Win32驱动程序模型，是Microsoft力推的全新驱动程序模式，旨在通过提供一种灵活的方式来简化驱动程序的开发。在实现对新硬
件的支持上，减少并降低了所必须开发的驱动程序的数量和复杂性。除了通用的平台服务和扩展外，WDM还实现了一个模块化的、分层次的微型驱动程序结构。
WDM驱动的主要特点是可以让不支持多音频流的声卡支持多音频流，不使用音频线直接听音乐CD等。
<br><img src ="http://www.cppblog.com/mydriverc/aggbug/28969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-07-29 15:55 <a href="http://www.cppblog.com/mydriverc/articles/28969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VXD,KMD,WDM基本概念</title><link>http://www.cppblog.com/mydriverc/articles/28968.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Sun, 29 Jul 2007 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/28968.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/28968.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/28968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/28968.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/28968.html</trackback:ping><description><![CDATA[来来来,一起进入这黑黑的驱动程序世界.:) <br>这里要讲的是Vxd,Kernel Mode Driver,和WDM的一些基本问题.
<p>什么是VxD? <br>&nbsp;
VxD乃 VIRTUAL X
DRIVER.哎,说了也白说.其实就是虚拟设备驱动程序.<span style="font-weight: bold;">是系统用于对各种硬件资源识别,管理,维护运作的扩展</span>.VXD和VMM(虚拟机管理器)一起合
作,维持着系统的运作.VxD模式从WIN3X时代就开始了.一直到了WIN98还一直在MS的WIN系列操作系统中起主导作用.VxD运作在INTEL
系列CPU保护模式下的RING0.拥有对硬件的<font color="#cc0000" size="1">最高控制权</font>. </p>
<p>什么是Kernel Mode Driver(KMD)? <br>&nbsp;
<span style="font-weight: bold;">Kernel Mode
Driver是NT下提出的管理,维护硬件运作的驱动程序模式.该DRIVER运行于NT的KERNEL模式下,类似于RING0.</span>但是,一个KMD的运
作环境在不同的时候是根本不同的.DRIVER收到设备请求时的运行环境很可能和设备请求实际操作的运行环境<font color="#cc0000" size="1">根本不同</font>.这也是NT下,DRIVER的运作也受到NT的许多限制,一不小心,DRIVER和NT就同归于尽,来个BSOD(BLUE SCREEN OF DEATH). </p>
<p>什么是WDM? <br>&nbsp;
WDM乃WIN32 DRIVER MODEL的简写.随WIN95
OSR2.1推出,和WIN2000兼容.乃MS力推的'全新'的驱动程序模式.目前网上WDM的文章很多,但是成书不多.基本上由于98对WDM的支持
有限,而WIN2000又没有正式版推出,WDM的实际应用还不多.但是很快,WDM将成为主流的DRIVER模式.在我看来,WDM只不过是个<font color="#cc0000" size="1">PNP的KMD</font>而已.(也许是没领悟到精髓说的话:)) <br>&nbsp; </p>
<hr width="100%">
<p><br>&nbsp;&nbsp; 早期的WIN3X,核心是VMM,当时的VMM已经具备了基本的操作系统核心的一些特征.但是WIN3X的驱动程序模式混乱不堪.硬件由VxD驱动,网络和文件系统由<font color="#cc0000" size="1">实模式</font>驱动程序驱动,多媒体硬件和打印机有<font color="#cc0000" size="1"><strong>RING3 DLL</strong></font>驱动,系统服务决大部分被转到<font color="#cc0000" size="1">V86模式</font>下由实模式的DOS完成. <br>&nbsp;&nbsp;
到了WIN95很大一部分系统服务被转换到了保护模式下.但是,混乱的驱动模式没有改变.WIN95主攻方向是易用性,而且的确WIN95在用户界面上有
些进步.当95开发组努力开发的时候,NT也推出了.这是个号称C2极的OS.当然,我并不相信该系统的强壮性,如果它的源代码公开的话,很可能就不堪一
击.当然,NT比95还是有可圈点之处的.它乃是个真正的32位系统.而且,提供了5个应用环境:WIN32,VDM,POSIX.WOW,OS/2.这
5个环境相互独立,并且操作系统仅对WIN32环境提供接口,WIN32提供其他环境接口,其他环境的API调用最终被转换到WIN32,进入OS核心.
换言之:WIN32是屏幕,鼠标,键盘的拥有者,其他环境如要使用,就要向WIN32子系统申请. <br>&nbsp;&nbsp; 现在的WIN98乃是一个大杂种.包含了所有95的驱动程序模式,加上了WDM.很难想象.如果有一个硬件需要开放驱动程序.你必须首先看一下,适合什么模式.MINIPORT? NDIS? HID? RING0? RING3? 几乎每个硬件都对应一种模式. <br>&nbsp; ::UNDOCUMENTED HINT <br>&nbsp;&nbsp;&nbsp; <font color="#00cc00">NT
隐藏了一个环境.那就是NATIVE环境.这个环境可以说基本上没有在文档里出现过.也没有支持.在DDK里仅仅公开了一小部分NATIVE
API.NATIVE环境在系统启动时尤其重要.NT的CHKDSK程序就是个NATIVE应用程序.在运行该程序时,根本就没有WIN32环境,更没有
WOW, POSIX环境.这时候只有NATIVE API可供调用.而MS在很多情况下就是靠NATIVE
API来获取更高的应用程序效能.得到不公平的竞争优势.某些NATIVE API甚至可饶过系统的安全检查来完成原先不能完成的任务.</font> </p>
<p>&nbsp;
VXD和KMD的最大区别在于VXD不需要考虑多CPU的问题.而KMD需要调用自旋锁来同步多CPU之间数据访问.当然,如果必要的话,通过VXD来增
加对多CPU的支持应该并不困难,因为VMM提供了很开放的环境:VXD可以拦截VMM的调用入口.就类似于在DOS时代拦截INT21来扩展系统服务.
而NT如果要扩展系统的化就很困难了.因为这是未公开的.(当然,方法还是有的.等过一段时间我再写:)) <br>&nbsp; 另外一个重要的区别是VXD可以在CPU处于实模式时就获得系统的控制.而KMD不能.等KMD获得第一个启动时机,CPU已经处于保护模式,甚至你替换调HAL或NTOSKRNL也无济于事.因为CPU的模式切换是有NTLDR进行的:( </p>
<hr width="100%">
<p>到底如何决定该用VXD还是KMD还是WDM呢? <br>当然,首先应该考虑的是应用平台.如果是NT4.X,你没得选了,肯定是KMD了.如果是WIN95,那也只有VXD一种选择.当目标平台是98或WIN2000,可 <br>供选择的方法多点.但是也受到OS规范的限制. <br>98下.如果想开发的是FSD,那么必须用VXD.尽管98有个WDMFS.SYS的东西.但是它并非真正的WDM的文件系统驱动程序.98支持的FSD是以 <br>IFSMGR.VXD为基础的VXD. <br>如果想搞DISK,COMM...等一系列的DRIVER.你也要写VXD.因为98并没有提供该类的WDM支持.那么98下什么可以用WDM呢?HID,网络类,多媒体类 <br>的硬件支持已经转化到了WDM.你已经可以从DDK里发现这几类驱动程序的样板程序. <br>在NT2000下.我还不是很熟.但是很显然.对WDM的支持会更多.老的KMD将逐渐退出舞台.当然,KMD有他不可磨灭的优势.(在NT下,KMD的限制比9X <br>下的VXD多.但是它仍有一些活络余地.例如DISK驱动程序可以访问视频硬件,或者其他资源,但随NT的发展,早晚这些活络余地也会被取消.)WDM <br>需要将自己注册到相应的类里.有相应的例程必须输出.有些类似于MINIDRIVER. <br>最终要考虑的是DRIVER作者的习惯.对哪1种模式更熟悉,写作更方便,那就用哪个. <br>我个人开发98/95平台更多些.所以自己更倾向于VXD:安全限制最少.并且,我喜欢汇编.:) ? </p>
<p>　</p>
<hr width="100%">
<p>NTKERN.VXD的一些东东 </p>
<p><br>NTKERN.VXD乃是WIN98提供NT类服务的核心驱动程序.它输出了几个VXD服务.尽管有头文件,但是却没有文档.这里告诉大家一个诀窍,很多服务和NT下ZwXXX例程具有相同的参数,乃是VXD版的ZwXXX. <br>例如NtKernCreateFile就是ZwCreateFile的翻版.它也具有11个参数. <br>下面是NTKERN.VXD的VXD服务列表. <br>NTKERN_Service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _NTKERN_Get_Version, LOCAL <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernCreateFile, 11, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernClose, 1, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernReadFile, 9, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernWriteFile, 9, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernDeviceIoControl, 10, VxD_CODE <br>NTKERN_Service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _NtKernGetWorkerThread, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernLoadDriver, 1, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernQueueWorkItem, 2, VxD_CODE <br>NTKERN_Service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _NtKernPhysicalDeviceObjectToDevNode, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernSetPhysicalCacheTypeRange, 4, VxD_CODE <br>NTKERN_Service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _NtKernWin9XLoadDriver, VxD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernCancelIoFile, 2, VxD_CODE <br>NTKERN_Service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _NtKernGetVPICDHandleFromInterruptObj, VXD_CODE <br>NTKERN_StdCall_Service&nbsp;&nbsp; _NtKernInternalDeviceIoControl, 10, VxD_CODE <br>上
述服务里,部分是未公开的.如果大家参悟透了,NT下也有很多东西可迎刃而解.我想,文件IO应该没什么问题,但是其他东西就难搞了.在这里,我在网络上
仅看到了_NtKernLoadDriver的接口.他和ZwLoadDriver具有相同的参数,用来从VXD加载KMD.(ZwLoadDriver
本身又是个未公开的函数)具体接口如下: <br>NTSTATUS __stdcall ZwLoadDriver( PUNICODE_STRING ServiceKeyPath ). </p>
<p>&nbsp;</p>
<br><img src ="http://www.cppblog.com/mydriverc/aggbug/28968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-07-29 15:50 <a href="http://www.cppblog.com/mydriverc/articles/28968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>