发新话题
打印

[转帖]深入了解“TXTSETUP.SIF”

[转帖]深入了解“TXTSETUP.SIF”

Txtsetup.sif 是一个安装信息文件(sif),主要用于 Windows 的文本安装模式(就如其名)。而且,它还可能会被其它的一些东西使用,例如,Windows PE 启动时也会用到它(Windows PE 用到了文本安装模式的末尾和 GUI 安装模式的开始部分)。文本模式完成后,这个文件就没什么用了;它不会被复制到 Windows 安装文件中(GUI 安装模式用到的安装文件)。因为 Windows 不会用到它,所以,像是系统文件保护(SFC) 这样的功能就不会影响到它。它也没有数字签名,因此你可以随意修改它而不会出现问题。
   可以利用 txtsetup.sif 向安装文件中添加第三方驱动,修改安装Windows 的最小系统需求,添加或删除注册表预设,以及更多。

   制作自己的安装光盘,这个文件就必须仔细研究一下,有用的地方不少。txtsetup.sif是制作安装光盘中极为重要的一个文件,里面记录了安装文件所在位置以及安装时文件拷贝的目标文件夹,实际作用其实就是把指定的文件按要求拷贝到预设好的位置上最可能用到的是以下几段:

[SourceDisksNames.x86]——用代码表示源文件的位置
[WinntDirectories]——用代码表示文件拷贝的目标文件夹,其根目录为 %WinDir%,即安装指定的Windows文件夹
[SourceDisksFiles]——根据前面设定的代码表示文件拷贝的具体细节

   下面3段为集成 SATA、SCSI 等驱动时所用:
[HardwareIdsDatabase] —— 硬件标识
[SCSI.Load] —— SCSI驱动加载
[SCSI] —— SCSI设备说明

[HiveInfs.Fresh]   —— 全新安装时根据指定的 inf 文件中的字段添加注册表信息
[HiveInfs.Upgrade] —— 升级安装时根据指定的 inf 文件中的字段添加注册表信息

   若想把 txtsetup.sif 中的某行移除掉,那么应该在此行前添加一个分号(;)或是把这行整个的删掉,通常,把 txtsetup.sif 中的某行删掉之后,那么还需要把 dosnet.inf 中的对应行删掉。如果想添加一行,那就比较复杂了,下面是 txtsetup.sif 的某个示例行:

locsecw.chm = 1,,,,,,,21,0,0,defrag.chm

locsecw.chm 是 Windows 安装文件中的某个文件。

   1 代表着它是个初始(RTM)XP 文件,通常你会看到 1 或 100,1 的定义来自于[SourceDisksNames.x86],表示源文件为原版本且在光盘上i386文件夹,100表示源文件为SP补丁中较新版本的文件,100 代表它是个SPx 文件(SP1,SP2..SPx);

   21 代表着它的复制目的地,其相对于 %windir% 文件夹,在这里,21 是让安装程序把 locsecw.chm 复制到 %windir%help。具体哪些值代表哪些目录可以在 [WinntDirectories] 中找到。一般情况下,[WinntDirectories] 中定义的目录都是相对于 %windir% 文件夹的子目录,这就意味着你把文件添加到 txtsetup.sif 中,那么它就会被复制到 %windir% 文件夹中(可能在其子文件夹中)。

   第一个0为升级代码位,含义为:(升级时)
0-总拷贝文件
1-安装文件夹中有该文件才拷贝
2-安装文件夹中有该文件时不拷贝;
3-不拷贝文件

   第二个0为新安装代码位,含义同上(全新安装时)另外据说此代码若不为0,其前面需多加2个逗号

   defrag.chm表示将目标文件改名为此,因此,这一行表明,不管是升级还是全新安装都将源文件locsecw.chm拷贝到%WinDir%\help文件夹下并改名为defrag.chm,就如在示例中所看到的一样,可以在行的末尾重命名要复制的文件。Microsoft 用它来区分 Windows XP Home 和 Pro 版。Home 的文件带有P, Pro 的文件带有 W。W 可能是代表着工作站(WorkStation) 的意思,P 可能是代表着个人版(Personal) 的意思,Windows XP Home 最初就叫做 Whistler Personal。

   示例;
cmconW.chm = 1,,,,,,,21,0,0,cmconcepts.chm - xp pro txtsetup.sif
cmconP.chm = 1,,,,,,,21,0,0,cmconcepts.chm - xp home txtsetup.sif

   就如所见的一样,XP Home 和 XP Pro 的文件并不相同,但是最后复制到系统中的文件名称都一样。同时请注意,txtsetup.sif 支持长文件名。

   现在来看看另一行:
autofmt.exe = 1,,,,,,_x,2,0,0,,1,2

   “_x”代表着这个安装盘上的这个文件没有经过压缩,如果没有这个,那么安装程序会认为这个文件已被压缩过了。这个对于保证安全性和可靠性很重要。每个 XP 文件都被列在了“layout.inf”中,包括这个文件的大小(按字节计算),很明显,一个文件的压缩前和压缩后的大小是不会相同的。如果“txtsetup.sif”告诉安装程序“某个文件未被压缩”,那么安装程序就会在“layout.inf”中查找它的文件大小以确保这个文件未经修改或是损坏。如果文件大小与“layout.inf”中记录的不同,那么 XP 安装程序就会报错并停止安装。这个能够保证安装程序的安全性,以确定文件是否被修改过。它还能验证文件是否已被损坏,如果文件已被损坏,那么稍后安装时就可能会出现问题。如果以“_x”为关键字在“txtsetup.sif”进行搜索,那么就能找到所有未经压缩的 Windows 安装文件。

   有个很重要的事情就是,txtsetup.sif 并没有告诉安装程序应当从哪里获取安装文件。它唯一的功能就是把按照正确的文件名把文件复制到正确的目录中。

   举例说明:

   比如说,把 tweakui 集成到 Windows 安装文件中,但是不想使用无人值守的方式。那么利用 txtsetup.sif 可以很轻松地做到这点。
   第一步:下载 Tweak UI:下载后,用 WinRAR 把 tweakui.exe 提取出来,或是先安装这个程序再把windows\system32 中的tweakui.exe 复制出来;
   第二步:把 tweakui.exe 复制到 XP 安装文件所在的文件夹中,把 XP 安装盘上的文件复制到硬盘上,然后把 tweakui.exe 放到 i386 文件夹中;
   第三步:修改 txtsetup.sif 和 dosnet.inf,把以下行添加到 dosnet.inf 中:
d1,tweakui.exe
   把以下行添加到txtsetup.sif 中:
tweakui.exe = 1,,,,,,,2,0,0

   现在运行安装程序,dosnet.inf 会把 tweakui.exe 复制到 C:\$WIN_NT$.~LSi386 中,接着重启之后,就会进入文本安装模式了,而 txtsetup.sif 会把 C:\$WIN_NT$.~LSi386 中的 tweakui.exe 复制到 C:\Windows\System32 中,当整个安装进程完成之后,若要运行 tweakui.exe,那么只需转到 “开始”>”运行”>输入:tweakui,点击确定就行了。那为什么不在新添加的行中使用“_x”呢?这是因为 tweakui.exe 不是 XP 的初始安装文件,XP 不需要检查它(因为它未在 layout.inf 中进行定义).

   利用“Txtsetup.sif”和“xpinstall”集成安装打补丁

   将补丁以及xpinstall等相关文件准备好,放在同一文件夹下,并配置好“xpinstall.xml”(用xpinstall来安装补丁比较美观)。用WinRAR将这些文件做成自解压压缩文件“xp_patch.exe”,并在自解压选项的模式中指定解包到临时文件夹和全部隐藏,以及指定“xpinstall”为解压后运行的程序,用“makecab”压缩该文件,并把文件拷贝到i386文件夹中

   在 [SourceDisksFiles] 中添加:
xp_patch.exe = 1,,,,,,,1,0,0

   在“winnt.sif”中的 [GuiRunOnce] 添加:
Command0="%WinDir%\xp_patch.exe"

   从硬盘安装时,安装程序会先利用“dosnet.inf”中的定义把文件复制到“C:\$WIN_NT$.~LS”中。然后,安装程序才会利用 Txtsetup.sif 把这个文件夹中的文件复制到对应的文件夹中。因为只能利用“txtsetup.sif”把文件复制到“%windir%”文件夹下,所以它的用途有限,主要是用它来添加注册表预设和驱动。

   用“txtsetup.sif”来添加自定义的注册表条目

   每次文本安装模式即将结束时,安装程序就会利用“txtsetup.sif”中的某些定义来创建注册表(文件复制结束时)。如果是全新安装的话,安装程序就会按照“txtsetup.sif”的 [HiveInfs.Fresh] 区段中的定义来生成注册表。可以使用这个区段来添加自己的注册表条目。如果已经把注册表的设置保存为一个“.reg”文件的话,那么需要用“.inf”文件导入这些设置。将“.reg”文件重命名为“settings.reg”并将其置入 i386 文件夹中,将以下内容复制到一个新文件中并另存为 settings.inf,然后将其保存到 i386 文件夹中。

[Version]
Signature = "$Windows NT$"
DriverVer=07/01/2001,5.1.2600.1106
[update]
HKLM,"Software\Microsoft\Windows\CurrentVersion\RunOnce",
"MyUpdate",0x00020002,"%systemroot%\regedit.exe /s %systemroot%\system32\settings.reg"


   添加 inf 条目

   如果已经有了一个“.inf”文件,那么将其复制到 i386 文件夹中并将其重命名为“settings.inf”,并确保这个“.inf”文件中有个名为 [update] 区段,只有这个区段下的设置会被使用。

   可以用 makecab.exe 把 settings.inf 压缩成 settings.in_,但这只是可选的,添加方法是打开 txtsetup.sif 并转到[HiveInfs.Fresh],按以下添加一行:

[HiveInfs.Fresh]
AddReg = hivedef.inf,AddReg
AddReg = hivesys.inf,AddReg
AddReg = hivesft.inf,AddReg
AddReg = hivecls.inf,AddReg
AddReg = hiveusd.inf,AddReg
AddReg = dmreg.inf,DM.AddReg
AddReg = settings.inf,update

   再把以下 2 行添加到“txtsetup.sif”的 [SourceDisksFiles] 段下,如果要使用一个 .reg 文件,那么就要添加第二行,不需要的只需添加第一行:
settings.inf =1,,,,,,_x,3,,3
settings.reg =100,,,,,,,2,0,0

   把以下 2 行添加到“dosnet.inf”的 [Files] 段下,如果要使用一个“.reg”文件,那么就要添加第二行,不需要的只需添加第一行:
d1,settings.inf
d1,settings.reg

   现在开始安装 XP,当文本安装模式结束时就会导入注册表设置了,不需要使用无人值守安装方式。

   疑难解答

   文本模式安装程序所用的解释引擎不同于 SetupAPI,因此,处理相关的“inf”文件时要小心点以免设置无效。当编辑用于文本安装模式下用的“inf”文件时,应当遵循以下方针:

1 - 避免 strings. 就是那些在 [strings] 下定义的字符串,听说在文本安装模式下无法使用字符串;
2 - 总是使用引号,请尽可能地用引号括住设置;
3 - 避免缩写,在一般的 inf 中可以使用 0x1 或 0x1002. 而在文本安装模式下,以上值不起作用.;
4 - 避免不必要的空格,这个可能不是强制性的,但最好这么做;
5 - 无法确定能用文本安装模式 .inf 做什么事情? 那么请参考 hivesys.inf,hivesft.inf。

   以下是 5 个不同的“.inf”设置,1 是正确的,而其它的则无法工作且文本模式安装程序会报错:
1 - HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\KB826939","Installed",0x00010001,1

2 - HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\KB826939,"Installed",0x00010001,1
3 - HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\KB826939","Installed",0x10001,1
4 - HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\KB826939","Installed"",0x00010001,1
5 - HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\KB826939",Installed,0x00010001,1
1 –此行没有任何错误,注意第二段和第三段都用引号括住了,必须用引号将其括住;

2 –此行无法工作,因为第二段没用引号括住;
3 - 此行无法工作,因为 0x00010001 被搞成了 0x10001,在正常情况下没有问题,但是在文本安装模式下,安装程序就无法理解它的含义了,有所怀疑的话,请不要使用任何缩写;
4 - 此行无法工作,因为 Installed 后有两个引号;
5 - 此行无法工作,因为 Installed 没有被引号括住。

TOP

慢慢学习,谢谢提供!

TOP

不错!谢谢楼主!

TOP

发新话题