驱动编程学习(1)

Driver Development Part 1: Introduction to Drivers

http://www.codeproject.com/kb/system/driverdev.aspx

废话不多说,上面是学习的系列文章之一,下定决心想要学习驱动编程的人看完是没问题的(当然能看懂多少,能记住/理解多少又是另外一回事了),

看完之后必然会想研究下作者给的例子,于是编译问题出来了,在研究几天之后我基本了解了问题所在,下面是我几天的经验心得,

希望对看到这篇文章的人能有所帮助,如果看完之后还有问题可以评论,我尽可能的答复。

 

我的环境是:Windows XP+VS 2008+DDKBuild+WDK 7600.16385.1,其他环境可能出现的问题我不一定清楚,所以不见得会答复。

DDKBuild可以在这里下载:http://www.hollistech.com/Resources/ddkbuild/ddkbuild.htm

 

为了让大家能最快时间的编译通过,我还是采取Step by Step的方式,在每一步中再加上自己的经验心得。

(想保存草稿,却发现在分类里面既没有C,也没有驱动,VS 2008,Windows XP,看来我是一个outman了,所以取消了发布到首页的选项,

有多少人能看到就随缘了)

 

首先要说明的是原文写于2005年,那时候还没有WDK,作者大概也习惯于手工写makefile,所以例子可以直接用nmake编译,

时至今日,DDK已经进入了WDK的时代,能与时俱进应该是最好的,所以我下面采用的方式是纯WDK的方式,特作说明。

 

1. 将代码解压开,注意:不要将代码解压到有空格的目录下,这样会导致编译警告。为了跟后面系列文章的代码区分开,把目录名从drivers改为ch1。

注意:也不要把代码解压到有中文的目录下(因为我的例子就是放在中文名目录下了),这样编译之后会文件出现在其他目录下。

比如我是放在K:\Windows开发目录下,结果编译出来之后的文件在K:\windows\objchk_wnet_x86\i386下

看来对空格和中文的支持都不怎么样啊!

 

2. 新建VS项目,具体设置可以看下面的图片,注意:ddkbuild.bat的路径必须放在Path环境变量中,如果在打开VS之后才修改环境变量,VS需要重新启动才能生效。

ddkbuild -WNET checked .

ddkbuild -WNET checked . -cZ

 

3. 仿照WDK的例子(我这里用的是7600.16385.1\src\audio\msvad),加入必要的文件。

首先在ch1目录下加入dirs和sources.inc,做必要的修改,具体的改动可以参考附件,看作了哪些改动。

然后在example目录下加入makefile和sources,同样做必要的修改。

加入文件之后就可以编译了,当然会有编译错误,下面来一个一个解决。

注意:因为WDK在编译时启用了-WX(见sources.inc),会将所有编译器警告都视为错误,所以要编译通过的话,要做到没有警告才行。

warning C4005: '_X86_' : macro redefinition

解决:去掉两个.c文件中的#define _X86_这一行

warning C4100: 'Irp' : unreferenced formal parameter

解决:这是因为没使用参数列表中的参数所致,可以使用UNREFERENCED_PARAMETER宏,注意:UNREFERENCED_PARAMETER宏必须在变量声明之后使用,

否则会产生新的警告。

warning C4116: unnamed type definition in parentheses

解决:好吧,我承认这个问题我没有找到最好的解决办法,因为这个问题其实是微软的问题,为了解决这个问题,微软自己甚至在windows.h屏蔽了这个警告,

参考这里:http://www.winehq.org/pipermail/wine-patches/2004-September/012587.html

#if defined (_MSC_VER)
#if ( _MSC_VER >= 800 )
#ifndef __cplusplus
#pragma warning(disable:4116)       /* TYPE_ALIGNMENT generates this - move it */
                                    /* outside the warning push/pop scope. */
#endif
#endif
#endif

目前的解决办法有:

1. 直接将TYPE_ALIGNMENT(char)硬编码为1;

2. 改成__alignof(char),这样大概能让人心理上舒服点。

之所以会有这个问题,是因为原始的文件是.c文件,没有定义__cplusplus,所以会产生这个问题,可以看TYPE_ALIGNMENT的定义:

#ifdef __cplusplus
#if _MSC_VER >= 1300
#define TYPE_ALIGNMENT( t ) __alignof(t)
#endif
#else
#define TYPE_ALIGNMENT( t ) \
    FIELD_OFFSET( struct { char x; t test; }, test )
#endif

只要以后用.cpp文件,就不会有这个问题了,就像WDK里面的例子那样。

 

因为可执行文件的编译不是我关注的重点,所以在尝试使用WDK编译受阻之后就没有再继续研究,采用“Visual Studio 2008 命令提示”,

进入LoadDriver和usedriver目录下,使用nmake命令编译通过。

 

最后附上可以编译通过的项目供参考。

 /Files/s5689412/ch1.rar

 

Update:经过一番折腾,在参考了下面两篇资料之后把可执行文件编译通过了

http://blog.csdn.net/goodwinds/archive/2008/05/04/2384160.aspx

http://www.osronline.com/showthread.cfm?link=176004

下面还是附上编译通过的项目

/Files/s5689412/ch1_update.rar

posted on 2010-09-15 12:50  sPhinX  阅读(1735)  评论(1编辑  收藏  举报

导航