---
url: /zh/examples/cpp/wdk.md
---
默认会自动探测 WDK 所在环境，当然也可以指定 WDK sdk 环境目录：

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

更多详情可以参考：[#159](https://github.com/xmake-io/xmake/issues/159)

相关完整工程 example 见：[WDK examples](https://github.com/xmake-io/xmake/tree/master/tests/projects/windows/driver)

## umdf 驱动程序{#umdf}

## kmdf 驱动程序 {#kmdf}

## wdm 驱动程序 {#wdm}

## 生成驱动包 {#package}

可以通过以下命令生成.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
```

## 驱动签名 {#driver-sign}

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

### 测试签名 {#test-sign}

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

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

不过这种情况下，需要用户手动在管理员模式下，执行一遍：`$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")
    set_values("wdk.sign.digest_algorithm", "sha256")
```

从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)")
    set_values("wdk.sign.digest_algorithm", "sha256")
```

### 正式签名 {#sign}

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

```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"))
    set_values("wdk.sign.digest_algorithm", "sha256")
```

## 生成低版本驱动 {#low-version-driver}

如果想在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
```
