您的位置:首页 > 移动开发 > Objective-C

编写驱动的环境搭建

2011-04-19 14:30 211 查看
从编写到编译链接都有好几种方法,不过个人比较喜欢用vs的环境.再搭配上visual assist 让写驱动也不会那么枯燥了.

 

关于vs的设置参考别人方法修改如下:

 

1、安装了D/WDK,目录名字不要带空格;
2、 在VS2005中新建立一个win32空项目,在工具栏选择"生成|配置管理器",在活动解决方案配置中 新建一个方案名(不要Debug、Release);
3、选择 "工具|选项"菜单,选择"项目和解决方案" 选项卡,选择"VC++目录"选项卡在"显示以下内容的目录"下拉菜单中选择"包含文件"菜单 添加"(D/WDK目录)/inc/"下的几个文件夹 , 选择"库文件"菜单添加"(D/WDK目录)/lib/wxp/i386"。

接下来就是工程配置属性项
4、选择"项目|属性" 弹出"属性页"对话框   选择"配置属性"选项卡   选择"C/C++"选项卡 
      4.1、再选择"常规"选项卡
                     1、"调试信息格式"   选择  C7兼容(/Z7) 用Z7模式产生调试信息
                     2、取消显示启动版权标志   选择    是(/nologo)  (默认)
                     3、警告等级  选择    3 级(/W3)
                     4、将警告视为错误    选择   是(/WX)
     4.2、选择"优化"选项卡
                     1、优化    选择   禁用(/Od)
                        其他默认即可
     4.3    选择"预处理器"选项卡
                     1、预处理定义   编辑   WIN32=100;_X86_=1;DBG=1 ;WINVER=0x501

                       其他默认即可
     4.4    选择"高级" 选项卡
                       1、调用约定  选择  __stdcall (/Gz)    (这个不用说了驱动函数调用采用标准调用)

5、 好了,轮到"连接器" 选项卡了
          5.1  选择"常规"选项卡
                1、输出文件     编辑     MyDriver_Check/HelloDDK.sys
                2、启用增量链接  选择     否(/INCREMENTAL:NO)
                3、附加库目录  编辑  (D/WDK目录)/lib/wxp/i386    (因为等下要用到ntosknl.lib   如果是WDM驱动程序,则需要链接wdm.lib)
                  其他选项默认
          5.2  选择"输入"选项卡
                 1、附加依赖项    编辑  弹出  "附加依赖项"  编辑框, 在编辑框里输入 "ntoskrnl.lib",并且把"从父级或项目默认设置继承" 的勾去掉(免得调用 用户层 lib 文件)
                 2、忽略所有默认库  选择    是(/NODEFAULTLIB)
                    其他选项默认
          5.3  选择"调试"选项卡
                   1、生成调试信息  选择   是(/DEBUG)
                   2、生成程序数据库文件   编辑    MyDriver_Check/HelloDDK.pdb
          5.4   选择"系统" 选项卡
                   1、子系统    选择   本机(/SUBSYSTEM:NATIVE)
                   2、堆栈保留大小  编辑  40000
                   3、堆栈提交大小  编辑  1000
                   4、驱动程序        选择    驱动程序(/DRIVER)
          5.5   选择"高级" 选项卡
                  1、入口点   编辑    DriverEntry    (驱动的入口函数地址)
                  2、基址    编辑    0x10000
                  3、目标计算机    MachineX86 (/MACHINE:X86)     (一般是这个)
最后在链接器->命令行 中键入 /SECTION:INIT,D /IGNORE:4078 /safeseh:no。这是防止出现下面这个warning:
LINK : warning LNK4078: 找到多个“INIT”节,它们具有不同的属性(E2000020).
另外一点值得注意的就是: 慎用extern "C"。
因为在配置编译器和链接器的时候。如果调用的是ntddk.h,那么不用加上extern "C".

 

 

但是我是没有warning LNK4078这个警告的.所以我没有加上/SECTION:INIT,D /IGNORE:4078 /safeseh:no这一句.

 

另外需要注意的是关于版本和目标系统的问题.

 

WIN32=100;_X86_=1;DBG=1 ;WINVER=0x501

 

DBG=1表示生成调试态驱动,对应D/WDK自带编译工具中的checked,DBG=0则对应D/WDK自带编译工具中的free.

WINVER表示目标操作系统版本,501是XP,502是03,500是2k,这个可以在cmd下执行ver命令得到.

附上一个简短的驱动例子:

#include "ntddk.h"
void Unload(IN PDRIVER_OBJECT DO)
{
 KdPrint(("this is Unload!"));
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DO,IN PUNICODE_STRING RegPath)
{
 DO->DriverUnload = Unload;
 KdPrint(("this is entry!"));
 return STATUS_SUCCESS;
}

哈哈哈,编译的时候不用再写makefile和sources了.

 

其中有点郁闷的因为第一次下载的dbgview有问题,导致KdPrint(("this is entry!"));显示不出来.结果自己纠结了半天无果.

 

顺便提一下,用DBGVIEW时记得在"监视"工具拦勾上"监视内核".另外KdPrint只在调试版中才打印.DbgPrint则在任何版本中都会打印.

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息