使用 SetupAPI 验证驱动程序验证码签名

可以使用以下过程来验证驱动程序包是否具有有效的 Authenticode 数字签名。 从 Microsoft Windows Server 2003 开始支持这些过程。

确定驱动程序是否具有有效的验证码签名

检查DNF_AUTHENTICODE_SIGNED标志。

如果驱动程序包具有有效的验证码签名,则 Windows 在驱动程序节点的SP_DRVINSTALL_PARAMS结构的 Flags 成员中设置此 标志 。 (另请注意,如果驱动程序具有 WHQL 发布签名、系统提供的驱动程序或具有 Authenticode 签名,则 Windows 会设置DNF_INF_IS_SIGNED标志。)

验证 INF 文件是否具有有效的验证码签名

  1. 调用 SetupVerifyInfFile

  2. 检查函数返回的错误代码。

    如果 INF 文件不是系统提供的,并且没有有效的 WHQL 数字签名,但它确实具有有效的验证码签名,则 SetupVerifyInfFile 返回 FALSE,GetLastError 返回以下错误代码之一:

    ERROR_AUTHENTICODE_TRUSTED_PUBLISHER
    指示发布者受信任,因为发布者的证书安装在 受信任的发布者证书存储中。

    ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED
    指示无法自动建立信任,因为发布者的签名证书未安装在受信任的发布者证书存储中。 但是,这不一定表示存在错误。 相反,它指示调用方必须应用特定于调用方的策略才能在发布者中建立信任。

如果 INF 文件具有有效的验证码签名, 则 SetupVerifyInfFile 还会在SP_INF_SIGNER_INFO输出结构中返回以下信息:

  • DigitalSigner 成员设置为签名者的名称。

  • CatalogFile 成员设置为相应已签名目录文件的完整路径。

但请注意, SetupVerifyInfFile 不会返回 DigitalSignerVersion 成员中的版本。

验证文件是否具有有效的验证码签名

使用 SPQ_SCAN_USE_CALLBACK_SIGNERINFO 标志调用 SetupAPI 函数 SetupScanFileQueue

SetupScanFileQueue 将SPFILENOTIFY_QUEUESCAN_SIGNERINFO请求发送到调用方回调例程,并将指针传递给FILEPATHS_SIGNERINFO结构。 如果使用有效的 Authenticode 签名对文件进行签名,则函数在为文件调用回调例程之前,将错误代码设置为相应的ERROR_AUTHENTICODE_Xxx值。 函数还在 FILEPATHS_SIGNERINFO 结构中设置以下信息:

  • DigitalSigner 成员设置为签名者的名称。

  • CatalogFile 成员设置为相应已签名目录文件的完整路径。

但请注意,版本未在 Version 成员中设置。

SetupScanFileQueue 设置ERROR_AUTHENTICODE_Xxx错误代码的方式与本主题前面所述的 SetupVerifyInfFile 相同。