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