有人想知道我制作的自动检测OEM安装盘的原理,见
http://www.realqwh.cn/read-htm-tid-24705.html,其实原理很简单,拆穿了一点都不稀奇。
又有人希望我除了自动,加入手动的选择,我没有做因为我没有简单的办法去做,有菜单选
择和无菜单选择完全是两个思路。
所以我这两天常常思考,假如有菜单,利用我现在做的盘的原理,是否在传统的多合一思路
上加以一点小小的改进。目前的多合一大致都是VOL版加上几个OEM版,基于这个概念,我想
还是有所作为的。
先来了解下基本常识。
1. VOL和OEM版本不同的地方就在于4个OEMBIOS.*文件,加上PIDGEN.DLL和DPCDLL.DLL, 再
有一个SETUPP.INI
2. SETUPP.INI其实只在安装的开始部分会用到,等到输完序列号,这个文件就没有用了,
装完以后你在系统里根本找不到,所以这个文件我们可以基本忽略。
3. PIDGEN.DLL和DPCDLL.DLL在OEM相同版本中是一样的,但它会随SP的版本不同而不同,
也不排除补丁的更新而升级这2个文件。
4. OEMBISO.* 则在不同的OEM特征码中完全不同, 而且它们中的部分会有多个版本,新的
版本包括了旧版本的OEM 特征码的地址, 所以旧版本是完全可以废弃的。
5. OEMBIOS.*在同一个OEM 特征码中,它可以用于PRO,Home,MCE 版本,也可以用于其他语
言版本。它们之间完全通用。
6. OEM 序列号在PRO,Home,MCE中无法通用,但在SP各个版本中通用,唯一例外的很多专用
于SP2的OEM 序列号只能用于SP2中。除此之外,用算号器算出的OEM序列号却可用于包括SP2
的所有SP版本中。为什么会这样?我太菜不知道。
基于上述原理,我们先构建一个大略的思路如下:
先装VOL版,然后在安装过程中替换OEMBIOS.*文件,PIDGEN.DLL和DPCDLL.DLL,并且更改序
列号。PIDGEN.DLL和DPCDLL.DLL只能在安全模式下替换,值得高兴的是,安装过程中第一次
启动以后的环境等同于安全模式,我们完全可以在 T13 时间段替换我们任意想替换的文件
。
问题是我们如何得知用户在初始菜单中选择了何种OEM?初始菜单中的指向是不同的启动文
件,然后再次指向不同的I386文件夹,这就造成了传统的制作办法十分臃肿,维护很困难,
虽然最后会优化掉相同文件,但整个制作过程相当艰辛!
如果不用菜单,这个选择过程就是判断机器的OEM特征码,然后根据不同的OEM特征码安装不
同的OEM版本,但用了菜单的话, 事情就反而变得复杂了。难道只能回到老路上去?
让我们再想想,用了菜单的话,多个不同的启动文件是无法简化掉了,启动文件指向的软盘启动组看来也无法取消,那么很多的I386文件夹呢?我们是否可以把TXTSETUP.SIF 指向同一个I386,这样我们至少不会有庞大的文件,也不用修改TXTSETUP.SIF。
这样又回到了如何选择的问题,不判断机器的OEM特征码,也许我们可以判断别的东西。这
个别的东西是什么呢? 肯定是我们自己放进去的。我至少想到了一个变量,机器名,这个
变量大多数人不关心,比用户名之类的要好。
我简直太兴奋了,让我们开始实践吧。
假定我们在\WXPOEM\目录下有多个OEM文件,其中Compaq的OEM文件就放在\Compaq的子目录
下。然后我们就修改Compaq的启动组文件的WINNT.SIF里的机器名为Compaq。
在 T13 时间我们通过 CMDLINES.TXT 文件调用一个 INSTALL.CMD 文件来作判断。
部分代码如下:
复制代码- set cdrom=%~d0
- dir/b %cdrom%\wxpoem\|findstr /i %computername% >nul ||goto skipoem
- set oemdir=%cdrom%\wxpoem\%computername%
- REM 更新OEM文件到DllCache和SYSTEM32目录 共4个文件
- attrib -a -s -r -h %SYSTEMROOT%\System32\Dllcache\oembios.cat
- attrib -a -s -r -h %SYSTEMROOT%\System32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\oembios.cat
- COPY %OEMDIR%\*.* %SYSTEMROOT%\System32\Dllcache /Y>nul
- COPY %OEMDIR%\OEMBIOS.BIN %SYSTEMROOT%\System32 /Y>nul
- COPY %OEMDIR%\OEMBIOS.DAT %SYSTEMROOT%\System32 /Y>nul
- COPY %OEMDIR%\OEMBIOS.SIG %SYSTEMROOT%\System32 /Y>nul
- COPY %OEMDIR%\OEMBIOS.CAT %SYSTEMROOT%\System32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE} /Y>nul
- COPY %OEMDIR%\OEMINFO\*.* %SYSTEMROOT%\System32 /Y>nul 2>nul
- REM 更新激活验证文件(Dpcdll.dll、Pidgen.dll)
- EXPAND -R Dpcdll.dl_ %SYSTEMROOT%\System32\Dllcache>nul
- EXPAND -R Dpcdll.dl_ %SYSTEMROOT%\System32>nul
- EXPAND -R Pidgen.dl_ %SYSTEMROOT%\System32\Dllcache>nul
- EXPAND -R Pidgen.dl_ %SYSTEMROOT%\System32>nul
- REM 导入OEM注册表文件
- attrib +a +s +r +h %SYSTEMROOT%\System32\Dllcache\oembios.cat
- attrib +a +s +r +h %SYSTEMROOT%\System32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\oembios.cat
- REGEDIT -S OEM.REG
- :skipoem
- rem 以下可以编写其他命令
|
你可以把PIDGEN.DLL和DPCDLL.DLL,OEM.REG 三个文件放入特定的子目录,只要修改相应的
目录就可以。你也可以满足某些人渴望正宗序列号的愿望,而引用不同的OEM.REG,但在我
看来大可不必。
至于用COPY命令还是EXPAND命令,取决于这些文件的原始状态是否是压缩或者非压缩文件。
最后,你还可以修改机器名以防止重名。这个取决于你的编程技巧,我的处理是简单地加上
随机数就完事。
复制代码- set new_name=%computername%%random%
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v
- "ComputerName" /t REG_SZ /d "%new_name%" /f >nul
- reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV
- Hostname" /t REG_SZ /d "%new_name%" /f >nul
- reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "Hostname"
- /t REG_SZ /d "%new_name%" /f >nul
|
经过上述改进,你现在需要做的工作就是把本来修改TXTSETUP.SIF这个文件改为修改WINNT.SIF。把本来需要整个I386文件改为只需要十几M的启动组文件, 当然如果集成SATA之类的驱动,整个驱动组文件也需要改动的,但实际上只要改动一个,其他都可以拷贝。
粗浅想法,希能起到抛砖引玉的作用。
[ 此贴被quya在2008-07-03 20:34重新编辑 ]