扩展使用.INF文件-制作免安装的绿色软件

10

EmEditor的绿化

下载EmEditor的安装文件emed404epx.exe后,发现用WinRAR可以打开,解压后,运行EmEditor,发现丢失了预定义的多种文本格式的语法配置,看来这样做不行,只好采用系统快照的方法了。请随我一步步进行,步骤如下:

1 扫描系统,制订系统快照。这里我仅仅记录当前系统的注册表(因为我认为EmEditor不会向系统目录拷贝文件,如果判断错误,就会导致“绿化”失败),运行ART(Advanced Registery Tracer),扫描一遍注册表。如图EmEditor_snap.PNG,不要关闭ART。

2 安装EmEditor。随便安装到哪里,反正一会就卸载。安装好后,如果需要的话,更改配置,或者配置新的文件类型,例如我就增加了NFO文件类型,设定和NFO文件相关联的字符集,这样可以用EmEditor直接察看NFO文件,不需要专门的察看工具了。

3 记录系统变化。再一次扫描系统,给系统作快照,从ART里面再一次扫描注册表,然后选择菜单命令Registry-〉compare here或者直接用键盘F10,比较结果如图EmEditor_compare.png,点击图中那个save to redo file的按钮,存储为EmEditor.reg文件,关闭ART。

4 复制并卸载。复制安装好的EmEditor目录到其他路径,然后卸载EmEditor程序。

5 分析。打开刚刚导出的EmEditor.reg文件,这是一个巨大的reg文件,单单是REG文件就有1兆多,不过不用担心。阅读注册表后,删除和EmEditor无关的注册表项后,如仅仅和资源管理器相关的注册表部分,发现剩下的注册表文件可以分成3个部分。一部分在位于注册表的这个路径[HKEY_LOCAL_MACHINESOFTWAREEmSoft],里面大部分不涉及路径,只有一项记录了EmEditor的路径,就是"ModulePath"="h:\EmEditor4\";还有一大部分在注册表的这个路径下面[HKEY_CURRENT_USERSoftwareEmSoftEmEditor v3],里面有很多项都涉及了EmEditor的路径,如"Tmpl"="h:\EmEditor4\template.xml";还有就是和EmEditor和txt文件后缀向关联的注册表设置,把EmEditor设置为IE中缺省的源代码察看工具的注册表设置以及注册COM组件EMEDSHL.DLL的注册表部分(和InProcServer32相关的就是)。

6 “绿化”。

6.1 把位于注册表路径路径[HKEY_LOCAL_MACHINESOFTWAREEmSoft]的内容存储到EmEditor_HKLM.reg文件中,把位于注册表路径[HKEY_CURRENT_USERSoftwareEmSoftEmEditor v3]的内容存储到EmEditor_HKCU.reg文件中,把剩下的内容首先除掉COM组件EMEDSHL.DLL的相关部分,然后存储到EmEditor_assoc.reg文件中。

6.2 把EmEditor_HKLM.reg文件和EmEditor_HKCU.reg文件中涉及到路径的注册表内容抽取出来,存储到EmEditorConf.reg文件。

6.3
绿色软件的制作,其中核心的一点就是获得原来软件的安装程序所做出的注册表的改变,然后把该变化导出为一个注册表文件.REG来进一步分析。如果导出的.REG文件不包括绝对路径,那么可以把该注册表文件和提取出的软件打包在一起做成绿色软件。如果导出的.REG文件中包含当前软件的绝对安装路径,那么就必须每次都要手工修改注册表中路径,是很麻烦的,降低了做成绿色软件的意义所在。而使用.INF文件,使用AddReg命令可以轻松容易的解决这个注册表路径的难题。
把EmEditor_assoc.reg文件和EmEditorConf.reg文件用INF的语法转换为INF文件,或者用一个免费小工具reg2inf.exe自动转换,然后把转换得到的EmEditor_assoc.inf文件和EmEditorConf.inf文件中的路径h:EmEditor4全部用%01%代替。下面是EmEditorConf.inf文件的内容:
[Version]
Signature="$CHICAGO$"
[DefaultInstall]
AddReg=EmEditorConf_AddReg

hklm,"SOFTWAREEmSoftEmEditor v3Common","ModulePath",,"%01%"
hkcu,"SoftwareEmSoftEmEditor v3ConfigC++","Tmpl",,"%01%template.cpp"
hkcu,"SoftwareEmSoftEmEditor v3ConfigCSS","Tmpl",,"%01%template.css"
hkcu,"SoftwareEmSoftEmEditor v3ConfigHTML","Tmpl",,"%01%template.htm"
hkcu,"SoftwareEmSoftEmEditor v3ConfigJava","Tmpl",,"%01%template.java"
hkcu,"SoftwareEmSoftEmEditor v3Configjavascript","Tmpl",,"%01%template.js"
hkcu,"SoftwareEmSoftEmEditor v3ConfigJSP","Tmpl",,"%01%template.jsp"
hkcu,"SoftwareEmSoftEmEditor v3ConfigPerl","Tmpl",,"%01%template.pl"
hkcu,"SoftwareEmSoftEmEditor v3ConfigPHP","Tmpl",,"%01%template.php"
hkcu,"SoftwareEmSoftEmEditor v3ConfigPython","Tmpl",,"%01%template.py"
hkcu,"SoftwareEmSoftEmEditor v3ConfigRuby","Tmpl",,"%01%template.rb"
hkcu,"SoftwareEmSoftEmEditor v3ConfigTeX","Tmpl",,"%01%template.tex"
hkcu,"SoftwareEmSoftEmEditor v3ConfigVBScript","Tmpl",,"%01%template.vbs"
hkcu,"SoftwareEmSoftEmEditor v3ConfigVBScript for EmEditor","Tmpl",,"%01%template.vbee"
hkcu,"SoftwareEmSoftEmEditor v3ConfigWindows Script","Tmpl",,"%01%template.wsf"
hkcu,"SoftwareEmSoftEmEditor v3ConfigXML","Tmpl",,"%01%template.xml"

6.4 写一个批处理文件install.bat,内容如下:
regedit EmEditor_HKLM.reg
regedit EmEditor_HKCU.reg
RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 .EmEditorConf.inf
regsvr32 EMEDSHL.DLL
RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 .EmEditor_assoc.inf

6.5 把install.bat,EmEditorConf.inf,EmEditor_assoc.inf,EmEditor_HKLM.reg,EmEditor_HKCU.reg5个文件存储到EmEditor的目录,删除其余的注册表文件。

6.6 根据安装步骤和install.bat,写出相应的卸载的批处理文件,这个比较简单。
经过测试后,EmEditor工作正常,也可以注释掉install.bat的最后2行语句,这样EmEditor就不会和系统关联,上面的步骤是在windows 2000上的,对于win9x也同样,而且win9x下面的EmEditor的配置文件和windows 2000的一样,仅仅是程序的版本不同。
把制作好的绿色的EmEditor拷贝到U盘上,需要用的时候,直接执行里面的install.bat文件就可以了(注意,要在EmEditor的目录运行批处理文件),不需要任何文件拷贝。

.INF文件是什么

.INF是 Device Information File 的缩写,是微软公司为供硬件设备制造商发布其设备驱动程序而发展的———许多硬件设备的驱动程序都是使用 .INF文件来安装的。.INF文件从 Windows3.X 时代就开始大量被使用了。  
.INF文件是一种具有特定格式的纯文本文件,我们可说它是一种安装脚本(SetupScript)。虽然 .INF 只是纯文本文件,但是当我们在文件管理器explorer对 .INF文件按鼠标右键後,如图inf右键.PNG,在右键菜单上就会出现“安装I”命令,这是因为微软公司已在其操作系统 Windows 中内置提供了 Setup API(可以解释.INF脚本文件),我们只需用文本编辑软件编写 .INF文件,便可完成大部份的安装工作,所以尤其是在软体的大小并不是很大的情况下,安装工作不是很复杂的时候,使用 .INF文件来进行安装工作将会是一个好选择。而且如果要安装设备驱动程序,.INF文件是目前唯一的选择。 可以用 .INF文件创建包括注册表条目和目的目录的自定义软件安装指令。.INF文件可以提供有限的平台独立性,并指定有限的软件依赖性。目前.INF文件最普遍的应用是为安装硬件设备的驱动程序服务的,本文的目的就是介绍 .INF文件的功能、结构、并提供了几个 事例来说明如何用.INF文件,如何扩展.INF文件的用途,比如制作绿色软件,仅供参考。

下面首先给出一个驱动程序的.INF文件的例子,如图usbinfpng.png,是我从Windows2000中抽取出来的用于Win98se的USB存储设备驱动的usbstor.INF文件,删除了大部分内容,紧紧保留了一个基本的.INF文件的框架。

.INF文件的格式

在图usbinfpng.png中,可以看到.INF文件是由许多节(Section)组成,与.INI文件类似,整个.INF文件由几个节组成,节名用方括号扩起来,如version 节,Manufacturer节,和Strings节等等。而每个节又由一系列的条目组成,每个条目都是是由一个键(Key)与一个值(Value)组成,都是“Key=Value”这样的形式,在这些节中定义的项目可以完成硬件的自动检测和软件(包括驱动程序)的安装。.INF文件中分号后面的字符串是注释。在一个 .INF文件中,所有跟随在分号(;)后的文字都会被视为注释。注释并不一定要在新行开始,可以在一行文字後面加入注释。

.INF文件案格式和作用如下所示:

[Version] 节: 包含对此 .INF文件的简短描述与此 .INF文件支持的设备类型的信息。用于确认 .INF文件的基本版本信息。任何.INF文件都必须 包括这个节。
在图usbinfpng.png中,[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] 节。对应到图usbinfpng.png中就是[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是此设备的硬件标志符,每个厂家的不同的硬件对应着不同的设备标志符。
对应到图usbinfpng.png中,就是这行语句“%GenericBulkOnly.DeviceDesc%=USBSTOR_BULK, USBClass_08&SubClass_02&Prot_50”等号左边是设备的描述,也就是设备名字是"USB Mass Storage Device",而等号右边的USBClass_08&SubClass_02&Prot_50是设备标志符,这个标志符是对应到一类的硬件设备,就是USB存储设备,操作系统检测到USB存储设备,安装相应的驱动的时候,就会从设备驱动的安装节即[USBSTOR_BULK]节开始安装驱动。可以看出来此.INF文件可以用于通用的USB存储设备"USB Mass Storage Device"的驱动程序的安装。
普通的安装软件的.INF文件中,不包括[Manufacturer] 与 [Manufacturer Name] 节,即使包含,也不会执行它们,这2个节仅仅用于硬件的设备驱动中起作用。

[Install] 节: 描述设备驱动程序与硬件设备的实际属性。它也定义了所有 [Install] 节的名称,在此定义的节中包含了安装该设备的信息和命令。默认情况下,会执行 [DefaultInstall] 节,在图inf右键.PNG中,Install操作就会执行[DefaultInstall] 节。[DefaultInstall] 节中包含指向其他节的指针,该节可用于指定要复制和删除的文件、注册表的更新、.INF文件的更新等。
对应到图usbinfpng.png中,[Install] 节就是[USBSTOR_BULK]节,其中要执行复制文件CopyFiles和添加注册表项目AddReg2种操作。
如果是安装普通的软件的.INF文件,可以通过鼠标右键菜单上的“安装”命令来安装(图inf右键.PNG),这个时候.INF文件必须包括[DefaultInstall]节,也可以包括其他的[Install]节,用RUNDLL32.EXE SETUPAPI.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 或 WindowsSystem)。 .INF文件通过[DestinationDirs]节来指定操作的目标路径,语法如下:
[DestinationDirs]
file-list-section =ldid[, subdir ]
DefaultDestDir=ldid[, subdir ]
[DestinationDirs] 节定义了 [file-list-section] 节中指定的操作(可以是 CopyFiles、RenFiles 或 DelFiles 节)的目标目录。DefaultDestDir命令可以为 .INF文件中的任何没有明确在[DestinationDirs]节中命名的CopyFiles、RenFiles或DelFiles节指定默认目标文件夹。
在.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 虚拟启动盘的主驱动器根文件夹
如图usbinfpng.png中,这行语句“USBSTOR.CopyList = 10, system32drivers”表明USBSTOR.CopyList这个文件列表中文件的目标路径是%windir%system32drivers,其中10代表Windows所在的文件夹,也就是说USBSTOR.CopyList这个文件列表中文件USBSTOR.SYS在安装驱动的时候将会被复制到%windir%system32drivers文件夹。而usbstor.inf这个文件将会被复制到17,也就是%windir%inf文件夹中。
[Strings] 节: 定义并列出上面所使用的可本地化字符串。如果某个特定的字符串会在 .INF文件中频繁地出现,那么在此节中为它们定义一个字符串变量将会是个好选择。如图usbinfpng.png中,语句MfgName="Microsoft",定义了[Manufacturer]节使用的MfgName变量(就是字符串"Microsoft")。
[FileCopy/Delete/RenameSection(s)] 节:列出要复制、删除或重命名的文件。 节的名字是CopyFiles,DelFiles,RenFiles。
[RegistryUpdateSection(s)] 节:指定在注册表中添加或删除的项目。 节的名字是AddReg,DelReg。
[IniFileUpdateSection(s)] 节:指定 .ini 文件的更新。链接将在该节中创建。 节的名字是 UpdateInis。

[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,就具备更加强大的功能。

.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。

.INF文件的功能

从前面的介绍,能够看出使用 .INF文件可以完成如下功能:
1 复制文件、删除文件、或重新命名文件。
2 新增或删除注册表(Registry)中的项目。
3 修改重要的系统设置文件(如 Autoexec.bat、Config.sys、.INI 等)。
粗看起来,似乎上面提到的第一个功能可以用批处理文件.BAT来完成,第二个功能可以通过注册表文件.REG来完成,第三个功能现在用得不多,不经常处理.INI文件了。这样说起来似乎.INF文件也没有太大的优势啊。这种看法是有问题的,下面我将会着重指出.INF在在这几个方面的应用,而不会仔细讲解.INF的语法。 下面要提到.INF文件优于别的工具的方面。

用.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,然后右击它 …

发表评论

电子邮件地址不会被公开。 必填项已用*标注