本篇承接上一篇 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 Status → Ready。状态列变为 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 操作指南。