跳转到内容

默认会自动探测 WDK 所在环境,当然也可以指定 WDK sdk 环境目录:

sh
$ xmake f --wdk="G:\Program Files\Windows Kits\10" -c $ xmake

更多详情可以参考:#159

相关完整工程 example 见:WDK examples

umdf 驱动程序

lua
target("echo")  add_rules("wdk.driver", "wdk.env.umdf")  add_files("driver/*.c")  add_files("driver/*.inx")  add_includedirs("exe")  target("app")  add_rules("wdk.binary", "wdk.env.umdf")  add_files("exe/*.cpp")

kmdf 驱动程序

lua
target("nonpnp")  add_rules("wdk.driver", "wdk.env.kmdf")  add_values("wdk.tracewpp.flags", "-func:TraceEvents(LEVEL,FLAGS,MSG,...)", "-func:Hexdump((LEVEL,FLAGS,MSG,...))")  add_files("driver/*.c", {rule = "wdk.tracewpp"})  add_files("driver/*.rc")  target("app")  add_rules("wdk.binary", "wdk.env.kmdf")  add_files("exe/*.c")  add_files("exe/*.inf")

wdm 驱动程序

lua
target("kcs")  add_rules("wdk.driver", "wdk.env.wdm")  add_values("wdk.man.flags", "-prefix Kcs")  add_values("wdk.man.resource", "kcsCounters.rc")  add_values("wdk.man.header", "kcsCounters.h")  add_values("wdk.man.counter_header", "kcsCounters_counters.h")  add_files("*.c", "*.rc", "*.man")
lua
target("msdsm")  add_rules("wdk.driver", "wdk.env.wdm")  add_values("wdk.tracewpp.flags", "-func:TracePrint((LEVEL,FLAGS,MSG,...))")  add_files("*.c", {rule = "wdk.tracewpp"})  add_files("*.rc", "*.inf")  add_files("*.mof|msdsm.mof")  add_files("msdsm.mof", {values = {wdk_mof_header = "msdsmwmi.h"}})

生成驱动包

可以通过以下命令生成.cab驱动包:

sh
$ xmake [p|package] $ xmake [p|package] -o outputdir

输出的目录结构如下:

 - drivers  - sampledsm  - debug/x86/sampledsm.cab  - release/x64/sampledsm.cab  - debug/x86/sampledsm.cab  - release/x64/sampledsm.cab

驱动签名

默认编译禁用签名,可以通过 set_values("wdk.sign.mode", ...) 设置签名模式来启用签名。

测试签名

测试签名一般本机调试时候用,可以使用 xmake 自带的 test 证书来进行签名,例如:

lua
target("msdsm")  add_rules("wdk.driver", "wdk.env.wdm")  set_values("wdk.sign.mode", "test")

不过这种情况下,需要用户手动在管理员模式下,执行一遍:$xmake l utils.wdk.testcert install,来生成和注册test证书到本机环境。 这个只需要执行一次就行了,后续就可以正常编译和签名了。

当然也可以使用本机已有的有效证书去签名。

从sha1来选择合适的证书进行签名:

lua
target("msdsm")  add_rules("wdk.driver", "wdk.env.wdm")  set_values("wdk.sign.mode", "test")  set_values("wdk.sign.thumbprint", "032122545DCAA6167B1ADBE5F7FDF07AE2234AAA")

从store/company来选择合适的证书进行签名:

lua
target("msdsm")  add_rules("wdk.driver", "wdk.env.wdm")  set_values("wdk.sign.mode", "test")  set_values("wdk.sign.store", "PrivateCertStore")  set_values("wdk.sign.company", "tboox.org(test)")

正式签名

通过指定对应的正式签名证书文件进行签名:

lua
target("msdsm")  add_rules("wdk.driver", "wdk.env.wdm")  set_values("wdk.sign.mode", "release")  set_values("wdk.sign.company", "xxxx")  set_values("wdk.sign.certfile", path.join(os.projectdir(), "xxxx.cer"))

生成低版本驱动

如果想在wdk10环境编译生成 win7, win8 等低版本系统支持的驱动,可以通过设置 wdk.env.winver 来切换系统版本:

lua
set_values("wdk.env.winver", "win10") set_values("wdk.env.winver", "win10_rs3") set_values("wdk.env.winver", "win81") set_values("wdk.env.winver", "win8") set_values("wdk.env.winver", "win7") set_values("wdk.env.winver", "win7_sp1") set_values("wdk.env.winver", "win7_sp2") set_values("wdk.env.winver", "win7_sp3")

我们也可以手动指定编译的目标程序支持的windows版本:

sh
$ xmake f --wdk_winver=[win10_rs3|win8|win7|win7_sp1] $ xmake