引用註明>> 【做者:張佩】【原文:www.yiiyee.cn/blog】post
前幾天某個早晨,大概5點鐘我就醒在牀上,怎麼也睡不着。想到手頭還有一個驅動須要debug,就馬上發現了人生目標同樣地爬了起來。匆匆洗漱完畢後,打開電腦,打開VS2012驅動項目。先把代碼邏輯仔細的看過一遍,有了一點小發現,改了幾行代碼。按下F7開始編譯。spa
編譯結束後,很驚訝地發現「輸出」試圖中報了一個錯誤,是driver package工程報錯。這裏要說一下 相關的背景,經過VS2012的工程嚮導建立的驅動項目(solution)老是包含兩個工程(project):一個是驅動工程,全部的源代碼都在此, 編譯後生成驅動文件(通常是.sys文件);一個是driver package工程,無源碼,它的編譯過程乃針對inf文件和sys文件進行處理,產生一個可安裝的驅動包(driver package)。debug
頭一次遇到package工程失敗的狀況,會是什麼緣由呢?3d
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。下面對這三個工具做一一介紹。blog
時間戳工具(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。咱們能夠在控制檯環境中運行此工具,以觀察它的使用方法。get
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會自動把它們都替換成指定的x86或AMD64值。這種狀況下,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 「*」
它使用當前時間設置時間戳,用時.分.秒.毫秒的格式設置版本號。
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文件。
能夠把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標準時間提早8個小時,因此北京時間的8號凌晨7點鐘,對應UTC時間的7號晚上11點。因此Inf2Cat使用的UTC時間正好和Inf文件中的Local時間差一天。這正是時間戳驗證失敗的緣由所在(能夠推測,inf2cat是只驗證日期而不驗證時分秒的,這才使得我只有在凌晨8點之前編譯驅動,纔有機會「碰巧」遇到這個錯誤)。
解決問題
解決問題的方法很是簡單,只要讓Inf2Cat驗證的時候使用local時間就能夠了。打開package工程的屬性,在inf2cat工具的屬性中進行設置。