VS2008 开发驱动程序
XPJ(2010-2)
1.前言
随着计算机科学技术的发展,驱动程序的开发悄然成为各个计算机应用领域(特别是编写与硬件相关程序)的程序员的关注的话题,对于那些迫切希望探究驱动程序开发奥秘的程序员来讲,面对铺天盖地,五花八门的各种图书资料,难免出现不知从何入手的问题,本文将带领你利用微软成熟的开发设计环境,自己动手开发出几类最简单的驱动程序,抛砖引玉,希望大家能够从中吸取到自己需要的知识,戳破驱动程序开发神秘的面纱,提升自身软件设计实力,为祖国的软件事业发展做出更大的贡献。
本人在学习驱动程序开发伊始,懵懵懂懂中也翻阅了不少前辈们的书籍,也在互联网上搜集了不少关于驱动开发方面的资料,出处无法一一列举,本文也将引用或者参考部分内容,在此感谢原著对本人的帮助,对前辈们献上我最崇高的敬意。
水培鱼缸2.开发环境搭建
2.1软件平台搭建:
Microsoft Visual Studio 2008 , WDK7,VMware Workstation6.5.
安装VS2008及MSDN 。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\com_1。在串口端属性中选择“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 Windows(X86)”中的windbg并打开。
在file 菜单下的Symbol Search Path项点击,弹出Symbol Search Path对话框。
在Symbol Path编辑框里面输入
srv*c:\windows\symbols*msdl.microsoft/download/symbols;cache*c:\w
indows\symbols。并新建C:\Windows\symbols文件夹。在file 菜单下选择Kernal
Debug选项,弹出Kernal Debugging对话框,选择COM选项卡,输入波特率为
115200,端口名\\.\pipe\com_1 。勾选Pipe复选框。确定后WinDbg即处于等待
管道连接状态。
5.重新启动WindowsXP虚拟机。在引导列表(即可看到我们在第3步中添加的系
统描述)中,选择带有“-Debug”选项(前面设置哪项)并回车。正常情况下,
在启动一段时间后WinDbg即显示连接成功。选择WinDbg中的Debug菜单下
break选项,如果虚拟机响应,WinDbg调试菜单和工具栏即变为有效状态,可
以进行单步等其他操作。说明调试平台搭建成功。首次进行连接可能需要较长
时间。
3.KDM驱动开发示例
3.1项目属性配置
1.打开VS2008,新建一个Visual C++àWin32à win32空项目。例如DDKDemo。
2.打开VS2008 的“生成”菜单中的“配置管理器”选项。在活动解决方案配置中
选择《新建》,新建一个Check空的解决方案配置。
3.在解决方案管理器中,新建一个DDKDemo.h头文件,一个DDKDemo.cpp源文件。
4.打开VS2008的“项目”菜单里面“属性”选项。即打开Test项目属性页。在项
目属性页选择“配置属性”,打开十字图标。
5.选择“C\C++”并展开内部选项。
在“常规”选项中,在“附加包含目录”中添加wdk 引用头文件目录。并去除
“从父级或项目默认设置继承”复选框的勾选。Wdk头文件目录如下:
D:\WinDDK\7600.16385.0\inc\api
D:\WinDDK\7600.16385.0\inc\crt
D:\WinDDK\7600.16385.0\inc\ddk
注意笔者的WDK安装目录在D盘。
在“调试信息格式”中选择“C7 兼容(/Z7)”选项。
在“警告等级”中选择“3级(/W3)”。
在“将警告视为错误”中选择“是(/WX)”。
在“优化”选项中,在“优化”中选择“禁用(/Od)”。
在“预处理器”选项中,在“预处理器定义”中添加
“WIN32=100;_X86_=1;WINVER=0x501;DBG=1”。并去除“从父级或项目默认属
性继承”复选框的勾选。
在“高级”选项中,选择“调用约定”为“__stdcall (/Gz)”。
6.选择“链接器”并展开内部选项。
在“常规”选项中,修改“输出文件”的文件扩展名为.sys 添加“附加库目录”
D:\WinDDK\7600.16385.0\lib\Crt\i386
D:\WinDDK\7600.16385.0\lib\wxp\i386
并去除“从父级或项目默认设置继承”复选框的勾选。
在“输入”选项中,添加“附加依赖项”ntoskrnl.lib并去除“从父级或项目默认
设置继承”复选框的勾选。
在“清单文件”选项中,选择“生成清单”为否。
在“调试”选项中,选择“生成调试信息”为“是(/Debug)”。
在“系统”选项中,选择“子系统”为“本机(/SUBSYSTEM:NATIVE)”。选择
“驱动程序”为“驱动程序(/DRIVER)”。
在“高级”中,添加“入口点”为DriverEntry。选择“随即基址”为“默认值”。
选择“数据执行保护”为默认值。选择“目标计算机”为
“MachineX86(/MACHINE:X86)”。
在“命令行”选项中,添加“/SECTION:INIT,D /IGNORE:4078”。
3.2示例代码简介
/
*********************************************************************
**文件名:D D K D e m o.h
**注释:这是一个K D M的测试程序--用于对设备驱动程序本质进行必要的了解
**作者:X P J
**创建时间:2009-11-10
*********************************************************************/
#p r a g m a o n c e
//K D M驱动程序头文件
e x t e r n"C"
{
#i n c l u d e<n t d d k.h>
}
//定义几个函数段属性宏
#d e f i n e P A G E D C O D E c o d e_s e g("P A G E D")//分页内存段
#d e f i n e L O C K E D P A G E c o d e_s e g()//非分页内存段
#d e f i n e I N I T C O D E c o d e_s e g("I N I T")//初始化内存段
//定义设备扩展结构,用于保存设备属性
t y p e d e f s t r u c t_D E V I C E_E X T E N S I O N
给老师的元旦祝福{
P D E V I C E_O B J E C T p D e v i c e O b j e c t;//设备对象指针
U N I C O D E_S T R I N G u s t r D e v i c e N a m e;//设备名
U N I C O D E_S T R I N G u s t r S y m b o l i c N a m e;//符合连接名
}D E V I C E_E X T E N S I O N,*P D E V I C E_E X T E N S I O N;
//辅助创建设备函数声明
N T S T A T U S C r e a t e D e v i c e(I N P D R I V E R_O B J E C T p D r i v e r O b j e c t);
//驱动卸载回调函数
V O I D D D K U n l o a d(I N P D R I V E R_O B J E C T p D r i v e r O b j e c t);
//驱动投递函数
N T S T A T U S D D K D i s p a t c h R o u t i n e(I N P D E V I C E_O B J E C T p D e v i c e O b j e c t,
I N P I R P p I r p);
/********************************************************************* **文件名:D D K D e m o.c p p
**注释:D D K D e m o实现文件
**作者:X P J
**创建时间:2009-11-10
*********************************************************************/ #i n c l u d e"D D K D e m o.h"
#p r a g m a I N I T C O D E
e x t e r n"C"N T S T A T U S D r i v e r E n t r y(
I N P D R I V E R_O B J E C T p D r i v e r O b j e c t,
I N P U N I C O D E_S T R I N G u s t r R e g i s t r y P a t h)
/*++
功能描述:驱动入口函数。
参数:
p D r i v e r O b j e c t:驱动对象指针。
p R e g i s t r y P a t h:驱动注册表项路径字符串。
返回值:
成功返回:S T A T U S_S U C C E S S
--*/
{
N T S T A T U S s t a t u s;
D b g P r i n t(("H e l l o,M y W i n d o w s!
E n t e r D r i v e r E n t r y!\n"));
//添加一个调试断点,用于使用W i n D b g进行源代码调试
D b g B r e a k P o i n t();
//注册其他驱动回调函数入口
p D r i v e r O b j e c t->D r i v e r U n l o a d=D D K U n l o a d;
p D r i v e r O b j e c t->M a j o r F u n c t i o n[I R P_M J_C R E A T E]=D D K D i s p a t c h R o u t i n e;
p D r i v e r O b j e c t->M a j o r F u n c t i o n[I R P_M J_C L O S E]=D D K D i s p a t c h R o u t i n e;
p D r i v e r O b j e c t->M a j o r F u n c t i o n[I R P_M J_W R I T E]=D D K D i s p a t c h R o u t i n e;
p D r i v e r O b j e c t->M a j o r F u n c t i o n[I R P_M J_R E A D]=D D K D i s p a t c h R o u t i n e;
//创建设备
s t a t u s=C r e a t e D e v i c e(p D r i v e r O b j e c t);
D b g P r i n t(("D r i v e r
南沙岛屿E n t r y e n d!\n"));
r e t u r n s t a t u s;
捐衣服
}
#p r a g m a I N I T C O D E
N T S T A T U S C r e a t e D e v i c e(I N P D R I V E R_O B J E C T p D r i v e r O b j e c t)
小学生健康知识/*++
功能描述:辅助创建设备对象函数。
参数:
p D r i v e r O b j e c t:驱动对象指针。
返回值:成功 返回S T A T U S_S U C C E S S
失败 返回错误信息
--*/
{
N T S T A T U S s t a t u s;
P D E V I C E_O B J E C T p D e v i c e O b j e c t;
P D E V I C E_E X T E N S I O N p D e v i c e E x t e n s i o n;
D b g P r i n t(("
E n t e r C r e a t e D e v i c e!\n"));
//创建设备名称
U N I C O D E_S T R I N G D e v i c e N a m e;
R t l I n i t U n i c o d e S t r i n g(&D e v i c e N a m e,L"\\D e v i c e\\D D K D e v i c e");
//创建设备
s t a t u s=I o C r e a t e D e v i c e(p D r i v e r O b j e c t,
s i z e o f(D E V I C E_E X T E N S I O N),
&(U N I C O D E_S T R I N G)D e v i c e N a m e,
F I L E_D E V I C E_U N K N O W N,
0,T R U E,
&p D e v i c e O b j e c t);
i f(!N T_S U C C E S S(s t a t u s))
{
r e t u r n s t a t u s;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论