主题 : 探讨 N 合 1 XP安装盘的新思路
级别: 二分秋色
UID: 38503
精华: 0
发帖: 7
威望: 340 点
无痕币: 1217 WHB
贡献值: 0 点
在线时间: 38(时)
注册时间: 2008-06-16
最后登录: 2009-01-25

0 探讨 N 合 1 XP安装盘的新思路

管理提醒: 本帖被 秋无痕 执行加亮操作(2008-07-02)
有人想知道我制作的自动检测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 文件来作判断。

部分代码如下:

复制代码
  1. set cdrom=%~d0
  2. dir/b %cdrom%\wxpoem\|findstr /i %computername% >nul ||goto skipoem
  3. set oemdir=%cdrom%\wxpoem\%computername%
  4. REM 更新OEM文件到DllCache和SYSTEM32目录 共4个文件
  5. attrib -a -s -r -h %SYSTEMROOT%\System32\Dllcache\oembios.cat
  6. attrib -a -s -r -h %SYSTEMROOT%\System32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\oembios.cat
  7. COPY %OEMDIR%\*.* %SYSTEMROOT%\System32\Dllcache /Y>nul
  8. COPY %OEMDIR%\OEMBIOS.BIN %SYSTEMROOT%\System32 /Y>nul
  9. COPY %OEMDIR%\OEMBIOS.DAT %SYSTEMROOT%\System32 /Y>nul
  10. COPY %OEMDIR%\OEMBIOS.SIG %SYSTEMROOT%\System32 /Y>nul
  11. COPY %OEMDIR%\OEMBIOS.CAT %SYSTEMROOT%\System32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE} /Y>nul
  12. COPY %OEMDIR%\OEMINFO\*.* %SYSTEMROOT%\System32 /Y>nul 2>nul
  13. REM 更新激活验证文件(Dpcdll.dll、Pidgen.dll)
  14. EXPAND -R Dpcdll.dl_ %SYSTEMROOT%\System32\Dllcache>nul
  15. EXPAND -R Dpcdll.dl_ %SYSTEMROOT%\System32>nul
  16. EXPAND -R Pidgen.dl_ %SYSTEMROOT%\System32\Dllcache>nul
  17. EXPAND -R Pidgen.dl_ %SYSTEMROOT%\System32>nul
  18. REM 导入OEM注册表文件
  19. attrib +a +s +r +h %SYSTEMROOT%\System32\Dllcache\oembios.cat
  20. attrib +a +s +r +h %SYSTEMROOT%\System32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\oembios.cat
  21. REGEDIT -S OEM.REG
  22. :skipoem
  23. rem 以下可以编写其他命令


你可以把PIDGEN.DLL和DPCDLL.DLL,OEM.REG 三个文件放入特定的子目录,只要修改相应的

目录就可以。你也可以满足某些人渴望正宗序列号的愿望,而引用不同的OEM.REG,但在我

看来大可不必。

至于用COPY命令还是EXPAND命令,取决于这些文件的原始状态是否是压缩或者非压缩文件。

最后,你还可以修改机器名以防止重名。这个取决于你的编程技巧,我的处理是简单地加上

随机数就完事。

复制代码
  1. set new_name=%computername%%random%
  2. reg add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v
  3. "ComputerName" /t REG_SZ /d "%new_name%" /f >nul
  4. reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV
  5. Hostname" /t REG_SZ /d "%new_name%" /f >nul
  6. reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "Hostname"
  7. /t REG_SZ /d "%new_name%" /f >nul


经过上述改进,你现在需要做的工作就是把本来修改TXTSETUP.SIF这个文件改为修改WINNT.SIF。把本来需要整个I386文件改为只需要十几M的启动组文件, 当然如果集成SATA之类的驱动,整个驱动组文件也需要改动的,但实际上只要改动一个,其他都可以拷贝。

粗浅想法,希能起到抛砖引玉的作用。
[ 此贴被quya在2008-07-03 20:34重新编辑 ]
本帖最近评分记录:
  • 无痕币:+50(秋无痕) 原创内容
  • Total 0.038041(s) query 3, Time now is:05-11 16:21, Gzip enabled 粤ICP备07514325号-1
    Powered by PHPWind v7.3.2 Certificate Code © 2003-13 秋无痕论坛