为什么80%的码农都做不了架构师?>>>   

xmake v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmake插件去开发WDK驱动。

下面是xmake支持的一些编辑器插件,用户可以挑选自己喜欢的编辑器配合xmake来使用:

  • xmake-idea
  • xmake-vscode
  • xmake-sublime

WDK环境介绍

首先,我们先简单介绍下WDK10的编译环境的安装方式,我们可以看下微软的官方文档:Download the Windows Driver Kit (WDK)

里面介绍了两种环境:

  1. 下载WDK开发包,直接安装到系统并集成到VS的开发环境中
  2. 下载EWDK iso镜像(内含完整WDK开发环境),直接挂载后,运行LaunchBuildEnv进入cmd环境

xmake对于这两种环境都是完全支持的,如果用户直接下载安装WDK环境到本地系统,那么不需要任何配置,只需要执行:

$ xmake

xmake会自动检测到WDK的安装环境,然后编译相关驱动项目,如果用户是直接挂载的EWDK iso开发镜像,那么编译前配置下WDK所在路径即可:

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

更多详情可以参考:#159

WDK驱动实例

xmake支持umdf, kmdf, wdm驱动项目的维护,也是采用一系列扩展的WDK rule规则来实现,类似:Qt编译环境的支持。

目前支持的规则有如下这些:

  • rule("wdk.driver")

  • rule("wdk.binary")

  • rule("wdk.static")

  • rule("wdk.shared")

  • rule("wdk.env.kmdf")

  • rule("wdk.env.umdf")

  • rule("wdk.env.wdm")

其中,wdk.env.*规则描述驱动编译的环境,wdk.driver, wdk.static描述编译的目标类型,两者可以互相结合使用,我们既可以用来编译驱动程序,也可以用来编译基于wdk环境的静态库、可执行程序。

下面,通过一些例子可以简单看下使用方式,具体例子代码见wdk-examples,其中的项目代码是从Windows-driver-samples移植过来的。

umdf驱动程序

我们通过同时应用wdk.driver, wdk.env.umdf规则,来描述这个target作为umdf驱动程序来编译:

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

我们也可以通过wdk.binary, wdk.env.umdf规则,来描述一个基于wdk/umdf编译环境的上层可执行程序:

target("app")add_rules("wdk.binary", "wdk.env.umdf")add_files("exe/*.cpp")

kmdf驱动程序

kmdf的项目描述跟刚才的umdf类似,只需要把wdk.env.umdf换成wdk.env.kmdf的环境规则就行了。

target("nonpnp")add_rules("wdk.driver", "wdk.env.kmdf")add_values("wdk.tracewpp.flags", "-func:TraceEvents(LEVEL,FLAGS,MSG,...)")add_values("wdk.tracewpp.flags", "-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")

这个项目里面,需要特别注意的是,我们还用到了tracewpp对一些源文件的预处理,对于tracewpp任务的介绍,可以看下官方文档tracewpp-task,这里就不多做说明了。

我们直接说下,如何在xmake的项目里应用tracewpp规则吧,由于这个规则并不是对当前target所有源文件都去处理的,因此我们只对需要的源文件进行应用这个规则,例如:

add_files("driver/*.c", {rule = "wdk.tracewpp"})
add_files("driver/dir/test.c", {rule = "wdk.tracewpp"})

当然tracewpp还会有一些自己的特殊选项,用户有时候需要自己根据需要来设置,例如:

add_values("wdk.tracewpp.flags", "-func:TraceEvents(LEVEL,FLAGS,MSG,...)")
add_values("wdk.tracewpp.flags", "-func:Hexdump((LEVEL,FLAGS,MSG,...))")

关于add_values的使用说明,可以看下文档:add_values和set_values的使用说明,简单来说,就是用来给对应规则传递扩展参数设置的。

wdm驱动程序

wdm的项目描述也跟umdf类似,只需要把wdk.env.umdf换成wdk.env.wdm的环境规则就行了。

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")

上述代码,还添加了一些.man文件用来预处理一些manifest,具体相关的任务藐视,可以参考官方文档说明:ctrpp-task。 里面也有相关的一些特殊配置选项,目前xmake支持的配置有:

add_values("wdk.man.flags", "-prefix Kcs")
add_values("wdk.man.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")

下面再贴个wdm驱动的例子,这个例子中,除了之前讲的tracewpp,我们还加了.mof的文件处理,对于.mof文件,xmake会自动应用内置的wdk.mof规则,详细说明见:mofcomp-task

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"}})

对于.mof的配置选项,有些配置并不是全局应用于target的,对每个文件需要单独配置,这个时候,就不能直接使用set_valuesadd_values了,需要在add_files中设置相关values。

add_files("msdsm.mof", {values = {wdk_mof_header = "msdsmwmi.h"}})
add_files("msdsm.mof", {values = {["wdk.mof.header"] = "msdsmwmi.h"}})

上面两种设置方式都是有效的,由于受限于lua的语法,为了考虑可读性,xmake通过_下划线来简化key的设置,这个设置相当于单独对msdsm.mof文件设置了set_values("wdk.mof.header", "msdsmwmi.h")

生成驱动包

如果平常开发调试通过后,我们也可以通过以下命令生成.cab驱动包来发布驱动程序:

$ 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", ...)设置签名模式来启用。 只要启用了签名,那么平常的驱动构建、包括打包生成的.cab文件,都会自动对其进行签名。

测试签名

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

target("msdsm")add_rules("wdk.driver", "wdk.env.wdm")set_values("wdk.sign.mode", "test")add_files("src/*.c")

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

当然也可以使用本机已有的有效证书去签名,例如直接从sha1来选择合适的证书进行签名:

target("msdsm")add_rules("wdk.driver", "wdk.env.wdm")set_values("wdk.sign.mode", "test")set_values("wdk.sign.thumbprint", "032122545DCAA6167B1ADBE5F7FDF07AE2234AAA")add_files("src/*.c")

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

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)")add_files("src/*.c")

正式签名

对于正式签名,我们可以通过指定对应的正式签名证书文件进行签名:

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来切换系统版本:

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")

如果觉得每次修改xmake.lua去切换编译非常繁琐,我们也可以手动指定编译的目标程序支持的windows版本,来快速切换到对应的版本进行编译:

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

目前支持的一些版本有:nt4, win2k, winxp, ws03, win6, vista, ws08, longhorn, win7, win8, win81, winblue, win10

然后通过_下划线,组合指定子版本:sp1, sp2, sp3, th2, rs1, rs2, rs3

xmake还提供了一些内置的版本值,在切换winver版本是,会自动改变,用于一些更加定制化的配置需求,例如:

target("test")on_load(function (target)local winnt_version = target:values("wdk.env.winnt_version")if winnt_version > "0x0A000000" thentarget:add("defines", "TEST")endend)

上述代码通过判断WIN32_WINNT的版本值,来定制添加一些相关配置,这个版本值会根据wdk.env.winver的配置自动适配更新,目前提供的这些内置版本值还有:

target:values("wdk.env.winnt_version"): WIN32_WINNT
target:values("wdk.env.ntddi_version"): NTDDI_VERSION
target:values("wdk.env.winver_version"): WINVER

关于更多xmake下WDK开发相关介绍,请参考文档:WDK驱动程序开发

转载于:https://my.oschina.net/tboox/blog/1830912

xmake新增对WDK驱动编译环境支持相关推荐

  1. xmake 新增对 Qt 编译环境支持,用自己最喜爱的编辑器去开发 Qt 程序

    最近给xmake新增了对 Qt SDK 环境的支持,现在我们完全可以脱离 Qt Creator 进行 Qt 应用程序的开发,甚至配合 vscode/idea/sublime/vim 等编辑器+xmak ...

  2. 九七的Windows内核驱动开发 WIN10-2004+VS2019+WDK驱动开发环境安装及配置

    WIN10-2004+VS2019+WDK驱动开发环境安装及配置 一.定义介绍   本节介绍如何在Windows10系统(2004版本,操作步骤中有如何查看版本)中安装VS2019及WDK开发包,并进 ...

  3. Neuron Newsletter 2022-07|新增非 A11 驱动、即将支持 OPC DA

    七月,我们发布了 Neuron 2.1.1.2.1.2 两个版本,主要修复了 2.1.0 版本中存在的问题. 此外,我们还引入了 SQLite 以存储 Neuron 的配置信息,新增了南向驱动非 A1 ...

  4. RTl8188EUS无线网卡驱动编译,支持master模式

    基于rtl8188eus无线网卡驱动,提供两个版本,分别是支持linux3.10以下版本及支持linux3.10以上版本,此驱动可使用hostapd软件实现AP共享,具体使用步骤如下: 基于RTL81 ...

  5. window wdk visual studio 2019 驱动编译

    安装失败确认是否是下载的142的,vs2022 143的不 支持我搞了好久都没搞定,下载完成后,如果已经安装了wdk,那么需要装可扩展则可以搜索wdk.visx 直接打开就行. 实际上就是个visx ...

  6. windows驱动开发环境搭建以及helloworld

    文章目录 前言 编译环境-WDK的安装 搭建测试驱动的虚拟机 win11虚拟机 win10虚拟机 在测试机器上运行驱动 修改注册表-显示调试信息 上面驱动代码含义 测试证书签名 其他 旧版本的visu ...

  7. VC6.0 +WDK 开发驱动的环境配置

    在安装完VC6和WDK以后,就开始进行环境的配置了,可结果是弄了半个上午,还是搞不定.去网上找信息,关于WDK的,多是使用VS2005或VS2008的,有的要借助于DriverStudio之类的,按上 ...

  8. VS2008 PRO 、WDK 和DDKWizard搭建Vista驱动开发环境

    VS2008 PRO .WDK 和DDKWizard搭建Vista驱动开发环境 标题:VS2008 PRO .WDK 和DDKWizard搭建Vista驱动开发环境       作者:eping Em ...

  9. 全面支持三大主流环境 |百度PaddlePaddle新增Windows环境支持

    2019独角兽企业重金招聘Python工程师标准>>> PaddlePaddle作为国内首个深度学习框架,最近发布了更加强大的Fluid1.2版本, 增加了对windows环境的支持 ...

最新文章

  1. 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )
  2. Python自动化开发 - RESTful API
  3. 《R语言实战》第1章
  4. HTTP 中的 304
  5. VB.NET判断一个路径的文件是否存在
  6. 7.1 pdo 宝塔面板php_宝塔面板PHP7.2 安装mcrypt扩展
  7. dev 域名与 Chrome
  8. python实用例子_Python实用案例 - 随笔分类 - 一入测试深似海 - 博客园
  9. vb mysql 5.1 adodb_VB 中 ADO、 ADODB、 ADODC 的区别与联系(皮毛)
  10. iphone导出视频 无法连接到设备_MOV视频格式转MP4,解决iphone(苹果)手机拍摄视频无法导入Pr...
  11. linux磁盘写保护怎么修改_linux 文件、目录写保护
  12. php 关于php时区时间错误问题 date 当前时间 时差(转载)
  13. nginx实现静态文件的token认证
  14. 12345政府热线报告
  15. 【最全】Spring Boot 实现分布式锁——这才是实现分布式锁的正确姿势!
  16. 并行计算范式-SIMD vs SIMT vs SMT: What’s the Difference Between Parallel Processing Models?
  17. 电商平台-订单抽成模块的设计与架构
  18. python正则表达式提取数字
  19. 太空射击第17课: Game Over (結束)
  20. 解决【bug】网页版豆瓣很多帖子点开直接跳转网站首页

热门文章

  1. UIButton 未响应原因分析
  2. Excel和数据库的导入与导出
  3. 如何对.NET远程处理框架相关知识简介
  4. js脚本屏蔽页面点击
  5. (转)JS之——解决IE6、7、8使用JSON.stringify报JSON未定义错误的问题
  6. 16 级高代 II 思考题十的多种证明
  7. 阿里巴巴 Java 开发手册之编程规约(一)-------我的经验
  8. 电商抢购秒杀系统的设计_1_应用场景分析
  9. 常用巡检语句(oracle)
  10. [图解教程]Axis2与Eclipse整合开发Web Service之二:WSDL逆向生成服务端