1. 主页 > vs安装问题 > VS2012安装问题 >

VS2012驱动项目时间戳验证失败

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

前几天的一个早晨,大概5点钟就醒了,再也睡不着。想到有一个驱动程序还需要debug,就爬起来继续coding。起来打开电脑,运行VS2012并打开项目。把代码逻辑仔细的看过一遍,想了想,有了一点小发现,改了几行代码。按下F7开始编译。

很惊讶,发现了一个错误。通过VS2012 IDE环境创建的驱动项目(solution)中总是包含两个工程:一个是驱动工程,用来编译并生成驱动文件(一般是.sys文件);一个是package工程,用来把编程成功的驱动文件整合到一个可安装驱动包中。我看了一下错误,第一个工程已编译成功,是package工程失败了。这种情况还是第一次遇到,什么原因呢?

1>------ 已启动生成: 项目: Test Package, 配置: Win7 Debug x64 ------
1>  .......................
1>  Signability test failed.
1>  
1>  Errors:
1>  22.9.7: DriverVer set to incorrect date (postdated DriverVer not allowed) in \Test.inf.  The current date (UTC) is 1/7/2014.
1>  
1>  Warnings:
1>  None
1>x64\Win7Debug\inf2catOutput.log : Inf2Cat error -2: "Inf2Cat, signability test failed." Double click to see the tool output.
========== 生成: 成功 0 个,失败 1 个,最新 1 个,跳过 0 个 ==========

Package工程

Package工程在生成驱动安装包(Driver Package)的时候,会调用三个工具为驱动包数字签名:Stampinf.exe/ testsign.exe /inf2cat.exe。下面一一介绍。

时间戳工具

Stampinf.exe用来为inf文件生成时间戳。这个时间戳对应于inf文件中的[DriverVer]值。下面是一个典型的inf文件示例:

[version]
DriverVer=01/10/2014,1.0.0.0 ; time stamp(时间戳),版本号

StampInf的主要工作就是更新[DriverVer]的值:时间戳、版本号。StampInf.exe工具可以在WDK安装包中找到,一般路径是:C:\Program Files (x86)\Windows Kits\8.0\bin\x86\staminf.exe。我们可以在控制台环境中运行此工具,以观察它的使用方法。下面的内容有所删减和整理:

C:\Users\mozhang>stampinf.exe
        USAGE:
        stampinf -f filename [-s section] [-d <xx/yy/zzzz> | *]
                 -a architecture -n [-c catalogfile]
                             [-v  | *]
                             [-k nnnnn] [-u nnnnn]
                             [-i path]

-f:指定inf文件的路径

-a:指定硬件平台,可使用x86和AMD64这两个值。如果你指定的inf文件中含有关键字$ARCH$,stampinf会在处理过程中,把这些宏都替换成指定的值,最终的硬件平台会变成:NTx86或NTAMD64。如果inf文件中包含了关键字$ARCH$,但没有指定-a参数,stampinf会去掉这个关键字,最终的硬件平台变成:NT。

-d:指定以什么时间设置时间戳,可以指定一个时间,如果指定的值为”*”,Stampinf就以当前时间来设置它。这个选项可选,默认使用当前时间。

-v:指定以什么方式设置版本信息。可以指定一个版本号,如:1.0.0.0。也可以根据当前的时.分.秒.毫秒来设置。如果指定的值为”*”,表示使用后者来设置版本号。这个选项可选,默认使用第二种方式。

-k/-u:这两个值用来指定KMDF和UMDF的版本,可用指定的值替换inf文件中KMDF的关键字$KMDFVERSION$$KMDFCOINSTALLERVERSION$,以及UMDF的关键字$UMDFVERSION$$UMDFCOINSTALLERVERSION$

下面是一个例子,我在控制台中执行命令为cy001.inf文件打时间戳:

C:\Users\mozhang>"stampinf.exe" -f "c:\cy001.inf" -d "*" -v "1.0.0.0"
Stamping c:\cy001.inf [Version] section with DriverVer=01/10/2014,1.0.0.0

打开cy001.inf文件查看:

DriverVer=01/10/2014,1.0.0.0

如果把-v的参数换成”*”:

C:\Users\mozhang>"stampinf.exe" -f "c:\cy001.inf" -d "*" -v "*"
Stamping c:\cy001.inf [Version] section with DriverVer=01/10/2014,11.24.18.11

打开cy001.inf文件查看:

DriverVer=01/10/2014,11.24.18.11

打开Package的属性页,查看stampinf相关的属性,可以看到它使用的默认参数是:

-k “1.11” -d ”*” –a “amd64” –u “1.11.0” –v “*”

它使用当前时间,并用时.分.秒.毫秒的格式设置版本号。这些设置是可以修改的。
stampinf

TestSign

我曾经在介绍64位驱动签名工具64Signer的时候介绍过TestSign的工作原理,它使用指定的数字证书,给指定的镜像文件进行数字签名。请参考64Signer说明文档。

Inf2Cat

此工具用来生成cat文件。VS2012先把驱动安装有关的所以文件都拷贝到一个目录中,然后调用inf2cat.exe来生成cat文件。这些必须被拷贝的文件包括:.inf文件,.sys文件,其它文件包括WDF框架的co-installer文件等。Inf文件所在的位置代表了driver package的位置。

为了试验,我把test.inf、test.sys、WdfCoInstaller01011.dll这三个文件手动拷贝到E:\Test目录下面,然后调用inf2cat命令:

C:\Users\mozhang>Inf2Cat.exe driver:"E:\test" /os:"7_x86"
.......................
Signability test complete.

Errors:
None

Warnings:
None

Catalog generation complete.
E:\test\test.cat

参数中,/Driver:path指定了driver package的目录,也就是保存inf文件的目录;/OS:指定了目标系统。最后生成了test.cat文件。

package

可以把Inf2Cat的工作分成三个部分:分析inf文件,收集信息;验证驱动包,包括验证时间戳,和验证文件完整;生成cat文件

验证时间戳就是把inf文件的DriverVer值和当前的时间进行比较,看是否匹配。我在文章开始遇到的错误,正是时间戳验证失败导致的,后面再讲。验证文件完整就是确保inf文件所有涉及到的文件都能在Driver Package目录中找到。比如用WDF框架编写的驱动,应在inf文件中指定co-installer文件。我的Test驱动使用KMDF 1.11,所以要用到对应的co-installer文件WdfCoInstaller01011.dll。

时间戳验证

回到开头的错误,再把重要的错误信息列举如下:

DriverVer set to incorrect date (postdated DriverVer not allowed) in \test.inf.  The current date (UTC) is 1/7/2014.
Inf2Cat error -2: "Inf2Cat, signability test failed."

是inf2cat工具在执行的时候发生了错误,错误原因看上去是时间戳验证失败了。第一行告诉我,从DriverVer中拿到的时间不对,当前的UTC时间是1/7/2014。我特地看了一下电脑的当前时间并截了一幅图。我的当前时间是北京时间1月8号上午7点,和inf文件中DriverVer的值相同:

UTC

北京时间要比UTC标准时间早8个小时,所以北京时间的8号凌晨7点钟,是UTC时间的7号晚上11点。Inf2Cat如果使用UTC时间的话,就正好和Inf文件中的Local时间差一天。这正是导致时间戳验证失败的原因。

另外,inf2cat只验证日期,而不验证时分秒,这使得只有在凌晨1-8点编译驱动时,我才有机会“碰巧”遇到这个错误。

解决问题

解决问题的方法非常简单,只要让Inf2Cat工具进行时间戳验证的时候,使用local时间而不是UTC时间就可以了。打开package工程的属性,在inf2cat工具的属性中进行设置。

inf2cat

本文由VS软件圈(vssoft.net)发布,不代表VS软件圈立场,转载联系作者并注明出处:https://vssoft.net/vsazwt/VS2012anzhuangwenti/2020/0727/5782.html

联系我们

在线咨询:点击这里给我发消息

微信号:PREEE8

工作日:9:30-18:30,节假日休息