基于VC6.0+WDK的环境搭建及简单实例

来源:互联网 发布:intent接收数据 编辑:程序博客网 时间:2024/05/19 20:44
 

VC6.0+WDK 开发驱动的环境配置

(1)第一步:

打开VC建立一个Win32 Application工程,然后选择An empty Project。

(2)第二步:

 随便找一个驱动程序,主要是.C,.h及rc资源文件,加入第一步建立的工程

(3)第三步:

 设置VC编译驱动的环境,这才是重点。

 打开VC的Tool->Options->Directories里设置Include,Lib,及Exectuable File。这里说明下为什么要设置这三个东西:Include目录中,主要是供我们开发使用的头文件.h文件;Lib目录,为我们驱动所要调用的一些链接库文件;Exectuable File,这个很重要,它里面包含了我们编译驱动所使用的Cl.exe及连接link.exe文件,VC正是通过这两个文件来生成最后的驱动.sys文件(如果编译出现cl.exe错误,说明是这里的路径设置的不正确,我先前在这里走了弯路了,所以提醒下)(设置基本原则:要保证下面所有设置的路径排在前面)

 设置Include路径:

       D:\WinDDK\7600.16385.1\inc

       D:\WinDDK\7600.16385.1\inc\crt

       D:\WinDDK\7600.16385.1\inc\ddk

       D:\WinDDK\7600.16385.1\inc\api   (这里可能有些不需要,也可能少了,根据自己的情况在INC目录下继续添加就OK了)

 设置LIB路径:

      D:\WinDDK\7600.16385.1\lib

      D:\WinDDK\7600.16385.1\lib\Crt\i386

      D:\WinDDK\7600.16385.1\lib\wnet\i386

设置Executable Files:

      D:\WinDDK\7600.16385.1\bin\x86\x86

    (这里要注意,一定要在bin\x86目录下,确切的找到Cl.exe文件,然后添加它所在的目录,DDK与WDK这个文件所在的路径并不是一样的,上面的是我所安装的WDK中cl.exe所在的路径,这里要根据不同情况选择正确的路径)。

(4)第四步:

 这里要设置工程的属性:

 打开VC->Project菜单,找到C/C++选项卡,在Preprocesser definitions里输入如下字符串(将原来的字符串覆盖):

  Release下输入:

  _X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,NDEBUG

 Debug下输入:

  _X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,_DEBUG

 在Code Generation里的Calling convention用__stdcall

  Debug版有个特殊编译选项 /GZ注意是大写的,小写的不要删!)删掉,否则有链接错误,chkesp链接 不上什么的。

(5)第五步:

  设置link选项卡,将输出文件名改为sys扩展名,

  在General的Objcet/Library modules,填写驱动调用的几个lib:

           ntoskrnl.lib hal.lib usbd.lib wmilib.lib。
        然后进入Output在Entry-point symbol:填DriverEntry
        面就是往Project Options手动增加一些链接选项,复制如下进去:
      /machine:IX86 /driver /subsystem:native /SECTION:INIT,d /IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
       删除如下选项:
         /subsystem:windows
       /machine代表目标机器类型,/driver代表驱动,/subsystem:native 也是代表驱动。

 

以下为一简单例子:

#include <ntddk.h>

 

//提供一个Unload函数只是为了

VOID DriverUnload(PDRIVER_OBJECT driver)

{

       // 但是实际上我们什么都不做,只打印一句话:

       DbgPrint("first: Our driver is unloading…\r\n");

}

 

// DriverEntry,入口函数。相当于main。

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)

{

#if DBG

       // _asm int 3

#endif

       // 这是我们的内核模块的入口,可以在这里写入我们想写的东西。

       // 我在这里打印一句话。因为”Hello,world”常常被高手耻笑,所以

       // 我们打印一点别的。

       DbgPrint("first: Hello, my wdk dirver!");

       // 设置一个卸载函数便于这个函数能退出。

driver->DriverUnload = DriverUnload;

       return STATUS_SUCCESS;

}

原创粉丝点击