1、.INF文件是什么
.INF是 Device Information File 的縮寫,是微軟公司為供硬件設(shè)備制造商發(fā)布其設(shè)備驅(qū)動程序而發(fā)展的——許多硬件設(shè)備的驅(qū)動程序都是使用 .INF文件來安裝的。.INF文件從 Windows3.X 時代就開始大量被使用了。
.INF 文件是一種具有特定格式的純文本文件,我們可說它是一種安裝腳本(SetupScript)。雖然 .INF 只是純文本文件,但是當(dāng)我們在文件管理器explorer對 .INF文件按鼠標(biāo)右鍵後,在右鍵菜單上就會出現(xiàn)“安裝”命令,這是因為微軟公司已在其操作系統(tǒng) Windows 中內(nèi)置提供了 Setup API(可以解釋.INF腳本文件),我們只需用文本編輯軟件編寫 .INF文件,便可完成大部份的安裝工作,所以尤其是在軟體的大小并不是很大的情況下,安裝工作不是很復(fù)雜的時候,使用 .INF文件來進(jìn)行安裝工作將會是一個好選擇。而且如果要安裝設(shè)備驅(qū)動程序,.INF文件是目前唯一的選擇。 可以用 .INF文件創(chuàng)建包括注冊表條目和目的目錄的自定義軟件安裝指令。.INF文件可以提供有限的平臺獨立性,并指定有限的軟件依賴性。目前.INF文件最普 遍的應(yīng)用是為安裝硬件設(shè)備的驅(qū)動程序服務(wù)的,本文的目的就是介紹 .INF文件的功能、結(jié)構(gòu)、并提供了幾個事例來說明如何用.INF文件,如何擴(kuò)展.INF文件的用途,比如制作綠色軟件,僅供參考。
2、.INF文件的格式
.INF文件是由許多節(jié)(Section)組成,與.INI文件類似,整個.INF文件由幾個節(jié)組成,節(jié)名用方 括號擴(kuò)起來,如version 節(jié),Manufacturer節(jié),和Strings節(jié)等等。而每個節(jié)又由一系列的條目組成,每個條目都是是由一個鍵(Key)與一個值(Value)組 成,都是“Key=Value”這樣的形式,在這些節(jié)中定義的項目可以完成硬件的自動檢測和軟件(包括驅(qū)動程序)的安裝。.INF文件中分號后面的字符串 是注釋。在一個 .INF文件中,所有跟隨在分號(;)后的文字都會被視為注釋。注釋并不一定要在新行開始,可以在一行文字後面加入注釋。
3、.INF文件案格式和作用如下所示:
[Version] 節(jié): 包含對此 .INF文件的簡短描述與此 .INF文件支持的設(shè)備類型的信息。用于確認(rèn) .INF文件的基本版本信息。任何.INF文件都必須 包括這個節(jié)。 [Version] 節(jié)中的語句 Signature="$CHICAGO$"表明這個.INF文件可以用于windows 95以后的所有平臺上,目前來說就是win98,winme,winnt4,win2k,winxp,win2k3。這種.INF文件比較多見。
如果 [Version]節(jié)中的簽名條目是 Signature="$Windows 95$",表明這個.INF文件可以用于windows 95以后的Win9x平臺上,目前來說就是win98,winme。
如果[Version]節(jié)中的簽名條目是 Signature="$WINDOWS NT$",表明這個.INF文件可以用于WindowsNT系列的平臺上,包括winnt4,win2k,winxp,win2k3。WIN9x系列的操 作系統(tǒng)的SetupAPI將會拒絕執(zhí)行這種類型的.INF文件。
[Manufacturer] 與 [Manufacturer Name] 節(jié): 列出此 .INF文件可辨識的所有硬件設(shè)備,并列出了開發(fā)該硬件的廠商名稱,主要用于硬件設(shè)備的安裝。在設(shè)備驅(qū)動程序的.INF文件中必須包括 [Manufacturer]節(jié)與 [Manufacturer Name] 節(jié)。[Manufacturer]節(jié)和[Microsoft]節(jié),安裝新硬件的向?qū)е辛谐鰜淼膹S商名字和設(shè)備名 稱就是來自這兩個節(jié)。這行語句“%MfgName%=Microsoft” 的等號右邊的名字指明設(shè)備制造商是Microsoft,等號左邊是廠商的名字,廠商名稱是"Microsoft"(在后面講到的[Strings] 節(jié)中)。在一個.INF文件中可以有多個設(shè)備制造商的名字,都必須放在[Manufacturer]節(jié)中,同時[Manufacturer Name] 節(jié)可以列出該廠商的多種設(shè)備。
[Manufacturer Name] 節(jié)區(qū)含有對要安裝的設(shè)備的描述,并為要安裝的設(shè)備指出 [Install] 節(jié)區(qū)。
[Manufacturer Name]節(jié)語法:
[manufacturer-name]
device-description=install-section-name,device-id[,compatible-device-id]...
device -description就是對要安裝的設(shè)備的描述。install-section-name就是此設(shè)備的 [Install] 節(jié)區(qū)名稱,manufacturer-name 節(jié)區(qū)名稱必須已在 [Manufacturer] 節(jié)區(qū)中被定義。device-id是此設(shè)備的硬件標(biāo)志符,每個廠家的不同的硬件對應(yīng)著不同的設(shè)備標(biāo)志符。
普通的安裝軟件的.INF文件中,不包括[Manufacturer] 與 [Manufacturer Name] 節(jié),即使包含,也不會執(zhí)行它們,這2個節(jié)僅僅用于硬件的設(shè)備驅(qū)動中起作用。
[Install] 節(jié): 描述設(shè)備驅(qū)動程序與硬件設(shè)備的實際屬性。它也定義了所有 [Install] 節(jié)的名稱,在此定義的節(jié)中包含了安裝該設(shè)備的信息和命令。默認(rèn)情況下,會執(zhí)行 [DefaultInstall] 節(jié),Install操作就會執(zhí)行[DefaultInstall] 節(jié)。[DefaultInstall] 節(jié)中包含指向其他節(jié)的指針,該節(jié)可用于指定要復(fù)制和刪除的文件、注冊表的更新、.INF文件的更新等。
如果是安裝普通的軟件的.INF文件,可以通過鼠標(biāo)右鍵菜單上的“安裝”命令來安裝,這個時候.INF文件必須包括 [DefaultInstall]節(jié),也可以包括其他的[Install]節(jié),用RUNDLL32.EXE ETUPAPI.DLL,InstallHinfSection [Install]節(jié)的名字,這樣類似的命令來安裝。
[Install]節(jié)的語法:
[install-section-name]
Copyfiles=file-list-section[,file-list-section]...
LogConfig=log-config-section-name
Renfiles=file-list-section[,file-list-section]...
Delfiles=file-list-section[,file-list-section]...
UpdateInis=update-ini-section[,update-ini-section]...
UpdateIniFields=update-inifields-section[,update-inifields-section]...
AddReg=add-registry-section[,add-registry-section]...
DelReg=del-registry-section[,del-registry-section]...
Ini2Reg=ini-to-registry-section[,ini-to-registry-section]...
UpdateCfgSys=update-config-section
UpdateAutoBat=update-autoexec-section
[Install] 節(jié)定義了安裝程式與硬體驅(qū)動需要的資源,以便安裝新的驅(qū)動程式或者軟件。
此節(jié)中每個條目都有其特定格式與意義,并非每個條目都是必要的。無論是安裝驅(qū)動程序還是普通的軟件,最后都要從某一個[Install] 節(jié)開始執(zhí)行。
[DestinationDirs] 節(jié): 指定硬盤上復(fù)制、刪除或重命名節(jié)文件的位置(例如 \Windows 或 Windows\System)。 .INF文件通過[DestinationDirs]節(jié)來指定操作的目標(biāo)路徑,語法如下:
[DestinationDirs]
file-list-section =ldid[, subdir ]
DefaultDestDir=ldid[, subdir ]
[DestinationDirs] 節(jié)定義了 [file-list-section] 節(jié)中指定的操作(可以是 CopyFiles、RenFiles 或 DelFiles 節(jié))的目標(biāo)目錄。DefaultDestDir命令可以為 .INF文件中的任何沒有明確在[DestinationDirs]節(jié)中命名的CopyFiles、RenFiles或DelFiles節(jié)指定默認(rèn)目標(biāo)文 件夾。
[FileCopy/Delete/RenameSection(s)] 節(jié):列出要復(fù)制、刪除或重命名的文件。 節(jié)的名字是CopyFiles,DelFiles,RenFiles。
[RegistryUpdateSection(s)] 節(jié):指定在注冊表中添加或刪除的項目。 節(jié)的名字是AddReg,DelReg。
[IniFileUpdateSection(s)] 節(jié):指定 .ini 文件的更新。鏈接將在該節(jié)中創(chuàng)建。 節(jié)的名字是 UpdateInis。
在.INF文件中,使用邏輯磁盤標(biāo)識符 (LDID) 來表示路徑,如下表:
00 Null LDID - 可用于創(chuàng)建新的 LDID
01 Source Drive:\pathname
10 Windows 文件夾(等價于%windir%目錄 )
11 System 文件夾
12 IOSubsys 文件夾
13 Command 文件夾
17 Inf 文件夾
18 Help 文件夾
20 Fonts
21 Viewers
22 VMM32
23 Color 文件夾
24 包含 Windows 文件夾的驅(qū)動器根目錄
28 Host Winboot
30 啟動盤的根文件夾
31 虛擬啟動盤的主驅(qū)動器根文件夾
[ClassInstall] 節(jié):為設(shè)備定義一個新的類別(Class)。主要用于硬件設(shè)備的安裝。
[SourceDisksNames] 節(jié): 列出包含文件的磁盤。
[SourceDisksFiles] 節(jié): 列出每個文件所在的特定磁盤。
其他的節(jié)還有許多,如:Update .ini Fields 節(jié) (UpdateIniFields),Add Ini File to Registry 節(jié) (Ini2Reg),Update Config.sys 節(jié) (UpdateCfgSys),Update Autoexec.bat 節(jié) (UpdateAutoBat),Optional Components 節(jié),等等。
.INF文件 是由Windows的SetupAPI解釋執(zhí)行的腳本文件,它的運行過程很簡單,是一種線性的執(zhí)行,線性的意思就是.INF文件的運行過程不存在分支語 句,也就是沒有條件語句,一旦開始執(zhí)行,就是沿著固定的路線運行。它的運行是按照節(jié)為單位來執(zhí)行的,從某一個[Install]節(jié)開始執(zhí)行,從上到下執(zhí)行 該節(jié)中的條目,如果該條目是一個節(jié),那么就一條條執(zhí)行子節(jié)中的條目,如此遞歸執(zhí)行。
這樣的腳本看起來功能很弱,但是對于簡單的安裝任務(wù)已經(jīng)足夠 了,安裝不外乎復(fù)制文件,添加注冊表,修改.INI文件等任務(wù),這些都可以用.INF文件來完成。對于更復(fù)雜的安裝要求,如要求安裝程序的界面漂亮方便, 要求有選擇性的安裝,要求安裝程序自動修復(fù)的功能,就只好求助于其他的工具了,如微軟的Windows Installer,就具備更加強(qiáng)大的功能。
4、.INF文件的版本
.INF文件的語法是統(tǒng)一的分節(jié)語法,隨著操作系統(tǒng)的更新,微軟逐漸增加了一些必要的關(guān)鍵字,但是整個的.INF文件的結(jié)構(gòu)不會變化。從語法上來說,.INF文件都是一個類別。
按照.INF文件的版本來分類,可以分為2類:
1 AdvancedINF,在[Version]節(jié)中有“AdvancedINF=2.5,"您需要新版本的 AdvPack.dll" ”這么一行語句,表明此.INF文件需要AdvPack.dll這個動態(tài)鏈接庫來解釋執(zhí)行,AdvancedINF有一些高級特性,但是在目前用的不太 多。
2 普通INF,沒有指明需要AdvPack.dll的.INF文件,使用SetupAPI.DLL來解釋執(zhí)行(win9x系列的操作系統(tǒng)使用Setupx.dll),系統(tǒng)中缺省使用的就是這種普通INF。
5、.INF文件的功能
從前面的介紹,能夠看出使用 .INF文件可以完成如下功能:
1 復(fù)制文件、刪除文件、或重新命名文件。
2 新增或刪除注冊表(Registry)中的項目。
3 修改重要的系統(tǒng)設(shè)置文件(如 Autoexec.bat、Config.sys、.INI 等)。
粗 看起來,似乎上面提到的第一個功能可以用批處理文件.BAT來完成,第二個功能可以通過注冊表文件.REG來完成,第三個功能現(xiàn)在用得不多,不經(jīng)常處理. INI文件了。這樣說起來似乎.INF文件也沒有太大的優(yōu)勢啊。這種看法是有問題的,下面我將會著重指出.INF在在這幾個方面的應(yīng)用,而不會仔細(xì)講解. INF的語法。 下面要提到.INF文件優(yōu)于別的工具的方面。
6、用.INF文件編輯注冊表
.INF文件可以編輯操縱注冊表,相應(yīng)的的命令是AddReg和DelReg,
語法如下:
AddReg = add-registry-section[,add-registry-section]...
[ add-registry-section]
reg-root-string, [subkey], [value-name], [flag], [value]
[add-registry-section]節(jié)定義了將要添加的注冊表子鍵或值名,可以有選擇地設(shè)置它的值。
DelReg = del-registry-section[,del-registry-section]...
[ del-registry-section]
reg-root-string, subkey, [value-name]
[ del-registry-section]節(jié)定義了將要從注冊表中刪除子鍵subkey或值名value-name。
有時候上網(wǎng)遇到某些網(wǎng)站,修改了IE的主頁,然后禁用了REGEDIT工具,這個時候很多人只好借助于其他第三方工具如超級兔子等來恢復(fù)注冊表的編輯權(quán)限,其實這個時候僅僅依靠.INF文件就可以恢復(fù)使用REGEDIT工具的權(quán)限。
把下面的這段代碼復(fù)制到記事本里,另存為jiereg.inf,然后右擊它選擇“安裝”,就可以了。
[Version]
Signature= "$CHICAGO$"
[DefaultInstall]
AddReg=My.Add.Reg
[My.Add.Reg]
HKCU, "SOFTWARE\Microsoft\windows\currentversion\policies\system","disableregistrytools", 0x00010001,"0"
HKLM,"SOFTWARE\Microsoft\windows\currentversion\policies\system","disableregistrytools", 0x00010001,"0"
當(dāng)然還可以用其他的方法,原理也是一樣的,這里僅僅是演示一下.INF文件的用途。
直接使用注冊表文件,有時候還會遇到另外一個缺點,就是.REG文件里面使用16進(jìn)制代碼表示UNICODE字符串的,如下面的兩條注冊表語句:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]
"Cookies"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,00,45,00,25,00,
5c,00,43,00,6f,00,6f,00,6b,00,69,00,65,00,73,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SoftEther]
"ImagePath"=hex(2):22,00,44,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,20,
00,46,00,69,00,6c,00,65,00,73,00,5c,00,53,00,6f,00,66,00,74,00,45,00,74,00,68,00,65,00,
72,00,5c,00,53,00,6f,00,66,00,74,00,45,00,74,00,68,00,65,00,72,00,2e,00,65,00,78,00,65,
00,22,00,20,00,73,00,65,00,72,00,76,00,69,00,63,00,65,00,00,00,00,00
這上面兩條語句難以閱讀和修改,手工修改的話很麻煩,其中
"Cookies"的值實際上就是“%USERPROFILE%\Cookies”字符串的UNICODE表示。
"ImagePath"的值實際上就是"D:\Program Files\SoftEther\SoftEther.exe" service
如果用.INF文件的形式的話,就很簡單明白了:
[Version]
Signature="$CHICAGO$"
[DefaultInstall]
AddReg=Folders_AddReg
[Folders_AddReg]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Cookies",0x00020000,"%USERPROFILE%\Cookies"
HKLM,"SYSTEM\CurrentControlSet\Services\SoftEther","ImagePath",0x020000,"""D:\Program Files\SoftEther\SoftEther.exe"" service"
這個時候可以手工修改里面的路徑信息,而.REG文件則很難做到這一點。
7、用.INF文件編輯.INI文件
.INF文件可以使用UpdateInis命令修改.INI文件的功能也經(jīng)常需要,UpdateInis的語法如下:
UpdateInis = update-ini-section[,update-ini-section]...
[ update-ini-section-name]
ini-file, ini-section, [old-ini-entry], [new-ini-entry], [flags]
[update-ini-section-name]節(jié)給出的 .INF 文件中替換、刪除或添加的全部條目。ini-file 包含要更改條目的 .ini 文件名。 ini-section 包含要更改條目的節(jié)名。 old-ini-entry 可選,常用形式為 Key=Value。new-ini-entry 可選,常用形式為 Key=Value。flags 是可選操作標(biāo)記。
使用邏輯磁盤標(biāo)識符 (LDID),可以方便的修改.INI文件中的路徑信息,當(dāng)然其他的條目也同樣。舉例如下: Total Commander ,是一套極佳的文件管理員,內(nèi)含各種壓縮與解壓縮,類似NC般非常好用的工具,對于文件與路徑的尋找,除一般的復(fù)制、刪除、搬移、編輯等功能外,還有 FTP功能(具有續(xù)傳、背景傳輸)與解決了中文亂碼問題,"專題"再也不會變成"彩題"、新增文件分割、文件合并、文件編碼、文件解碼(MIME, UUE,XXE)及新的操作介面(浮動工具列)。真是一套相當(dāng)強(qiáng)悍可完全取代文件總管的工具程序。Total Commander依靠wincmd.ini來配置相應(yīng)的操作特性和功能,于是可以使用如下的.INF文件修改wincmd.ini中的路徑信息:
[version]
Signature="$CHICAGO$"
[DefaultInstall]
AddReg=AddGhister
UpdateInis=UpdateInicmd
[AddGhister]
HKCU,"Software\Ghisler\Total Commander","IniFileName",0,".\\wincmd.ini"
HKCU,"Software\Ghisler\Total Commander","FtpIniName",0,".\\wcx_ftp.ini"
[UpdateInicmd]
%01%\wincmd.ini, Configuration,,"InstallDir=%01%"
%01%\wincmd.ini, Configuration,,"Mainmenu=%01%\LANGUAGE\TCExtMenu.mnu"
其 中 [AddGhister]節(jié)負(fù)責(zé)修改注冊表中記錄的wincmd.ini的路徑,而[UpdateInicmd]節(jié)負(fù)責(zé)修改wincmd.ini文件紅的 相應(yīng)路徑信息,可以看出,一個簡單的.INF文件就完成了修改Total Commander的路徑的任務(wù),在Total Commander5.x版本中,必須修改wincmd.ini文件中的路徑信息,這個時候使用.INF文件是非常方便的。
8、用.INF文件刪除正在使用的文件
有時候由于某些文件正被操作系統(tǒng)使用而無法刪除,如某些用于資源管理器的OCX控件,可以使用.INF文件的DelFiles命令刪除,該命令如果發(fā)現(xiàn)要刪除的文件被鎖定,就會把文件放到系統(tǒng)刪除隊列中排隊,等系統(tǒng)重啟動的時候,該文件就自動被刪除了。
Delfiles的語法是:
Delfiles= file-list-section [,file-list-section]...
[file-list-section]
filename,,,1
[file -list-section]節(jié)定義了將要刪除的文件列表,filename后面的1是一個標(biāo)志,指明如果文件當(dāng)前無法刪除,就等到系統(tǒng)重啟動后刪除。把 下面的這段代碼復(fù)制到記事本里,另存為delinuse.inf,把這個文件拷貝到無法刪除的文件的目錄,然后右擊它選擇“安裝(I)”,就可以刪除當(dāng)前 目錄下正在使用的setup.exe和setup2.exe。
[Version]
Signature="$Chicago$"
[DestinationDirs]
DefaultDestDir = 01 ; 當(dāng)前目錄 ,定義了將要刪除的文件的路徑
[DefaultInstall]
DelFiles = DeleteLIST
[DeleteLIST]
setup.exe ,,,1; 將要刪除的文件
setup2.exe ,,,1; 將要刪除的文件
同樣可以使用Copyfiles命令替換系統(tǒng)正在訪問的文件。這些功能通過普通的del和copy命令都無法實現(xiàn),如果不使用.INF文件,必須使用第三方的軟件來完成。
9、輔助制作綠色軟件
在注冊表.REG文件中,不可以使用變量,這個缺陷對于需要設(shè)置路徑的安裝程序來說,是非常致命的弱點,.REG文件中的路徑都是靜態(tài)的,一旦寫好,就不會 隨著系統(tǒng)的變化而變化,如果需要把安裝的程序從C盤改變到D盤,而在.REG文件中記錄了安裝路徑的話,這個時候直接倒入注冊表文件.REG是不行的,導(dǎo) 入的注冊表仍然是原來寫入的路徑。而在.INF文件中,可以使用變量來操縱路徑,從而可以跟蹤安裝程序所需要的路徑的變化。
對于綠色軟件的制作,其中核心的一點就是獲得原來軟件的安裝程序所做出的注冊表的改變,然后把該變化導(dǎo)出為一個注冊表文件. REG來進(jìn)一步分析。如果導(dǎo)出的.REG文件不包括絕對路徑,那么可以把該注冊表文件和提取出的軟件打包在一起做成綠色軟件。如果導(dǎo)出的.REG文件中包 含當(dāng)前軟件的絕對安裝路徑,那么就必須每次都要手工修改注冊表中路徑,是很麻煩的,降低了做成綠色軟件的意義所在。而使用.INF文件,使用AddReg命令可以輕松容易的解決這個注冊表路徑的難題。
對于綠色軟件的安裝制作來說,最重要的就是01,也就是源文件夾。下面舉一個例子:
Registry Crawler V4.5 ,是強(qiáng)大的用戶和開發(fā)者快速定位并配置注冊表的工具軟件。一個強(qiáng)大的搜索引擎允許你基于搜索標(biāo)準(zhǔn)查找注冊信息。(可以從天空軟件站下載http: //www4.skycn.com/soft/2963.html),安裝完成后導(dǎo)出的注冊表包含著如下一條語句:
[HKEY_LOCAL_MACHINE\SOFTWARE\4Developers\RCrawler\AppPath]
@="F:\\tools\\Reg\\RCrawler"
其中“F:\tools\Reg\RCrawler”是安裝路徑。
而改寫為.INF文件就是:
[version]
Signature="$CHICAGO$"
[DefaultInstall]
AddReg=Add
[Add]
HKLM,"SOFTWARE\4Developers\RCrawler\AppPath","",0,"%01%"
注意里面的%01%就代表當(dāng)前的安裝路徑。
當(dāng)我們把F:\tools\Reg\RCrawler這個目錄下的文件移動到其他目錄時候,要用.REG文件的方式的話,就必須手工修改注冊表文件,而使用 前面的.INF文件的時候,什么都無需修改,只要在文件管理器explorer里面,用鼠標(biāo)右鍵執(zhí)行“安裝”命令的時候,%01%就自動被替換為當(dāng)前所在 的目錄了。
最后,總結(jié)一句,注冊表文件.REG非常方便和直觀,但是對于處理路徑的變化的情況,非常笨拙和不方便,而.INF不如注冊表文件直觀,但是可以方便的處理路徑信息(包括UNICODE的路徑信息),所以應(yīng)該把.REG文件和.INF文件結(jié)合使用,互相彌補各自的缺點。