* updated by Kii Ali, 12-11-2001 ------------------------------------------------------------------------------------------ 新式 INF 檔討論 by Jonson & Issac ftp://ftp.nsysu.edu.tw/cpatch/faq/tech/tech_infnew.txt ------------------------------------------------------------------------------------------ 新式 INF 檔討論 by Jonson & Issac 本文是 Issac Chang 與 Jonson 關於新式 INF 檔(AdvancedINF 2.5)寫法的私下往來 討論信件。經由 Issac Chang 整理,Jonson 同意整理如下。希望能減少 INF 新手的入 門摸索時間。 討論內容大約包括: 1. 建立/刪除程式群組及捷徑 2. 於安裝前後執行的指令 3. 刪除安裝的檔案及目錄 4. 讓使用者指定安裝目錄 可參考下列檔案中的 .INF 檔: Jonson 的: Registry Search & Replace 中文版 ftp://ftp.nsysu.edu.tw/cpatch/system/regsrch/cregsrch211.exe -或- PowerZip 4.5 中文化升級版 ftp://ftp.nsysu.edu.tw/cpatch/arc/powerzip/cpowerzip45.exe Issac Chang 的 GhostTyper98 v1.0e 中文版 ftp://ftp.nsysu.edu.tw/cpatch/other/ghosttyper98/cgt98.exe -或- Registry Crawler v1.2 中文版 ftp://ftp.nsysu.edu.tw/cpatch/system/regcrawler/cregc12.exe 如果您根本看不懂這些往來信件到底在談甚麼,您可以先看看: http://mail2.scu.edu.tw/~u2504249/inf98.htm ******************************************************************************** I> 中文化 INF-TOOL 的時後,發現微軟的 .INF 檔蠻有趣的,翻了翻相關資料後,願與 I> 大家分享一下小小的心得:http://mail2.scu.edu.tw/~u2504249/inf98.htm J> 以下是看了「.INF 檔大解密」之後的幾個疑問及補充: J> 一. .INF 檔執行方式 J> 1. 使用 Winzip Self-Extractor 2.2 Beta 可以直接將 .INF 指定為自解檔解壓 J> 縮完畢時要執行的指令,之前的版本則不行。 J> 2. rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 File.inf J> 這個指令是 NT 的指令! J> 3. Setup.exe 所使用的 .INF 檔大都是有自己的規格和微軟的不同,您可比較一 J> 下,若是和微軟的規格一樣又何必使用 Setup.exe,這實在是多此一舉。 J> 二. 註一( Windows 9X 的 Setup API 並不能供終端使用者指定安裝目錄 ) J> 其實在 WIN 9X 已可以做到,就是我所謂的 .INF 檔的新寫法,您可以看一下我的 J> 中文化作品「PowerZip 4.51中文化」及「Registry Search + Replace 2.11 中文 J> 版」,其安裝方式都是使用 .INF 檔讓使用者自行選擇安裝路徑。 J> 三. 其它( [Install] 節區 ) J> Renfiles 指令不知您是否有測試過,我的經驗是沒有作用。 J> J> 其實您公佈的資料實在不能稱作「.INF 檔大解密」,Issac Chang 您先別忙著生氣, J> 先看看我的說法: J> J> 您公佈的資料其實都是來自微軟的資料,應該說是「.INF 檔格式基本教學」或「INF J> 檔 - 微軟公佈的資料」。 J> J> 照慣例,微軟所公佈的資料都不會是最完整的,當然他必須留下一點秘密( 到 MSDN J> 再賺一筆? ),真正的秘密( 完整資枓 )往往只能從他們的檔案中窺得端倪,雖然您 J> 提及 Tweak UI 98 的 .INF 檔,但您未對其作解說,若您能對其作剖析或解說,那您 J> 的資料或許可稱得上「解密」吧! J> J> 倘若您尚不能同意我的說法,那就請您試著解答我以下的問題吧: J> 1. 您知道 .INF 檔在複製檔案時可以比較檔案版本或不比較版本強迫複製嗎?如何做? J> 2. 您知道在 AddReg 指令中如何加入「字串」形式的 registry,但您知道如何加入「 J> 二進位值」或「DWORD」形態的 registry 資料嗎?如何做? J> 3. Copyfiles 節區中指定的檔案名稱是否支援長檔名? ******************************************************************************** I> "MS-DOS 模式", Command.com, PIFMGR.DLL, 0,, C:\WIN97, Dosprmpt I> ********* 1,2,3,4,5,6,7 ********* I> 1 Shortcut Name I> 2 Command Name I> 3 Icon File Name I> 4 Icon Index I> 5 ?????????????????????? 應該是執行時要最大化或最小化等等,但參數怎下? I> 6 Path To Command I> 7 ?????????????????????? 這名稱會出現在哪? J> 不知這些資料是您從何處而得,或是您親身測試所得結論?但我所知的建立捷徑方式和 J> 您所寫不同。此處的建立捷徑是指建立在開始功能中的捷徑而言,不知您寫的是何種捷 J> 徑? J> 開始功能表之捷徑建立方法: J> [DefaultInstall] J> UpdateInis=AddLink ;利用更新 INI 檔的方式 J> [AddLink] J> ; 標準格式:INI FILE, 節區名, 鍵值 - (不可指定 - 否則失效), 資料, 旗標 - (此處無用) J> ; 資料內容格式:捷徑名稱及主檔名, 捷徑代表的檔案或指令, 圖示來源檔名, 圖示索引, 不詳 J> ; 註:圖示來源檔名不支援 %11% 或 %49000% 這種變數 J> [Uninstall] J> CustomDestination=UninstallDestination I> SmartReboot=I =====>>> 應該是 SmartReboot=1 吧? J> 是 "I" 沒錯 J> SmartReboot=I 是拒絕重新開機功能,A 則是提示重新開機(等同 ReBoot=1) J> 此命令可用於 [DefaultInstall] J> 若不使用此命令,於更換了系統檔案之後一樣會提示重開機。( [DefaultInstall]) I> Cleanup=1 =====>>> CleanUP 是要 Clean 甚麼東西? J> 指定於安裝或反安裝後刪除 INF 檔本身,本指令可用於 [DefaultInstall] I> [DestinationDirs] I> AddFiles=49000 =====>>> 49000 是使用者選擇的安裝目錄對吧,那 49001、49002、 I> 49003 等是??? J> 全都是一樣的,指定方式: 49000,49001,49002,49003=PackageDestination49000 I> [MyCustomDestination] I> ;need to add new LFN stuff here. I> 49000,49001,49002,49003=PackageDestination49000,1 =====>>> 最想知道的是這一 I> 行到底是甚麼意思... J> 此行指定 49000, 49001, 49002, 49003 同為使用者選擇的軟體安裝路徑 J> 路徑取得位置在 [PackageDestination49000] 中定義 J> 參數: J> 1 代表取得安裝路徑後,需要使用者再次確認 J> 5 或 7 代表取得安裝路徑後,自動繼續執行安裝,不需要使用者確認 I> [UninstallDestination] I> 49000=UninstallDestination49000,5 =====>>> 5 means??? J> 如上 I> [PackageDestination49000] I> HKLM,SOFTWARE\%IncName%\%ShortName%,InstallDir,%InstallPrompt%,%DefaultDir% I> =====>>> 最想知道的是這一行到底是甚麼意思... J> HKLM,SOFTWARE\%IncName%\%ShortName%,InstallDir J> 取得系統登錄值,此取得值需是軟體的正確安裝路徑。 J> %InstallPrompt% 是取得程式安裝路徑後需要使用者確認時的提示字串。 J> %DefaultDir% 是程式在安裝時的預設路徑。 I> 看到您說明好像還需要使用者執行一個批次檔,應可利用下列方式完成: I> [DefaultInstall] I> CopyFiles=MyCopyFiles ;複製檔案(節區方式) I> AddReg=MyAddReg ;新增登錄項目 I> ; Reboot=1 ;This works when called by AdvPack.dll (won't work if called by Setupx.dll). I> ; Restart=1 ;Why this line can't work... I> RunPostSetupCommands=RunMeBa ; 經由 AdvPack.dll 才行,Setupx.dll 沒用。 I> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ I> [RunMeBa] I> Command2RunAfterInstall.exe|.bat|.com etc. J> 因為這是新版 INF 才有的功能,故舊式的 INF 檔啟動方式無法使用此功能。 J> RunPostSetupCommands 無法支援 49000 這種變數,所以在此處執行的程式無法 J> 知道使用者的軟體安裝路徑。 J> 故只能執行系統上的程式,對需要在軟體安裝路徑中執行的程式則無法使用。 J> 也就是說在呼叫程式時即需指定完整路徑,但不可用 %11% 或 %49000% 這種 J> 變數。 ******************************************************************************** I> 1. 您知道 Section Name 的長度限制嗎?我的 [DefaultUninstallDestination49000] I> 就太長,造成 INF 無法執行。如果您知道,我就不需要一次減一個字元測試了 ;-) J> 不知道,因為我沒寫那麼長過。:P I> 2. 建立程式群組沒問題,可是刪除程式群組後非得要重新開機,建立的群組才會不見。 > (至少在我的 98 是這樣的情形)。有解嗎? J> 奇怪,我的不用重開機呀! J> 建立程式群組的方法 J> [AddLink] J> setup.ini, progman.groups,, "group0=%ShortAppName%" J> setup.ini, group0,, ""%ShortAppName%"" J> setup.ini, group0,, """%Icon1Name%"",""%LinkName%"",""Explorer.icl"",4," J> [RemoveLink] J> setup.ini, progman.groups,, "group0=%ShortAppName%" J> setup.ini, group0,, ""%ShortAppName%"" J> setup.ini, group0,, ""%Icon1Name%"" I> 3. 您的 .INF 檔是用記事本寫的還是用 MS 的 Inf Editor 寫的? J> 我是自己用鍵盤一個一個字敲進去的。 J> 您知道微軟有寫 INF 的工具嗎? J> 有的話,別忘了通知我一下呀! ******************************************************************************** I> 他們說萎軟的 Windows 98 DDK 裡面有 INF Editor(上次誤植為 INF Writer)。曾經 I> 想下載來用看看,無奈卻發現原來 Windows 98 DDK 足足有 30 MB 大,只好作罷。現在 I> 也是和您一樣一字一字地刻的。 J> 這個嘛!! 我試試看能不能抓回來看看!! I> [PackageDestination49000] I> HKCU,SOFTWARE\%IncName%\%ShortAppName%\%VerNum%,InstallDir,%InstallPrompt%,C:\Program Files\QuickNotes I> 上面這行的意思是不是表示如果找得到 InstallDir 的內容資料,就用它來當 I> %InstallPrompt% 視窗欲取得的安裝目錄,否則就用 C:\Program Files\QuickNotes 來 I> 當成安裝目錄? J> 是的。 I> 又 4900X 好像不一定要叫做 49000X 對吧?上次用了 77777 一樣照跑不誤。 I> 4900X 這東西應該是用來取 Registry 中的 Value 的內容資料(就像用 InstallDir I> 可取得軟體的安裝目錄)。不知道還有沒有其他用途? J> 用 1000345 也可以吧!(哈) I> 再請問您的 Registry Search & Replace 是用那個軟體包裝的?為甚麼可以讓使用者選 I> 擇解壓路徑?我用 WZSE 2.0 與 2.2 Beta 都沒有讓使用者選擇安裝路徑的功能。難不 I> 成您用的是 WZSE 2.1 版? J> 這跟用那個軟體包裝無關啦! J> 雖然我是用 WZSE 2.2 Beta 包裝的,但主要都是 INF 檔在搞鬼。 ******************************************************************************** I > 嗨: I> 下面這一段是我從 REGISTRY 匯出來的,如果要用 .INF 加到 Registry 中,是否有 I> 辦法辦到呢?用已知的方法做會得到 AdvPack.dll 丟回一個錯誤訊息:「記憶體配置 I> 失敗」。 I> ================================================================================= I> REGEDIT4 I> [HKEY_LOCAL_MACHINE\Software\4Developers\RCrawler] I> "InstallDir"="C:\\PROGRA~1\\RCRAWLER" I> "破解"=hex:54,68,65,20,47,6f,64,46,61,64,65,72,20,5b,70,63,74,5d,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,38,32,36,37,2d,40,4c,32,54,54,32,53,59,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ I> 00,00,00,00,00,00,00,00,00,00,00,00,00,00 I> ================================================================================= 用下面的方式就可以了。 [Version] Signature="$CHICAGO$" Provider=%Author% AdvancedINF=2.5,"您需要新版本的 AdvPack.dll" [MyInst] RequiredEngine=Setupapi AddReg=InstallAddReg [InstallAddReg] HKLM,Software\%IncName%\%ShortName%,InstallDir,,"C:\PROGRA~1\RCRAWLER" ;HKLM,Software\%IncName%\%ShortName%,"破解",1,54,68,65,20,47,6f,64,46,61,64,65,72,...(省略) HKLM,Software\%IncName%\%ShortName%,"破解",0x00000001,54,68,65,20,47,6f,64,46,61,64,65,72,...(省略) ******************************************************************************** I > ==================================================== I > Q2:關於 DelDirs I > ==================================================== I > 您有沒有遇過用 DelDirs 刪不掉 49000 該資料夾的問題? I > 試過您的 Registry Search & Replace,確實可用 DelDirs I > 將 49000 刪掉。 I > 但弟自己寫的 .Inf 檔,不管怎樣,就是無法刪掉 49000, I > 但 49000 裡面的檔案可用 DelFiles 刪掉。造成軟體移除之 I > 後,還留著一個空資料夾在那邊,怪彆扭的。 J> 注意資料夾是否真的沒有任何檔案或「子資料夾」存在, J> 若有則絕對刪不掉。 J> 像我作品之一:RegClean J> 因為資料夾中會存在著程式記錄修正的登錄檔 *.REG 所以 J> 一定會刪不掉該資料夾,故我建議:該資料夾就不用刪了。 J> 何況那些本不屬於程式本身的檔案資料,對使用者來說可能 J> 是極重要的資料,最好是不要刪。 J> 刪了後可能反而造成使用者的不便。 I> 確實是有空資料夾沒錯,不過那個空資料夾是原始程式的呀! I> [DefaultInstall] I> CopyFiles=MyCopyFiles.Main, MyCopyFiles.Dat I> [DestinationDirs] I> DefaultDestDir=49000 I> MyCopyFiles.Main=49000 I> MyCopyFiles.Dat=49000,Dat I> 日前丟出的 GhostTyper98,會建立下列目錄結構: I> C:\Program Files\GhostTyper98\ I> C:\Program Files\GhostTyper98\Dat I> 移除後,兩個目錄下當初以 .INF 安裝的檔案都會不見(廢話, I> 都被 DelFiles 刪掉了咩)。不過資料夾結構還是給我在那邊不 I> 動如山!我確定安裝完 GT98 後立即移除(確保該資料夾下沒有 I> 新生的檔案),但 DelDirs 還是無效,豈不怪哉! J> 2. 若干 FTP 軟體會將使用者加入的站台資料另存他檔,如: J> *.INI、*.DAT 等,這些可不能刪,若刪了,使用者可能會@#&%#@ J> 直至昏倒為止。 I> 這我瞭解,我可不想招致民怨啊! I> 附上一個 CGT98.inf,您如果有空可以幫忙抓抓蟲嗎?弟懷 I> 疑可能是反安裝區段抓不到 InstallDir 的問題,不過我自 I> 己試過改過好多地方,無奈總是無法成功。 J> 應該不是「反安裝區段抓不到 InstallDir」的問題,因為您說過 J> 該資料夾下的檔案可被刪除,可見「反安裝區段抓得到 InstallDir」 J> 若真無法解決問題的話,您大可拿Search + Replace 的 .inf 去套, J> 只不過不知此檔是否能符合您的需求。 I> 弟在丟出第一個丟出內含完整 .INF 安裝檔的中化作品(好像就是 GT98) I> 前就看過您的 Reg. Search & Replace 的 .INF 檔囉!當初本來想照抄, I> 不過怕您覺得有智產權被侵犯的感覺,又加上您那個 .INF 檔並無法抓出使 I> 用者電腦上實際的 \Program Files\ 路徑(弟無意冒犯),所以作罷,才 I> 會自己寫(其間也參考了 Registry Crawler v1.2 的 .INF 檔)。 I> 或許您不認為抓到正確的 \Program Files\ 目錄有多重要—反正大多數人的 I> 也都確實在 C:\Program Files\。不過對像弟這樣多作業系統共存的使用者來 I> 說會方便許多(在我的電腦中,Win97 用的是 C:\Pf97、Win98 用的是 I> C:\Program Files、Win NT 用的是 K:\Program Files)。 J> 極是。此謂:「由做中學」。註:這可不是一所中學的名字。(哈) I> 讓我想起「石油國中」的笑話... I> ==================================================== I> A1:關於 RunPostSetupCommands I> ==================================================== J> 您試過將 %49000% 寫在第一個引數嗎? J> 如: J> %49000%\Cgt98.txt J> 或 J> %49000%\readme.exe I> 哈,果然不行!沒試過還真的不知道!不過以後如果有需要,用: I> Start %49000%\Readme.txt 就可以了 ;-) **********************************************************