VS12下开发wdk驱动,比较繁琐,要设置很多选项。本文在 win8 + visual studio2012 + wdk7600 下测试通过。 

 

一. 项目属性配置

常规  

  目标文件扩展名:.sys          // 必选

 

VC++目录

  包含目录    C:\WinDDK\7600.16385.1\inc\wdf\kmdf\1.9  inc\ddk inc\crt inc\api

  库目录      C:\WinDDK\7600.16385.1\lib\win7\i386     C:\WinDDK\7600.16385.1\lib\wdf\kmdf\i386\1.9

 

C/C++  

  优化

    优化(禁用/Od)                             // 可选 

    

  预处理器        

    WIN32=100;_X86_=1;DBG=1     // 必选 

  

  代码生成 

      运行时库:多线程调试(/MTd)  或  多线程(/MT)                   // 建议选 

      缓冲区安全检查:否                                            //可选 (可避免出现 error LNK2001:  无法解析外部符号  __security_cookie) 

  

  高级 

      调用约定  __stdcall(/Gz)                                       //必选 

  

链接器 

  常规 

     启用增量链接:否(/INCREMENTAL:NO)                           //建议

  

  输入 

      ntoskrnl.lib        // NT式驱动

      Hal.lib             // HalXXX 函数

      wdm.lib             // WDM式驱动

      wdmsec.lib  

      wmilib.lib          // WmiXXX 函数

      ndis.lib            // NdisXXX函数

 

      忽略所有默认库:    是 (/NODEFAULTLIB)                 //必选  

 

  清单文件:

      生成清单文件              否  // 必选,注vs12下必选该选项才能编译成功

      启用用户账户控制(UAC)   否  // 必选 

      不然会出现  fatal error LNK1295: “/MANIFESTUAC”与“/DRIVER”规范不兼容;链接时不使用“/MANIFESTUAC”   

  

  

  系统 

     子系统:  控制台(/SUBSYSTEM:NAIVE)                                //必选 

     堆栈保留大小:4194304                                             //可选 

     堆栈提交大小:  4096                                               //可选 

     驱动程序:    驱动程序(/DRIVER)                                     //必选   

 

  高级

    入口点:         DriverEntry                                         //必选 

    目标计算机:     MachineX86 (/MACHINE:X86)                           //可选

    随机基址:清空                                                         // 必选,否则会出现 fatal error LNK1295: “/DYNAMICBASE”与“/DRIVER”规范不兼容;链接时不使用“/DYNAMICBASE”

 

 

    数据执行保护(DEP):  清空                                             //必选,否则会出现 fatal error LNK1295:“/NXCOMPAT:NO”与“/DRIVER”规范不兼容;链接时不使用“/NXCOMPAT:NO”   

 

二. 编码



#include <ntddk.h> 

VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
{
KdPrint(("Enter DriverUnload\n"));
KdPrint(("Leave DriverUnload\n"));
}

NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath )
{
NTSTATUS status;
status = STATUS_SUCCESS;

KdPrint(("Enter DriverEntry\n"));
pDriverObject->DriverUnload = HelloDDKUnload;
KdPrint(("DriverEntry end\n"));

return status;
}



 

 三. 命令行编译

VS编译环境设置比较繁琐,可以直接编写makefile通过命令行编译。

在当前目录下准备 makefile 和 sources 两个文件。



#可直接从wdk安装目录拷贝,不要修改 !INCLUDE $(NTMAKEENV)\makefile.def !if $(FREEBUILD) MSC_WARNING_LEVEL=/W1 !else MSC_WARNING_LEVEL=/W3 !endif



 



TARGETNAME = hello
TARGETTYPE = DRIVER
TARGETPATH = x32
INCLUDES = .\

TARGETLIBS = $(DDK_LIB_PATH)\tdi.lib

SOURCES = hello.c


 

从开始菜单调出编译命令行,%StartMenu%\Windows Driver Kits\WDK 7600.16385.1\Build Environments\Windows 7

VS2012 开发驱动_编译环境

 

WDK提供了intel,AMD等芯片的支持,可编译32位或64位驱动。checked为debug版本编译环境,free为release版本编译环境。

启动32位编译环境,运行 build -Cz  或 bld 命令,即可在x32 目录下生成 hello.sys。