Inf2Cat, signability test failed


VS2013 wdk8.1 新建驅動項目,生成時報如下錯誤

錯誤    1    error -2: "Inf2Cat, signability test failed." Double click to see the tool output.    E:\HelloWDM\HelloWDM Package\Win7Debug\inf2catOutput.log    1    1    HelloWDM Package

解決方案沒有找到,但是可以生成驅動,有誰知道原因?

 

VS2012趣事:時區和時間戳

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

前幾天某個早晨,大概5點鍾我就醒在床上,怎么也睡不着。想到手頭還有一個驅動需要debug,就立刻發現了人生目標一樣地爬了起來。匆匆洗漱完畢后,打開電腦,打開VS2012驅動項目。先把代碼邏輯仔細的看過一遍,有了一點小發現,改了幾行代碼。按下F7開始編譯。

編譯結束后,很驚訝地發現“輸出”試圖中報了一個錯誤,是driver package工程報錯。這里要說一下 相關的背景,通過VS2012的工程向導創建的驅動項目(solution)總是包含兩個工程(project):一個是驅動工程,所有的源代碼都在此, 編譯后生成驅動文件(一般是.sys文件);一個是driver package工程,無源碼,它的編譯過程乃針對inf文件和sys文件進行處理,產生一個可安裝的驅動包(driver 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工程在生成可安裝驅動安裝包的過程中,會調用三個工具,為相關的文件進行數字簽名:Stampinf.exe/ testsign.exe /inf2cat.exe。下面對這三個工具作一一介紹。

時間戳工具(Stampinf)

Stampinf.exe用來為inf文件生成時間戳和版本號。這個時間戳對應於inf文件中的DriverVer值,下面是一個示例:

[version]
DriverVer=01/10/2014,1.0.0.0 ; time stamp(時間戳)+ version(版本號)

StampInf.exe工具可以在WDK安裝包中找到,針對不同的硬件平台有不同的版本,x86版本的相對路徑是: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:指定硬件平台,可使用x86AMD64二者之一。如果你指定的inf文件中含有關鍵字$ARCH$,stampinf會自動把它們都替換成指定的x86AMD64值。這種情況下,inf文件中的“NT$ARCH$最終會變成”NTx86“或”NTAMD64“。如果inf文件中包含了關鍵字$ARCH$,但沒有指定-a參數,stampinf會自動刪除所有的關鍵字。這種情況下,inf文件中的“NT$ARCH$最終會變成”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

關於簽名工具TestSign.exe,我曾在介紹64Signer的時候有過介紹。它使用指定的數字證書,給指定的鏡像文件進行數字簽名。參考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框架編寫的驅動,Driver Package中必須有WDF的co-installer文件。

時間戳驗證

回到開頭的錯誤,再把重要的錯誤信息列舉如下:

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是只驗證日期而不驗證時分秒的,這才使得我只有在凌晨8點以前編譯驅動,才有機會“碰巧”遇到這個錯誤)。

解決問題

解決問題的方法非常簡單,只要讓Inf2Cat驗證的時候使用local時間就可以了。打開package工程的屬性,在inf2cat工具的屬性中進行設置。

inf2cat


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM