本篇承接上一篇 Windows HLK 驱动认证(一):环境准备。默认你已经:

  • Controller(WS2025 虚拟机)装好 HLK Controller + Studio;
  • 测试机纯净系统、关安全启动、开测试模式、装好 HLK Client 和待测驱动;
  • 三者同处一个子网、互通。

下面所有操作都在 Controller 的 HLK Studio 里进行(除特别说明外)。

在动手之前,先看清楚 Studio 里这些名词彼此是什么关系——后面每一步其实都是在填这张图里的某一层:

HLK Studio 中机器池、项目、目标、测试项、结果与提交包的从属关系HLK Controller · 统一数据库(机器池、项目、测试结果都存放在这里)Configuration 页 · 机器资源Machine Pool(自建机器池)在 $(Root) 下新建,Default Pool 不能跑测试Machine · 测试机状态须为 Ready 才能被调度▸ 装好 Client 后自动落入 Default Pool▸ 拖入自建池并设为 Ready 才能跑测试▸ 同一时间只能属于一个池1 个池 ← N 台测试机Project 页 · 测试内容Project(一次认证提交)Target(勾选的驱动 / 特性)Selection 页在 device manager 视图勾选Test(Playlist 筛出的测试项)Tests 页 Run Selected 运行ResultPass / Fail /Filtered(errata 过滤后通过)Selection 页选池 → 选设备Package 页 → .hlkx测试结果 + driver 文件夹,签名后提交
机器池 / 项目 / 目标 / 测试项 / 结果 / 提交包的从属关系

左右两半是分开的:机器池管"用哪台机器测",项目管"测什么内容",两者在 Selection 页汇合——你在某个池里挑一台机器,从它上面枚举出的设备中勾选出 Target。

一、新建机器池(Machine Pool)

机器池是测试机的逻辑分组。测试机装好 Client 后会自动落入 Default Pool,但不能直接在 Default Pool 里跑测试——必须先移动到一个自建的池并设为 Ready。

  1. 打开 HLK Studio,进入 Configuration(配置) 页。
  2. 右键根节点 $(Root)Create Machine Pool,改成有意义的名字后回车。
  3. Default Pool,在右侧应能看到之前配置好的测试机。等它的状态变为 notready 后,把它拖动到刚新建的池中。
  4. 在新池中右键该测试机 → Change Machine StatusReady。状态列变为 Ready

右键根节点 $(Root) → Create Machine Pool 新建机器池

右键测试机 → Change Machine Status → Ready,状态列变为 Ready

要点

  • 一台机器同一时间只能属于一个池。
  • 状态为 NotReady 时无法调度测试;且在 Default Pool 里无法设为 Ready,必须先移到自建池。
  • 测试机刚装完 Client 时可能要等几分钟才出现在 Default Pool;如果一直不出现,回头检查 TCP 1771、SMB 共享访问和工作组账户配置(见第一篇)。
  • 测试跑起来后机器会在 Running 等状态之间切换,中途手工把它改回 Ready 会打断正在跑的任务。

二、创建项目(Project)

一个 Project 定义“你要测什么”,通常对应一个要提交认证的设备/驱动。

  1. 进入 Project 页 → Create project,替换默认名为有意义的项目名后回车。
  2. 双击选中刚新建的 project 将其加载。

在 Project 页点 Create project 并为项目命名

三、选择测试目标(Selection)

  1. 进入 Selection 页。
  2. 左上角 machine pool 下拉列表中选中刚新建的池。
  3. 左侧视图选择 device manager(这是最细粒度的视图,能看到系统里的各个组件驱动)。
  4. 在中间列出的 driver 列表中,勾选需要测试的 driver(目标 / target)。

在 Selection 页左上角的机器池下拉列表中选择自建的池

切换到 device manager 视图,勾选要测试的驱动(此处为 Integrated Camera)

一个设备可能包含多个 target。要拿认证,需选中该设备产品类型下的全部相关特性。若在 device manager 里找不到你的软件驱动,可用搜索框,或改用 software device 视图。

四、加载 Playlist 并运行测试(Tests)

Playlist 是官方规定的“该测哪些项”的测试集合。加载后,界面只保留适用于当前目标的测试项。

  1. 进入 Tests 页。
  2. Load Playlist,选择需要测试的 OS 版本和架构的官方 playlist(一般选 x64 / arm64)。
  3. 加载完成后,总测试列表会缩减为适用项。
  4. 全选所有测试项,点 Run Selected 开始运行。

点 Load Playlist,选择对应 OS 版本和架构的官方 playlist

playlist 加载后测试列表缩减,全选测试项并点 Run Selected 运行

Playlist 本身是一个 XML 文件。HLK 安装后本机自带一份,但微软会持续更新兼容性 playlist,正式提交前应到微软 HLK 页面下载与你套件版本对应的最新 playlist,再用 Load Playlist 指向它。

重要

  • Playlist 版本必须与 HLK 套件版本一致(例如 1607 的 kit 就要用 1607 的 playlist),且不要修改官方 playlist,否则结果无法用于提交。
  • 首次测试:如果测试机是第一次跑测试,它会重启两次,并进入 OOBE(开箱设置)页——此时需要手动点击跳过
  • 手动测试项(Manual)会中断流程等待人工操作,建议与自动测试分开跑。测试列表里带重启标记的测试项会让机器反复重启,属正常现象,不要在这期间动那台机器。
  • 做好时间预期:一个设备的完整 playlist 通常要跑几十小时到几天。建议先小批量跑几个测试确认环境通了,再整批放开跑,免得跑一整夜发现是环境问题。

五、Static Tools Logo Test(含 .sys 的内核驱动必做)

如果被测 driver 中包含 .sys 文件(内核模式驱动),就必须完成 Static Tools Logo Test。这项测试用 CodeQL 对驱动源码做静态分析,是内核驱动认证的强制项(自 WS2025 起 CodeQL 为必需工具)。

它并不直接分析源码,而是读取一份 DVL(Driver Verification Log,驱动验证日志)文件来确认你已跑过 CodeQL。注意这条链路的前半段完全发生在开发机上,跟 HLK 环境无关:

从驱动源码运行 CodeQL 生成 DVL,再由测试机的 Static Tools Logo Test 读取① 开发机 · Visual Studio + WDK(不在 HLK 环境里做)驱动源码含 .sys 的内核模式驱动运行 CodeQL 分析官方 must-fix 查询套件产出 .sarif放在 .vcxproj 同一目录生成 DVLVS 菜单 Driver → DVL 向导<驱动名>.DVL.XML② 测试机 + HLK Studio复制到测试机 C:\DVL\复制前务必先清空该目录运行 Static Tools Logo Test读取 DVL,确认 CodeQL 已运行测试通过不要求全部规则 pass,但须过 Must-Fix
CodeQL → .sarif → DVL → 测试机 C:\DVL → Static Tools Logo Test

生成并放置 DVL 的步骤:

  1. 驱动源码上运行 CodeQL(视认证目标可能还需 SDV / Code Analysis)。需使用微软指定的官方查询套件,认证只强制要求 Must-Fix 那一组规则;具体用法见官方Run CodeQL Analysis for Windows Driver Certification

  2. 把 CodeQL 产出的 .sarif 文件放在对应 .vcxproj 的同一目录下(文件名不限,只要以 .sarif 结尾)。

  3. 运行 DVL 生成工具,得到 .DVL.XML 文件。在 Visual Studio 里是菜单 Driver → Launch Driver Verification Log Creation Wizard(需装 WDK);也可用命令行的 dvl.exe

  4. 把该 DVL 文件复制到测试机%systemdrive%\DVL 目录(即 C:\DVL\)。例如:

    C:\DVL\LnvMSRIO.DVL.XML
    

    复制前务必先清空 C:\DVL 目录,删掉里面旧的验证日志,再放入新的,否则会读到过期结果。

  5. 回到 HLK Studio 运行 Static Tools Logo Test

注意

  • 该要求覆盖除图形驱动外的所有内核模式驱动;对 Windows Server 2025 认证,CodeQL 已是 Static Tools Logo Test 的必需工具。
  • 运行此测试时,被测驱动必须是测试签名的,否则测试可能不出现(不 populate)或不告警。若你的包里不含 .sys,则该测试不出现属正常。
  • 该测试只要求 DVL 证明 CodeQL 已运行,并不要求所有规则都 pass(但官方要求至少通过全部 “Must-Fix” 规则)。
  • DVL 必须与被测的这一版驱动对应:源码改了、重新编译了,就要重跑 CodeQL、重新生成 DVL 再替换,否则测试会因为版本对不上而失败。
  • 此测试需在 Server with Desktop 上跑;在 Server Core 上会报 RoMetadata.dll could not be found——解决办法是在带桌面的 Server 上跑,再用 merge 合并到 Core 的包里。

六、查看结果(Results)

  1. 进入 Results 页。
  2. 若有 fail,展开该失败项即可查看详细信息和日志(右键目标机名 → Diagnostic logs 可看诊断日志)。
  3. 若测试项全部 pass,即可进入打包环节。

在 Results 页展开某个测试,可查看其子任务与日志详情

若因系统崩溃导致失败,失败项会带一个崩溃图标,右键可查看 Bugcheck 信息。

Fail 了先别急着改代码:Filters(Errata)

HLK 里有相当一部分失败不是你的驱动的问题,而是测试项本身的已知缺陷。微软为这类问题发布 Filters(也叫 Errata)——一组随 HLKFilterUpdates.cab 分发的规则,能把符合条件的 Fail 自动改判为 Pass,且这种"过滤后通过"的结果是可以用于提交的。

用法:

  1. 到微软 HLK 页面下载最新的 HLKFilterUpdates.cab,在 Controller 上安装。
  2. 关闭所有 HLK Studio 实例,运行 UpdateFilters.exe 完成更新。
  3. 新装的 filters 会自动应用到之后产生的新结果;对更新之前就已经跑完的旧结果,需要打开对应项目,到 Results 页点 Apply Filters 手动重新应用一次。

遇到失败项的处理顺序建议是:更新并应用 filters → 看日志判断是不是环境问题(重跑一次往往就过了)→ 确认是真问题再回去改驱动。同一个测试允许重跑,提交时以最终结果为准。

关于失败排查,官方的 Troubleshooting Windows HLK Test Failures 值得收藏。

七、生成提交包(Package)

  1. 进入 Package 页,点 Add Driver Folder,选中你的 driver 文件夹。

  2. 弹出 Driver Properties 对话框,全选适用的 **OS(Products)和语言(Locales)**信息,确定。

    Add Driver Folder 后,在 Driver Properties 中全选 Products 和 Locales

  3. Create Package,根据需要选择签名方式:

    • Do not sign——生成未签名包(例如给支持团队调试、或稍后与其他包合并)。
    • Use the certificate store——用本机证书库里的代码签名证书签名(最常见)。
    • Use a certificate file——用证书文件(.cer)签名。

    正式提交微软的包必须签名,且需使用 EV 代码签名证书

  4. 打包末尾可能会要求补充源码 / Readme 等附加文件,按提示提供即可。

  5. 生成 .hlkx 文件——它是“测试结果 + driver”的打包文件。

  6. .hlkx 提交微软(Hardware Dev Center 硬件开发者中心)进行签名/认证。

八、跨 OS 版本提交:合并包(Merge Package)

如果同一个驱动要认证多个 OS 版本 / 架构,做法是对每个版本分别测试、各生成一个 .hlkx,最后合并成一个提交包:

  1. 在新测试完成后的 Package 页,点 Merge Package
  2. Add,选择既往测试生成的 .hlkx 包(支持一次选多个)。
  3. 确定后点 Create Package,即可把多个包合并为一个提交包。
多环境测试结果合并、签名、提交微软,以及认证后走 DUA 更新的完整链路跨 OS 版本 / 架构:各自独立测试,再合并成一个提交包环境 A · WS2025 x64测试完成 → A.hlkx环境 B · Win11 24H2 x64测试完成 → B.hlkxMerge Package合并为单个提交包Create PackageEV 代码签名证书签名Partner Center上传 .hlkx 审核签名认证完成后若只需改 INF 等非 PE 文件 ↓提交 Finalize驱动已获认证Download DUA shell在原提交详情页下载Replace Driver复用原测试结果,不重测签名 → Upload new产出面向 OEM 的客制化包下半条链路即《Driver DUA 操作指南》所讲的流程
从多环境测试到合并、签名、提交,以及认证之后的 DUA 更新

别把两种"合并"搞混了

  • 跨 OS 版本 / 架构合并:把针对不同 Windows 版本、不同架构分别测出的包并进同一个提交包——这正是上面这套做法,是允许的,也是标准做法。测试甚至可以分散在不同项目、不同机器池、不同 Controller 上完成。
  • 深度合并(deep merge):把同一个 target family 的测试拆到几个项目/环境里跑,再合并成一份完整结果。只有这种合并才有那串严格限制——目标必须同 OS、同架构同类型(System 或 Device),软件过滤器类型不支持深度合并,且各目标下的特性集合、测试集合(设备类型还包括驱动集合与硬件 ID 集合)都必须完全一致。

两个实用提醒

  • 打算把测试拆到多个项目里跑之前,先给原始项目生成一个包(哪怕里面一条结果都没有)。这个包保存了"该测哪些项"的完整清单,后面合并进来可以保证没有测试项被漏掉。
  • HLK 包也能与老的 HCK 包合并,但顺序有要求:必须先打开 HLK 包,再把 HCK 包合并进去

小结

到这里,一次完整的 HLK 测试就走完了:

建机器池并设 Ready → 建项目 → Selection 选目标 → 加载 playlist 跑测试 →(含 .sys 则做 Static Tools Logo Test)→ Results 全 pass(或经 filters 判定通过)→ 打包签名生成 .hlkx → 提交微软 →(跨版本则 merge)。

第一次跑难免磕碰,遇到失败先更新并应用 filters,再看 Results 里的日志和 Bugcheck 信息,大多能定位到具体原因。祝测试顺利。

驱动通过认证之后,如果只是要为不同 OEM 改一改 INF 等非 PE 文件,不必重跑这一整套流程——用 DUA 就能在原认证结果上直接换驱动重新提交,见 Driver DUA 操作指南