VS2012 开发驱动 博客分类: C/C++OS window驱动win7helloworld
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。