• 驱动编程学习(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

  • 相关阅读:
    哈夫曼树
    粒子群算法(1)----粒子群算法简单介绍
    白话经典算法系列之七 堆与堆排序
    UVa 11879
    有计划,公司运行——写到犹豫大三女生
    _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决
    s3c2440的A/D转换应用
    iSwifting如何发送照片社区
    【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用
    于Unity3D动态创建对象和创建Prefab三种方式的原型对象
  • 原文地址:https://www.cnblogs.com/s5689412/p/My_Driver_1.html
Copyright © 2020-2023  润新知