查看文章
 
(转) VS2008 开发驱动程序
2010年02月08日 星期一 11:02

转自http://blog.csdn.net/xpj1983/archive/2010/02/08/5297594.aspx,略有修缮(红色字体为wesley修改)

1.       前言

随着计算机科学技术的发展,驱动程序的开发悄然成为各个计算机应用领域(特别是编写与硬件相关程序)的程序员的关注的话题,对于那些迫切希望探究驱动程序开发奥秘的程序员来讲,面对铺天盖地,五花八门的各种图书资料,难免出现不知从何入手的问题,本文将带领你利用微软成熟的开发设计环境,自己动手开发出几类最简单的驱动程序,抛砖引玉,希望大家能够从中吸取到自己需要的知识,戳破驱动程序开发神秘的面纱,提升自身软件设计实力,为祖国的软件事业发展做出更大的贡献。

本人在学习驱动程序开发伊始,懵懵懂懂中也翻阅了不少前辈们的书籍,也在互联网上搜集了不少关于驱动开发方面的资料,出处无法一一列举,本文也将引用或者参考部分内容,在此感谢原著对本人的帮助,对前辈们献上我最崇高的敬意。

2.       开发环境搭建

2.1   软件平台搭建

Microsoft Visual Studio 2008 , WDK7,VMware Workstation6.5.

安装VS2008MSDN MSDN 可以帮助你更好使用VS2008,在出现问题找不到答案时,可以仔细阅读一下MSDN ,会提供一些必要的帮助。并且可以通过MSDN免费得到WDK7的下载连接。VS2008安装步骤略。

下载,安装WDK7,即(Windows Driver Kits 7.0.0)。提示选择安装选项时,建议全部选择安装,WDK便自动安装WinDbg(Windows调试工具),用于使用虚拟机对驱动程序代码进行调试。安装步骤略。

安装VMware Workstation.建议选择安装6.0以上版本。安装步骤略。安装成功以后新建Windows虚拟机,笔者选择的是WindowsXP系统(其他Windows系统大体相同),并安装系统映像,使之成为可以正常工作的WindowsXP虚拟系统。

2.2   调试平台搭建:

软件平台搭建成功以后,调试平台的搭建需要以下几个步骤。

第一步,修改WindowsXP虚拟机的系统配置。

1. 修改虚拟机配置。在硬件中选择添加串口。在连接属性中选择“使用命名管道”。保留默认命名管道名称\\.\pipe\com1。在串口端属性中选择“The end is the server.”,“The other end is an application. ”。勾选I/0模式中的”Yield CPU on Polled”复选框。

2. 启动虚拟机进入WindowsXP系统,打开“我的电脑”窗口,在“工具”菜单里面选择“文件夹选项”并点击,在文件夹选项弹出窗口选择“查看”选项卡。在“高级选项”中去除“隐藏受保护的操作系统文件”复选框勾选。并选择“显示所有文件和文件夹“。确定后系统关闭弹出窗口。

3. 打开系统的安装分区,笔者电脑默认安装的C盘。在根目录下可以找到“boot.ini”配置文件。双击打开文件。修改[boot loader]Timeouts = 30.修改[Operating systems],复制其中关于WindowsXP 的一行字符(如果是纯净系统只有一行系统描述,有些系统可能带有DOS安装工具的选项,我们只需要复制关于安装Windows系统的描述),添加一新行并粘贴复制描述字符串。在系统描述字符串里面添加“-Debug”以示和前面项目的区别,行末添加“/debug /debugport=COM1 /baudrate=115200 。保存关闭文件。关闭系统。

4. 从开始菜单中选择“Debugging Tools for WindowsX86)”中的windbg并打开。

file 菜单下的Symbol Search Path项点击,弹出Symbol Search Path对话框。在Symbol Path编辑框里面输入srv*c:\windows\symbols*http://msdl.microsoft.com/download/symbols;cache*c:\windows\symbols。并新建C:\Windows\symbols文件夹。在file 菜单下选择Kernal Debug选项,弹出Kernal Debugging对话框,选择COM选项卡,输入波特率为115200,端口名\\.\pipe\com1。勾选Pipe复选框。确定后WinDbg即处于等待管道连接状态。

5. 重新启动WindowsXP虚拟机。在引导列表(即可看到我们在第3步中添加的系统描述)中,选择带有“-Debug”选项(前面设置哪项)并回车。正常情况下,在启动一段时间后WinDbg即显示连接成功。选择WinDbg中的Debug菜单下break选项,如果虚拟机响应,WinDbg调试菜单和工具栏即变为有效状态,可以进行单步等其他操作。说明调试平台搭建成功。首次进行连接可能需要较长时间。

3.       KDM驱动开发示例

3.1   项目属性配置

1. 打开VS2008,新建一个Visual C++ Win32 console空项目。例如DDKDemo

2. 打开VS2008 的“生成”菜单中的“配置管理器”选项。在活动解决方案配置中选择《新建》,新建一个Check空的解决方案配置。

3. 在解决方案管理器中,新建一个DDKDemo.h头文件,一个DDKDemo.cpp源文件。

4. 打开VS2008的“项目”菜单里面“属性”选项。即打开Test项目属性页。在项目属性页选择“配置属性”,打开十字图标。

5. 选择“C\C++”并展开内部选项。

在“常规”选项中,在“附加包含目录”中添加wdk 引用头文件目录。并去除“从父级或项目默认设置继承”复选框的勾选。Wdk头文件目录如下:

D:\WINDDK\6001.18001\inc\api;D:\WINDDK\6001.18001\inc\crt;D:\WINDDK\6001.18001\inc\ddk;$(NOINHERIT)

注意笔者(Wesley)的WDK安装目录在D盘。

   在“调试信息格式”中选择 C7 兼容(/Z7)”选项。

   在“警告等级”中选择“3级(/W3)”。

   在“将警告视为错误”中选择“是(/WX)”。

在“优化”选项中,在“优化”中选择“禁用(/Od)”。

在“预处理器”选项中,在“预处理器定义”中添加                  WIN32=0x0501;_X86_=1;WINVER=0x0501;DBG=1;$(NOINHERIT)”(Wesley注,目标是xp系统)。

去除“从父级或项目默认属性继承”复选框的勾选。

在“代码生成”选项用,将“基本运行期检查”设置为“默认”(处理“error LNK2019: unresolved external symbol __RTC_CheckEsp”的错误),将“缓冲区安全检查”设置为“否”(处理“error LNK2019: unresolved external symbol __imp__TerminateProcess@8 referenced in function ___report_gsfailure”的错误)

在“高级”选项中,选择“调用约定”为“__stdcall (/Gz)”。

6. 选择“链接器”并展开内部选项。

在“常规”选项中,修改“输出文件”的文件扩展名为 .sys 添加“附加库目录”

D:\WINDDK\6001.18001\lib\crt\i386;D:\WINDDK\6001.18001\lib\wxp\i386;$(NOINHERIT)

并去除“从父级或项目默认设置继承”复选框的勾选。

在“输入”选项中,添加“附加依赖项”ntoskrnl.lib并去除“从父级或项目默认设置继承”复选框的勾选。

在“清单文件”选项中,选择“生成清单”为否。

在“调试”选项中,选择“生成调试信息”为“是 /Debug)”。

在“系统”选项中,选择“子系统”为“本机 /SUBSYSTEM:NATIVE)”。选择“驱动程序”为“驱动程序(/DRIVER)”。

在“高级”中,添加“入口点”为DriverEntry。选择“随即基址”为“默认值”。选择“数据执行保护”为默认值。选择“目标计算机”为“MachineX86(/MACHINE:X86)”。

在“命令行”选项中,添加“/SECTION:INIT,D /IGNORE:4078”。

3.2   示例代码简介

/*********************************************************************
** 作者:Wesley
** 时间:2010-2-8
*********************************************************************/

#pragma once
#ifdef __cplusplus
extern "C" {
#endif

#include <ntifs.h>

#ifdef __cplusplus
}
#endif

#include "DDKDemo.h"

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
NTSTATUS DriverEntry(

       IN PDRIVER_OBJECT pDriverObject,

       IN PUNICODE_STRING ustrRegistryPath)

{

NTSTATUS status = STATUS_SUCCESS;
DbgPrint(("Hello,My Windows!Enter DriverEntry!\n"));
return status;
}

#ifdef __cplusplus
}
#endif // __cplusplus

3.3   安装调试示例

打开DDKDemo所在目录,进入Check文件夹,复制DDKDemo.sys文件到虚拟机中。

驱动的安装可以有二种选择,一种使用安装工具进行安装,一种自己编写安装程序。对于初学者,可以从网上下载DriverMonitor驱动调试安装工具来安装自己生成的驱动程序。

打开WinDbg,在file菜单中打开Source Search Path项,在弹出的对话框的Source Path中添加DDKDemo目标文件夹全路径,即上述的Check文件夹的全路径。在Debug菜单中选择Source Mode为选择状态,启动Kernal Debug 内核调试。

WindowsXP虚拟机中安装加载DDKDemo.sys驱动程序,驱动程序被加载以后,虚拟机即在我们设置的断点中断,同时WinDbg处于激活状态。在WinDbg中选择单步执行,单步两下,WinDbg即可弹出附带源码的驱动程序调试窗口。现在你已经进入里系统驱动加载的过程中了,可以随意查看程序执行过程中的参变量的变化。接下来就是你自己施展才华时候了。呵呵~~期待着大家第一个驱动程序开发成功啊。(未完待续)

注意:若class中带有虚函数,则会加载失败(wesley)


类别:驱动相关||添加到搜藏 |分享到i贴吧|浏览(696)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu