准备工作:安装DDK 7600
1、新建一empty Wine2工程
然后可用vs自带的Debug/Release 配置去修改,也可以新建一新的配置:
Build->Configuration Manager 下新建一编译配置,如命名:Driver
新添加一个cpp文件,任意命名如:test.cpp, 不然工程->属性中不会出现C/C++标签页
2、Tools-Options-VC++ Directories 下的设置
① 包含文件(也可以此处不设,在后面的 工程属性-C/C++-Additional Include Directories中设置)
C:\WinDDK\7600.16385.1\inc\ddk
C:\WinDDK\7600.16385.1\inc\crt
C:\WinDDK\7600.16385.1\inc\api
将这几项置顶
② 库文件路径
C:\WinDDK\7600.16385.1\lib
C:\WinDDK\7600.16385.1\lib\wxp\i386
3、工程属性-C/C++ 目录下的设置
General 选项
Additional Include Directories :
C:\WinDDK\inc\api;C:\WinDDK\inc\crt;C:\WinDDK\inc\ddk;$(NOINHERIT)
Debug Information Format: C7 Compatible(Z7)
Treat Warnings As Errors: No
Optimization:
Inline Function Expansion: Any Suitable(/0b2)(选此项,则上面必须选C7 Compatible)
Enable Intrinsic Functions: Yes(/oi)
Preprocessor:
_X86_
Code Generation:
Enable String Pooling: No
Enable Minimal Rebuild:No
Enable C++ Exceptions:No
Smaller Type Check: No
Basic Runtime Check: Default
Run Time Library: /MTD
Struct Member Alignment: Default
Buffer Security Check: No
Enable Function-Level Linking:No
Precompiled Headers:
不使用预编译头
Advanced:
调用约定:__stdcall (/Gz)
编译为: 若选编译为C++代码,则在cpp文件中 需要在某些地方如 DriverEntry 前加 extern "C"
4、工程属性-Linker目录下的设置
General:
输出文件(自己定义)如:..\Output\test.sys
Input:
附加依赖项: ntoskrnl.lib hal.lib
//NT式驱动 ntoskrnl.lib WDM式驱动 wdm.lib
( HalXXX 函数在Hal.lib, WmiXXX 函数在 wmilib.lib , NdisXXX函数在 ndis.lib )
忽略所有默认库: 是 (/NODEFAULTLIB)
Manifest File:
启用用户账户控制(UAC) 否
不然会出现 >LINK : fatal error LNK1295: “/MANIFESTUAC”与“/DRIVER”规范不兼容;链接时不使用“/MANIFESTUAC”
Debugging:
如需调试则选
System:
子系统: 本机(/SUBSYSTEM:NATIVE) 或 控制台(/SUBSYSTEM:CONSOLE)
驱动程序: 驱动程序(/DRIVER) //必选
Optimization:
References: /OPT:REF
Enable COMPAT Folding: /OPT:ICF
Advanced:
入口点: DriverEntry //必选
基址: 0x10000 //建议选上
随机基址:清空 (默认值) //必选
不然会出现 e:\xxx.sys : fatal error LNK1295:
“/DYNAMICBASE”与“/DRIVER”规范不兼容;链接时不使用“/DYNAMICBASE”
数据执行保护(DEP): 清空 (默认值) //必选
不然会出现 e:\xxx.sys : fatal error LNK1295:
“/NXCOMPAT:NO”与“/DRIVER”规范不兼容;链接时不使用“/NXCOMPAT:NO”
5、上述设置全部结束后,可新建源文件,写入代码
#include<ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("HelloEping\r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path)
{
DbgPrint("Hello,Eping!");
driver->DriverUnload=DriverUnload;
return STATUS_SUCCESS;
}
编译成功,运行正常,大功告成!