INF文件詳解

 安裝信息(Setup Information)文件是Windows系統支持的一種安裝信息存放文件,通常以INF做爲擴展名,所以也叫INF文件。安裝信息INF文件與Windows內建的安裝服務引擎(API函數庫)緊密協同工做,基於其嚴格的編寫語法制做而成的INF文件在拷貝、刪除文件,增、刪註冊表鍵,更改系統設置等方面都有優秀的表現,徹底能夠用來實現應用程序文件安裝的目標,並且價格免費,透明度高,安裝程序小,可徹底定製。INF文件是文本文件,可在任何文本編輯器內查看、建立、修改,普通用戶使用Windows系統自己提供的記事本、寫字板便可進行文件安裝腳本的編寫。安全

INF文件安裝動做的觸發機制 服務器

        在文件目錄中用鼠標右擊INF文件,會顯示不一樣於其餘擴展名文件的「安裝」菜單。Windows平臺在計算機中完成初始安裝後,就註冊了INF文件的「安裝」動做,此「安裝」動做關聯命令行程序基本形式爲:
RunDll setupx.dll,InstallHinfSection section reboot-mode inf-name 
如筆者目前正在使用的Windows 98系統註冊表中,HKEY_CLASSES_ROOT\inffile\install\ 
command鍵的默認值爲(install即爲安裝): 
C:\WINDOWS\rundll.exe setupx.dll,InstallHinfSection DefaultInstall 132 %1 
其中,rundll程序以命令行的形式調用Windows的動態連接庫,其命令格式爲: 
rundll.exe <DLL文件名>,<入口點>,<調用參數> 
setupx.dll是安裝API(Setup API)函數庫,包含了InstallHinfSection、SetupGetInfSections、SetupInstallFromInfSection、SetupPromptForDisk、SetupDiCreateDevRegKey等INF文件內部語法檢查、節名搜索、註冊鍵建立等功能函數。setupx.dll與其後的入口點用逗號(,)分開,入口點是大小寫敏感的。
Section是INF文件內初始執行節名,首先執行該節內容,默認狀況下名稱爲「DefaultInstall」,系統用戶通常不宜對此作任何改動,如被改動,則在後續INF文件的Install節使用相應修改後的名稱。
reboot-mode是重啓動參數,指示在INF文件執行後對系統的設置進行了改變,操做系統是否從新啓動。該參數通常設爲132或4,即由安裝程序決定是否必須重啓動,由於某些設置的改變必須在重啓動後才能生效。編輯器

inf-name是INF文件的名稱,「%1」即爲所選中文件自己。 ide

INF文件內部節(Section)的定義 
       INF文件用特殊的文本文件格式編輯、保存,Windows內建的安裝函數遵循既定的語法從INF文件內獲取安裝信息。INF文件和初始化(或稱私有化,Private File)文件類似,採用節(Section)和入口(Entries)的索引機制,節和入口定義了全部操做類型及操做對象。一個INF文件由不一樣類型的節組成,每類節都有其特殊的目的和不一樣的實現語法,每節的內容均服務於該節的目的。除了基本的識別INF格式的「Version」節外,INF文件中節的數目和類型沒有限制,主要取決於具體安裝任務。一個基本的INF文件,通常包含以下幾節:函數

 

節的名稱 節的做用
[version] INF文件頭,提供有效INF文件的版本信息
[DefaultInstall] 包含安裝所關聯的動做(文件拷貝或刪除,註冊表鍵值的更新,子鍵刪除等)在INF文件內容的節名指針中,默認狀況下首先執行該節內容
[OtherInstall] 與[DefaultInstall]節遵循相同的語法,但必須被顯式的調用常被用來定義反安裝動做
[DestinationDirs] 指定羅列與一個節內容被拷貝、刪除或重命名的文件在硬盤上的位置
[Fillcopy/Delete/Remename Sections] 羅列將被拷貝、刪除、或重命名的文件
[Registry UpdateSection] 指定對註冊表鍵值更新、子鍵增等動做
[iniFileUpdateSection] 制動對ini文件進行更新、快捷方式經過該節進行建立
[SourseDiskNames] 羅列文件所在盤盤名、盤的卷標、盤序列號
[sourseDiskFiles] 羅列安裝時使用的源文件及其所在的盤
[Strings] 羅列本地化字符串


        表中黑體節名是保留關鍵字,名稱固定,大小寫不敏感,斜體節名名稱任意,由INF文件編寫者肯定。每節的標題字符均用括號()括起。 限於篇幅本文只對黑體節名作進一步的解釋。工具

[Version]節 
任何INF文件的第一個小節均是[Version],又稱爲INF文件頭。通常有以下語句:佈局

[Version]
Signature=「$Chicago$」
LayoutFile=filename.inf


        其中,Signature的值應爲「$Chicago$」、「$Windows 95$」或「$Windows NT$」中的一個(不區分大小寫),不然Windows不接受該文件爲INF文件,內建的動做也就不會起做用。
filename.inf文件包含安裝組件必需的安裝佈局信息(源盤和源文件),該行是可選的,若是沒有提供佈局信息文件,則在INF文件內必須包含[SourceDisksNames]和[SourceDisksFiles]節。測試

[Install]節 
     [Install]節提供了一個INF文件安裝過程的總覽,它識別文件內其餘包含安裝信息節的詳細動做,是Windows內建安裝函數識別安裝過程和內容的真正入口,用戶全部的安裝目的在這裏表現。那些與[Install]節內容不存在關聯的節的動做將被忽略。
[Install]節分[DefaultInstall]和[OtherInstall]兩類,它們使用相同的格式。[DefaultInstall]節節名「DefaultInstall」如前面表格內容所述被顯式地在註冊表中指定,大小寫不敏感。該節也是系統獲取INF文件中安裝信息的首要入口,當用戶右擊INF文件選「安裝」時該節內容被執行。[OtherInstall]與[DefaultInstall]節遵循相同的語法,但必須被顯式地調用,常被用來定義反安裝動做。它們都可包括如下種類的可選入口:this

複製代碼
CopyFiles=[CopyFiles-section-name]file-list-section[,file-list-section]
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
複製代碼

        上面的入口並不是都必需,若是須要一個入口,則應該在等號右側指出存在於該INF文件內的索引節名(不用指出節名的一個特例是CopyFiles入口,可以使用「@」字符後跟文件名的形式,效果是直接將文件拷貝到DestinationDirs節所羅列的硬盤目錄)。節名需由可打印字符組成,在中文系統平臺中,可以使用中文字符做爲節名,這也是體現INF格式安裝本地化的地方,很是直觀。每類入口在一個[Install]節內只能出現一次,第二次及之後出現的同名重複入口將被忽略。每類入口的等號右側可羅列多個節名,節名之間以逗號分開,以便列舉同一類動做的不一樣做用對象,如刪除多個註冊表鍵、拷貝文件到多個目錄路徑等。
下表是各種入口的動做含義,具體語法本文不作細述: 
spa

在實際編寫INF文件時,註冊表根鍵一般採用縮寫方式,以下表: 

[DestinationDirs]節 
[DestinationDirs]節指定拷貝、重命名或刪除文件三類動做的目的目錄路徑,拷貝、重命名或刪除操做對象即文件的列表在專門的節中列出,這些節名最初在「Install」的CopyFiles、RenFiles或DelFiles入口中明確。
[DestinationDirs]節內語句的語法爲: 
file-list-section=LDID,[Subdir] 
[DefaultDestDir=LDID,[Subdir]] 
其中file-list-section爲必選項,是CopyFiles、RenFiles或DelFiles入口內列出的節名。 
LDID(Logical disk identifier)爲必選項,是邏輯盤標識碼,表明各類系統或實時安裝路徑,邏輯盤標識碼可看作一種宏字符串,隨系統或實時安裝路徑的不一樣而相應改變。邏輯盤標識碼機制確保了安裝的靈活性和正確性,該標識碼可爲下表所述值之一:
Subdir爲可選項,指定LDID目錄下的子目錄名。 
DefaultDestDir爲可選項,指定CopyFiles、RenFiles或DelFiles入口的缺省操做目錄。 

[SourceDisksNames]節 
[SourceDisksNames]節羅列源文件所在盤符序列碼、盤描述符、盤卷標號和盤序列號。 
[SourceDisksNames]節內語句的語法爲: 
disk-ordinal=「disk-description」,disk-label,disk-serial-number 
其中disk-ordinal爲必選項,是盤符序列碼,標識一個源盤,具備唯一性,通常可設置爲從1開始遞增的整數,0不是一個有效的盤符序列碼。當存在多個源盤時,盤符序列碼之間不能重複。
disk-description爲必選項,是盤描述符,用雙引號括起的字符串或字符串宏描述盤的內容或目的。安裝引擎將該字符串顯示在對話框內以提示用戶。 
disk-label爲源盤的卷標識。 
disk-serial-number未使用,但必須被設置爲0。 

[SourceDisksFiles]節 
[SourceDisksFiles]節指定安裝時使用的源文件和盤符序列碼、盤描述符。 [SourceDisksFiles]節內語句的語法爲: 
file-name=disk-number[,subdir] [,file-size] 
其中file-name爲必選項,是源盤上文件的名稱。 
disk-number是包含file-name指定文件所在源盤的盤符序列碼,該盤符序列碼需在[SourceDisksNames]節中列出,並大於或等於1。 
Subdir爲可選項,指定文件所在源盤的子目錄,如省略則源盤爲缺省安裝路徑。 
file-size爲可選項,代表文件的大小,以字節爲單位。 

[Strings]節 
        [Strings]節定義一個或多個本地化字符串,或稱字符串宏。儘管[Strings]節通常被放置在INF文件的末尾,字符串宏可在INF文件任何地方使用,安裝引擎解釋、展開字符串宏爲給定的長字符串並作進一步處理。字符串宏在使用時需用百分號(%)括起。[Strings]節內語句的語法爲:
strings-key=value 
其中strings-key爲由字母或數字等可打印字符組成的宏名。 
Value爲被雙引號括起的長字符串,字符串可由字母、數字或其餘可打印字符組成。
一個具體的安裝實例 
        本文接下來列舉一個名爲「Mysetup.inf」的安裝信息文件實例,以便讀者熟悉INF文件語法,領略INF文件的安裝效果。該「Mysetup.inf」文件可完成以下的安裝任務:假設應用程序有「MyApp.exe」、「MyApp.hlp」、「MyApp.dll」等幾個需安裝到應用程序主目錄的文件,有「Ass_1.dll」、「Ass_2.dll」等幾個需安裝到Windows\System子目錄的文件,要求將各文件按預約目錄位置拷貝到位,其中應用程序主目錄可在安裝過程當中選定,同時,在「開始>程序」下面創建名爲「個人程序組」的程序組,在該程序組下創建名爲「個人應用程序」、「個人應用程序幫助」的兩個程序項,分別與「MyApp.exe」和「MyApp.hlp」文件關聯
完成上述安裝任務的「Mysetup.inf」文件內容以下(這個代碼根本就沒有看懂):

複製代碼
[Version]
signature=「$chicago$」
[AdvSetup]
HKLM,SOFTWARE\Microsoft\Windows
\CurrentVersion\Runonce\Setup,「INF製做安裝程序」,,「RunDll32.exe「%01%」\advpack.dll,LaunchINFSection Mysetup.inf,DefaultInstall2」
[DefaultInstallX]
[DefaultInstall]
AddReg=AdvSetup
[DefaultInstall2]
CopyFiles = 拷貝到用戶指定目錄,拷貝到Windows\System子目錄 ,……
CustomDestination=My-path
UpdateInis = 加exe文件快捷方式,加hlp文件快捷方式,……
[SourceDisksNames]
1=「文件所在目錄」,,0
[SourceDisksFiles]
MyApp.exe.exe=1,,1021
MyApp.dll=1,,1021
MyApp.hlp=1,,1021
Ass_1.dll=1,,1021
Ass_2.dll=1,,1021
[DestinationDirs]
拷貝到用戶指定目錄 = 49000
拷貝到Windows\System子目錄 = 11
[My-path]
49000,49001,49002,49003=index-again,1
[index-again]
「」,「」,「」,,「「默認安裝到「C:\MyApp」目錄,可選擇」」,「%30%\MyApp」
[拷貝到用戶指定目錄]
MyApp.exe
MyApp.dll
MyApp.hlp
[拷貝到Windows\System子目錄]
Ass_1.dll
Ass_2.dll
[加exe文件快捷方式]
setup.ini, progman.groups,, 「group1=「「個人程序組」」」
setup.ini, group1,,「「「個人應用程序」」,「「「「「「%49000%\MyApp.exe」」」」」」,,,,,「「MyApp.exe」」」
[加hlp文件快捷方式]
setup.ini, progman.groups,, 「group1=「「個人程序組」」」
setup.ini, group1,,「「「個人應用程序幫助」」,「「「「「「%49000%\MyApp.hlp」」」」」」,,,,,「「MyApp.hlp」」」
複製代碼

      讀者會注意到上面的文件內許多鍵名使用了中文,這是由於INF格式文件支持中文提示及中文鍵名。這些中文鍵名不只充當功能鍵起索引的做用,還形象化地標識了鍵的先後對應關係,加強了文件內容的可讀性,有利於後續更改、維護。
安裝時,首先確保應用程序的全部待安裝文件和「Mysetup.inf」 文件處在同一個目錄下,右擊「Mysetup.inf」文件選「安裝」或按Shift鍵的同時按功能鍵F10。待目錄選擇對話框出現,點擊「瀏覽」按鈕或直接在文本編輯框內鍵入目錄名稱後,屏幕顯示文件安裝拷貝和更新快捷方式進度,最終結束。
打開資源管理器,就可查看到全部文件均已拷貝到指定目錄位置。點擊「開始>程序」,能夠找到「個人程序組」程序組及下屬的「個人應用程序」、「個人應用程序幫助」程序項,選中程序項均能激活對應文件,說明文件安裝及快捷方式關聯均告成功。

小 結 
本文介紹的文件安裝方法適合於大衆,讀者可熟悉語法、參考例子、效仿編寫,製做出本身的安裝信息文件。

用INF來建立快捷方式和修改註冊表

基本格式:

[Version] 
Signature="$CHICAGO$" 
Provider=www.lxasp.com, 2007.9.14

[DefaultInstall] 
AddReg = AddReg 
UpdateInis = AddLink

[AddReg] 
根鍵,"子鍵路徑","鍵值名",鍵類型ID,鍵值內容

[AddLink] 
setup.ini, progman.groups,, "group1=""目標目錄ID""" 
setup.ini, group1,,"""快捷方式名"",""快捷方式目標文件路徑"",""圖標文件名"",圖標編號,,""工做目錄"",""其餘描述"""

修改註冊表的示例:

修改字符串型: 
hklm,"SOFTWARE\Corel\AppLauncher","Corel BARCODE WIZARD",,"%01%\PROGRAMS\BARCODE.EXE"

修改字符串型默認: 
hklm,"SOFTWARE\Classes\.htm\OpenWithList\EMEDITOR.EXE",,,""

修改DWORD型: 
hklm,"SOFTWARE\Corel\CorelDRAW\12.0","ShowEULA",65537,00,00,00,00

修改二進制型: 
hklm,"SOFTWARE\Corel\Conversions\11\Import","Word95Import",1,43,00

建立快捷方式的示例:

在開始菜單的程序中: 
setup.ini, progman.groups,, "group1=""%16386%""" 
setup.ini, group1,,"""EmEditor"",""%01%\EmEditor.exe"",,,,"""",""EmEditor.exe"""

在當前用戶的桌面中: 
setup.ini, progman.groups,, "group2=""%16384%""" 
setup.ini, group2,,"""EmEditor"",""%01%\EmEditor.exe"",,,,""%01%"",""EmEditor.exe"""

經常使用的ID值:

[根鍵]的值: 
HKCR = HKEY_CLASSES_ROOT 
HKCU = HKEY_CURRENT_USER 
HKLM = HKEY_LOCAL_MACHINE 
HKU = HKEY_USERS

[鍵類型ID]的值: 
0 或 留空 = 字符串型 
1 = 二進制型 
0x00010000 = 擴展UNICODE字符串型 
0x00020000 = 擴展字符串型 
0x00010001(65537) = 數值型(DWORD)

[目標目錄ID]的值:(先後都加上百分號,例如  %01%  /  %16384% ) 
01 INF文件所在的當前目錄 
10 C:\Windows 
11 C:\Windows\System32 
18 C:\Windows\Help 
20 C:\Windows\Fonts 
24 C:\  即系統所在盤 
53 C:\Documents and Settings\[當前用戶名] 
其餘經常使用的目錄ID: 
16384 Current User\Desktop 
16386 Current User\Start Menu\Programs 
16389 Current User\My Documents 
16390 Current User\Favorites 
16391 Current User\Start Menu\Programs\Startup 
16392 Current User\Recent 
16393 Current User\SendTo 
16395 Current User\Start Menu 
16397 Current User\My Docu

下面是一個例子,測試經過的

複製代碼
[version]
Signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]
QLBanK.ocx=QLBanK.ocx
SAFE_User20120522.exe=SAFE_User20120522.exe

[QLBanK.ocx]
File-win32-x86=thiscab
RegisterServer=yes
clsid={B735F9B5-5E75-49D4-9AD1-D427805352A3}
DestDir=11
FileVersion=1,0,0,1

[WSAFE_User20120522.exe] 
hook=QLinstaller
FileVersion=1,0,1,1

[QLinstaller] 
file-win32-x86=./QLBank.CAB
run=%EXTRACT_DIR%\SAFE_User20120522.exe
複製代碼

 

下面是另外一個例子(網上找的)

複製代碼
[version]  
signature="$CHICAGO$"
AdvancedINF=2.0
[DefaultInstall]  
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[RInstallApplicationFiles]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[DestinationDirs]
install.files=11
[SourceDisksNames]  
1=%DiskName%,TestCAB.CAB,1
[Add.Code]
pcpos.ocx=pcpos.ocx
Comm.dll=comm.dll
pcpos.dll=pcpos.dll
TCPCLNT.dll=TCPCLNT.dll
[install.files]
pcpos.ocx=pcpos.ocx
Comm.dll=comm.dll
pcpos.dll=pcpos.dll
TCPCLNT.dll=TCPCLNT.dll
[SourceDisksFiles]
pcpos.ocx=1
Comm.dll=1
pcpos.dll=1
TCPCLNT.dll=1
[pcpos.ocx]
file-win32-x86=thiscab  
RegisterServer=yes  
clsid={719A1D6E-7099-4123-9D63-F0118AFF2D61}  
DestDir=11  
FileVersion=1,0,0,1
[Comm.dll]
file-win32-x86=thiscab  
RegisterServer=yes                       
DestDir=11  
FileVersion=1,0,0,1
[pcpos.dll]
file-win32-x86=thiscab  
RegisterServer=yes    
DestDir=11  
FileVersion=1,0,0,1
[TCPCLNT.dll]
file-win32-x86=thiscab  
RegisterServer=yes    
DestDir=11  
FileVersion=1,0,0,1
[RegisterFiles]  
%11%\pcpos.ocx
複製代碼

 

下面是一些部署cab時注意的問題

1、肯定CAB的打包正確,打包的方式在網上隨便都能找到;但要肯定的包正確,若是在起點摔倒,已經喪失了「全程」的主動性,開始咱們打的包就很差使。 

2、設置IE的安全級別,默認的狀況是禁止不少插件加載的。 
1.正式庫爲可信任站點: 
【IE】—>【工具】—>【Internet選項】—>【安全】—>【可信任站點】 
說明: 
a.) a 【站點】打開一窗口,裏面輸入cab包所在的服務器的地址,而後肯定。 
b.) 【自定義級別】中全部關於ActiveX的都設置爲「啓用」或者「提示」,同時將安全級別設置到最低,而後點肯定。 
2. 參照上面「1」中的將【Internet】中【自定義級別】如上面「b」中設置,由於圖太大,在此省略。 

3、在打開頁面過程當中若是碰到以下相似提,都要選擇安裝。 

4、【IE】—>【工具】—>【管理加載項】—>【啓動或禁用加載項】 
看是否你須要的插件被禁止加載,若是是你能夠選中後點「啓用」加載該插件,重啓加載一次。 
5、根據頁面中cab包加載的代碼中,classid中的字符串標識,在註冊表中搜索一下,看看些標識有沒有寫入到註冊表;若是已經寫入了,說明是包裏面的ActiveX沒有被成功加載,你能夠手動解壓CAB包,把裏的插件手動COPY到C:\WINDOWS\system32(也多是否C:\WINDOWS\system看你的打包文件了)目錄下,前後重啓一下IE試一下,有時候重啓一下機器也可能會解決。

6、就咱們項目中的插件而言,除個上述緣由外;自己和自身的硬件與操做系統也有關聯,特別大多數的操做系統爲了減小安裝時間或者根本沒有破解好,缺了不少底層系統支持文件才致使咱們的部分插件沒法打入;若是是這種緣由引發的能夠經過下面方式查看一下。
【個人電腦】—>【管理】—>【事件查看器】—>【系統】:若是插件沒有加載成功,在右邊會生成不少"紅叉" 事件提示,雙擊打開看以看到裏面的描述信息,發生這個事件的緣由;看心打開裏面的連接看更多的信息。若是不清楚還能夠從更多信息中的「來源」的值在百度上搜索一下,看看缺乏什麼支持文件,下載就應該沒有什麼問題了,這也是咱們用到的解決方法,研究不深,若是有興趣能夠詳細幫我解釋一下,不勝感激。

7、另外建議研究一下這個C:\WINDOWS\Downloaded Program Files文件夾,好像也和加載有關係,沒有研究過,若是清楚插件的具體過程可能知道,惋惜我不太清楚,感興趣的能夠搜一下,若是有收穫不妨共享一下。

8、版本控制:同一個版本號下的的東西若是修改後,不會自動升級,許多軟件更新版本號都會有所改變,這點你們都明白。 
<object id=」ReadCard」 classid=」xxxx」 codebase=」/xxx/…/xx.CAB#version=1.0.0.0」>中的 
#version=」1.0.0.0」就是版本號,更新後的版本號必定要比當前的高,越改越小的,沒有見過,也沒有試過。當前若是要升級版本能夠是#version=」1.0.0.1」或者#version=」2.0.0.0」總之高於當前版本便可

該博文來自:https://blog.csdn.net/chenlycly/article/details/44726105。感謝該博主。

相關文章
相關標籤/搜索