VS2012 开发驱动

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

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

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

 

 

猜你喜欢

转载自tcspecial.iteye.com/blog/2287684