clang编译内核_[原创]用Clang-LLVM编译Windows驱动

踩过的坑比较多,折腾了一周总算编译出能用的驱动了

源码:void DriverUnload(PDRIVER_OBJECT driver_object) {

}

NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryString)

{

UNREFERENCED_PARAMETER(pRegistryString);

pDriverObject->DriverUnload = DriverUnload;

return STATUS_SUCCESS;

}

效果:

方法:安装VS-LLVM插件(工具->扩展和更新->LLVM Compiler Chain)

常规

配置类型:动态库(.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__让其强行支持,比如static __inline__ void __DEFAULT_FN_ATTRS

__writecr3(unsigned long long __cr3_val) {

__asm__ ("mov %0, %%cr3" : : "q"(__cr3_val) : "memory");

}

解决方法2:MASM写.asm,封装成函数让链接器去链接

比如; void __stdcall AsmWriteCR2(_In_ ULONG_PTR cr2_value);

AsmWriteCR2 PROC

mov cr2, rcx

ret

AsmWriteCR2 ENDP

坑2:不支持SEH

__try__except结构就别想用了

解决方法1:避免使用SEH,用不了就憋用了呗

解决方法2:把需要SEH的地方用MSVC编译成lib,再链接过去

最后于 2020-6-30 11:16

被hzqst编辑

,原因:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值