用Clang-LLVM编译Windows驱动
2020-06-29 00:30:57 Author: bbs.pediy.com(查看原文) 阅读量:599 收藏

hzqst

雪    币: 8484

活跃值: 活跃值 (360)

能力值:

( LV9,RANK:250 )

在线值:

[原创]用Clang-LLVM编译Windows驱动

2天前 691

[原创]用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插件

配置类型:动态库(.dll)

平台工具集:LLVM

Windows SDK版本:看着设置,一般选最新

包含目录 手动指定:

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

预处理器:

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)(选错此项会导致驱动无法正常加载)

用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

__try__except结构就别想用了

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

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

[公告]看雪论坛2020激励机制上线了!发帖不减雪币了!如何获得积分快速升级?

最后于 2天前 被hzqst编辑 ,原因:


文章来源: https://bbs.pediy.com/thread-260313.htm
如有侵权请联系:admin#unsafe.sh