用Clang-LLVM编译Windows驱动
踩过的坑比较多,折腾了一周总算编译出能用的驱动了
源码: 1
2
3
4
5
6
7
8
9
10
11
12
| void DriverUnload(PDRIVER_OBJECT driver_object) {
}
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryString)
{
UNREFERENCED_PARAMETER(pRegistryString);
pDriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
|
效果:
用Clang-LLVM编译Windows驱动
方法:安装VS-LLVM插件(工具->扩展和更新->LLVM Compiler Chain)
用Clang-LLVM编译Windows驱动
常规配置类型:动态库(.dll) 平台工具集:LLVM Windows SDK版本:看着设置,一般选最新
VC++目录 包含目录 手动指定:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\版本号\include C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\ucrt C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\km\crt C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\km C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\shared 库目录 手动指定:
C:\Program Files (x86)\Windows Kits\10\lib\SDK版本号\km\x64 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\版本号\lib\x64 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\版本号\atlmfc\lib\x64 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\lib\x64 C:\Program Files (x86)\Windows Kits\10\lib\SDK版本号\ucrt\x64 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\UnitTest\lib C:\Program Files (x86)\Windows Kits\10\lib\SDK版本号\um\x64 C:\Program Files (x86)\Windows Kits\NETFXSDK\版本号\lib\um\x64 C:\Program Files (x86)\Windows Kits\NETFXSDK\版本号\Lib\um\x64
C/C++
预处理器:
AMD64;_AMD64_;_WIN64;__WIN64_;_KERNEL_MODE;__x86_64__
代码生成:
Spectre缓解:否
运行库:MD
启用C++异常:否
链接器
输入
附加依赖项: ntstrsafe.lib netio.lib ntoskrnl.lib hal.lib wmilib.lib BufferOverflowK.lib
忽略特定默认库: msvcrt.lib libcmt.lib
清单文件
生成清单:否
系统
子系统:本机 (/SUBSYSTEM:NATIVE)
驱动程序:驱动程序 (/Driver)(选错此项会导致驱动无法正常卸载)
高级
入口点:DriverEntry
设置校验和:是 (/RELEASE)(选错此项会导致驱动无法正常加载)
坑1:不支持某些intrin用clang编译时会提示找不到__writecr0 __readcr3 __readmsr之类内核常用指令
解决方法1:修改clang\xxx\include\intrin.h,封装未实现的intrin,用__asm__让其强行支持,比如 1
2
3
4
| static __inline__ void __DEFAULT_FN_ATTRS
__writecr3(unsigned long long __cr3_val) {
__asm__ ("mov %0, %%cr3" : : "q"(__cr3_val) : "memory");
}
|
解决方法2:MASM写.asm,封装成函数让链接器去链接
比如
1
2
3
4
5
| ; void __stdcall AsmWriteCR2(_In_ ULONG_PTR cr2_value);
AsmWriteCR2 PROC
mov cr2, rcx
ret
AsmWriteCR2 ENDP
| 坑2:不支持SEH__try__except结构就别想用了
用Clang-LLVM编译Windows驱动
用Clang-LLVM编译Windows驱动
解决方法1:避免使用SEH,用不了就憋用了呗
解决方法2:把需要SEH的地方用MSVC编译成lib,再链接过去
|