2005-06-23

Windows 2000/XP/2003操作系统所支持的计算机类型(HAL)及相关内核文件的对应 关系、更改计算机类型的方法

作者:Climbing(xclimbing@msn.com)
版本:2.0
创建日期:2004年12月6日
最后修改日期:2004年12月7日

============
致谢
============
这篇总结文章的写成,主要参考了死性不改网友所发布的用于制做万能克隆的S&R&S系列中的相关批处理文件,在此表示万分感谢!
同时感谢无忧启动论坛的hyne网友(他已经沉默了很长时间了),他是万能克隆技术的先驱者之一,本文章引用了很多他制做的计算机类型选择程序(acpi.exe)中的说明,这里一并表示感谢。
感谢JUJUMAO论坛木鸟网友对本文作出的有益补充!

================
文章正文
================

1) 所谓的计算机类型(设备管理器 -> 计算机)是通常我们所说的计算机的电源类型,也就是Windows系统中的HAL类型。

2) 所谓的内核文件有两个,一个是hal*.dll,另一个是NT的内核文件(NT
Kernel),这些文件都可以从%windir%Driver
CacheI386目录下的*.cab文件中解出来,至于是哪个cab文件,当然跟你的系统打上的Service
Pack有关系,例如你打了SP4补丁,那么就是sp4.cab文件,如果没有打补丁,那就是driver.cab文件,详细的可以参考下面的批处理程
序。

3) 下面所说的死性不改名称是指死性不改网友给对应的文件起的名字,由于具有相当程度的普遍性,在这里一并列出,方便大家使用和参考。

4)
硬件ID,即HardwareID,是指某种计算机类型所对应的ID,这是一一对应的关系,更新某计算机的硬件ID就意味着同时更新计算机类型。后面将提
供使用devcon和rundll32两种办法更改硬件ID的方法,但这两种办法必须运行于当前的Windows环境下(而不是第三方的纯DOS环境
等)。

其对应关系如下:

计算机类型               HAL文件(死性不改名称)              Kernel文件(死性不改名称)    硬件ID(HardwareID)
Standard                 hal.dll(hal.chk)                   ntoskrnl.exe(sxbg.chk)        E_ISA_UP
ACPI Uniprocessor        halaacpi.dll(acpu.chk)             ntoskrnl.exe(sxbg.chk)        ACPIAPIC_UP
ACPI Multiprocessor      halmacpi.dll(acpm.chk)             ntkrnlmp.exe(ntos.chk)        ACPIAPIC_MP
MPS Uniprocessor         halapic.dll(mpsu.chk)              ntoskrnl.exe(sxbg.chk)        MPS_UP
MPS Multiprocessor       halmps.dll(mpsm.chk)               ntkrnlmp.exe(ntos.chk)        MPS_MP
Compaq SystemPro         halsp.dll(com.chk)                 ntkrnlmp.exe(ntos.chk)        SYSPRO_MP
ACPI                     halacpi.dll(acpi.chk)              ntoskrnl.exe(sxbg.chk)        ACPIPIC_UP

1、上述的七种计算机类型的详细名字顺序对应下面的七个名字(我假设你了解每种计算机类型代表哪一类的计算机)。
A. Standard PC
B. ACPI Uniprocessor PC
C. ACPI Multiprocessor PC
D. MPS Uniprocessor PC
E. MPS Multiprocessor PC
F. Compaq SystemPro Multiprocessor or 100% Compatible
G. Advanced Configuration and Power Interface (ACPI) PC

2、更改计算机类型的方法。

下面提供了四种更改计算机类型的方法,在后两种方法中,推荐使用RunDll32方式。

2.1 通过改名相关文件直接更改计算机类型。

首先大家要明确,上述的所有相关文件都应该是保存在%windir%system32目录下(这里的%windir%表示Windows的安装目录)。
选择某种计算机类型就要将相应的HAL部分的文件改名为hal.dll,而Kernel部分的文件改名为ntoskrnl.exe。以ACPI
Multiprocessor为例:将halmacpi.dll复制到%windir%system32目录下并改名为hal.dll(DOS命令:
copy /y halmacpi.dll
%windir%system32hal.dll),将ntkrnlmp.exe复制到%windir%system32目录下改名为
ntoskrnl.exe(DOS命令:copy /y ntkrnlmp.exe
%windir%system32
toskrnl.exe),由于更改的是Windows的内核文件,这种更改方法不能在Windows环境正在运
行的情况下进行,但可以在纯DOS环境下或者系统恢复控制台下运行。

2.2 在boot.ini中通过Windows系统的启动参数直接指定计算机类型。

如果你在恢复克隆时选错了计算机类型并且你知道应该使用什么样的计算机类型(或者你不知道该使用什么类型而想多试几种类型),那么你可以直接在
Boot.ini中指定要使用的计算机类型对应的Hal及Kernel文件,以ACPI Uniprocessor PC类型计算机为例:
multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Windows XP Professional(ACPI Uniprocessor)" /hal=halaacpi.dll /kernel=ntoskrnl.exe

对应死性不改网友的文件命名法,你可以这样写boot.ini的启动项:
multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Windows XP Professional(ACPI Uniprocessor)" /hal=acpu.chk /kernel=sxbg.chk

2.3 使用rundll32命令更改计算机类型。这种改法的前提是你能够进入Windows系统,例如你选择成了Standard PC,虽然能够进入系统,但计算机类型却不对的情况。
请将下面的代码保存为ChangeHalByRundll.cmd,用法请参考批处理中的说明。另外,批处理中使用的reg.exe是命令行方式操作注册
表的程序,在Windows XP/2003系统中内置了该程序,而Windows
2000中却没有,你可以将XP/2003下的reg.exe复制到2000中使用。
以下内容为程序代码:

@echo off
:: =========================================================================================================
:: ChangeHalByRundll.cmd  使用Windows的rundll32命令来更改计算机类型的批处理
:: 用法: ChangeHalByRundll <硬件ID>
::   <硬件ID>是指你想更改成的计算机类型所对应的HardwareID。
:: 例如:你想将计算机改成ACPI Uniprocessor类型,那么使用命令:ChangeHalByRundll ACPIPIC_UP
:: 计算机类型与硬件ID的对应关系如下:
:: 计算机类型            硬件ID(HardwareID)
:: Standard              E_ISA_UP
:: ACPI Uniprocessor     ACPIAPIC_UP
:: ACPI Multiprocessor   ACPIAPIC_MP
:: MPS Uniprocessor      MPS_UP
:: MPS Multiprocessor    MPS_MP
:: Compaq SystemPro      SYSPRO_MP
:: ACPI                  ACPIPIC_UP
:: =========================================================================================================

 

if %1#==# goto _usage
set HardIDs=E_ISA_UP ACPIPIC_UP ACPIAPIC_UP ACPIAPIC_MP MPS_UP MPS_MP SGI_MPS_MP SYSPRO_MP
echo %HardIDs% | find /i %1 > nul
if errorlevel 1 goto _usage

:_update
REG.EXE DELETE "HKLMSYSTEMCurrentControlSetControlClass{4D36E966-E325-11CE-BFC1-08002BE10318}�000" /f
REG.EXE DELETE "HKLMSYSTEMCurrentControlSetControlClass{4D36E966-E325-11CE-BFC1-08002BE10318}�001" /f
REG.EXE DELETE "HKLMSYSTEMControlSet001ControlClass{4D36E966-E325-11CE-BFC1-08002BE10318}�000" /f
REG.EXE DELETE "HKLMSYSTEMControlSet001ControlClass{4D36E966-E325-11CE-BFC1-08002BE10318}�001" /f
REG.EXE DELETE "HKLMSYSTEMCurrentControlSetEnumRootACPI_HAL" /f
REG.EXE DELETE "HKLMSYSTEMCurrentControlSetEnumRootPCI_HAL" /f
rundll32.exe setupapi,InstallHinfSection %1_HAL 131 %windir%infhal.inf
cls
echo.
echo 恭喜,计算机类型更改完毕,请重新启动计算机使更改生效,系统会重新扫描硬件!
echo 按任意键退出...
pause >nul
goto _quit

:_usage
cls
echo.
echo 错误:你没有指定计算机类型对应的硬件ID或者你指定的硬件ID不存在。
echo 用法: %0  ^<硬件ID^>
echo.
echo 计算机类型与硬件ID的对应关系如下:
echo.
echo 计算机类型            硬件ID(HardwareID)
echo Standard              E_ISA_UP
echo ACPI Uniprocessor     ACPIAPIC_UP
echo ACPI Multiprocessor   ACPIAPIC_MP
echo MPS Uniprocessor      MPS_UP
echo MPS Multiprocessor    MPS_MP
echo Compaq SystemPro      SYSPRO_MP
echo ACPI                  ACPIPIC_UP
echo.
echo 按任意键退出...
pause>nul
goto _quit

:_quit
set HardIDs=

 

2.4 使用devcon命令更改计算机类型。这个devcon命令也是由微软公司提供的更改硬件驱动的命令,但并没有随Windows系统提供这个命令,在网上可以找到下载。这种改法的前提也需要你能够进入Windows系统。
请将下面的代码保存为ChangeHalByDevcon.cmd,用法请参考批处理中的说明。
以下内容为程序代码:

@echo off
:: =========================================================================================================
:: ChangeHalByDevcon.cmd  使用devcon命令来更改计算机类型的批处理
:: 用法: ChangeHalBydevcon <硬件ID>
::   <硬件ID>是指你想更改成的计算机类型所对应的HardwareID。
:: 例如:你想将计算机改成ACPI Uniprocessor类型,那么使用命令:ChangeHalByRundll ACPIPIC_UP
:: 计算机类型与硬件ID的对应关系如下:
:: 计算机类型            硬件ID(HardwareID)
:: Standard              E_ISA_UP
:: ACPI Uniprocessor     ACPIAPIC_UP
:: ACPI Multiprocessor   ACPIAPIC_MP
:: MPS Uniprocessor      MPS_UP
:: MPS Multiprocessor    MPS_MP
:: Compaq SystemPro      SYSPRO_MP
:: ACPI                  ACPIPIC_UP
:: =========================================================================================================

 

if %1#==# goto _usage
set HardIDs=E_ISA_UP ACPIPIC_UP ACPIAPIC_UP ACPIAPIC_MP MPS_UP MPS_MP SGI_MPS_MP SYSPRO_MP
set nHardIDs=!E_ISA_UP !ACPIPIC_UP !ACPIAPIC_UP !ACPIAPIC_MP !MPS_UP !MPS_MP !SGI_MPS_MP !SYSPRO_MP
echo %HardIDs% | find /i %1 > nul
if errorlevel 1 goto _usage

:_update
devcon.exe sethwid @ROOTPCI_HAL�000 := %nHardIDs%
devcon.exe sethwid @ROOTACPI_HAL�000 := %nHardIDs%
devcon.exe sethwid @ROOTPCI_HAL�000 := +%1
devcon.exe sethwid @ROOTACPI_HAL�000 := +%1
devcon.exe update %windir%infhal.inf %1
cls
echo.
echo 恭喜,计算机类型更改完毕,请重新启动计算机使更改生效,系统会重新扫描硬件!
echo 按任意键退出...
pause >nul
goto _quit

:_usage
cls
echo.
echo 错误:你没有指定计算机类型对应的硬件ID或者你指定的硬件ID不存在。
echo 用法: %0  ^<硬件ID^>
echo.
echo 计算机类型与硬件ID的对应关系如下:
echo.
echo 计算机类型            硬件ID(HardwareID)
echo Standard              E_ISA_UP
echo ACPI Uniprocessor     ACPIAPIC_UP
echo ACPI Multiprocessor   ACPIAPIC_MP
echo MPS Uniprocessor      MPS_UP
echo MPS Multiprocessor    MPS_MP
echo Compaq SystemPro      SYSPRO_MP
echo ACPI                  ACPIPIC_UP
echo.
echo 按任意键退出...
pause>nul
goto _quit

:_quit
set HardIDs=
set nHardIDs=

 

有兴趣继续改进的同志,可以使用Choice命令或者Horst的WBAT命令做一个选择菜单让用户选择计算机类型,然后结合上面的批处理实现更人性化的
更改计算机类型的批处理程序!另外,对Hyne的acpi选择程序做一些简单修改,也可以实现Windows下图形界面的计算机类型选择。

3、从系统驱动cab文件中提取HAL相关文件的方法。

下面是死性不改网友从系统驱动文件中解压出上述相关各文件并使用死性不改命名法命名的批处理程序(这个批处理是从死性不改的S&R&S系
列中的regset.cmd中rip出来的,原则上适用于目前的所有Windows
2000/xp/2003系统,在原来的批处理基础上我做了适当的修改,主要是增加了提取sxbg.chk的内容):
以下内容为程序代码:

@echo off
set sys=%systemroot%system32
set bg=%systemroot%Driver~1I386
set chk=ntoskrnl.exe ntkrnlmp.exe ntkrpamp.exe hal.dll halacpi.dll halaacpi.dll halmacpi.dll halsp.dll halapic.dll halmps.dll
for %%i in (sp4 sp3 sp2 sp1 driver) do if exist %bg%\%%i.cab set fcab=%%i.cab&& goto expandf

 

:EXPANDF
if "%fcab%"=="" echo 系统的%windir%Driver CacheI386目录下没有对应的cab压缩包,这是本批处理运行所必需的文件 && goto check
for %%i in (%chk%) do expand %bg%\%fcab% -F:%%i %systemroot% >nul
if exist %systemroot%halsp.dll move %systemroot%halsp.dll %sys%com.chk >nul
move %systemroot%
toskrnl.exe %sys%sxbg.chk >nul
move %systemroot%
tkrpamp.exe %sys%
tkr.chk >nul
move %systemroot%
tkrnlmp.exe %sys%
tos.chk >nul
move %systemroot%hal.dll %sys%hal.chk >nul
move %systemroot%halacpi.dll %sys%acpi.chk >nul
move %systemroot%halaacpi.dll %sys%acpu.chk >nul
move %systemroot%halmacpi.dll %sys%acpm.chk >nul
move %systemroot%halapic.dll %sys%mpsu.chk >nul
move %systemroot%halmps.dll %sys%mpsm.chk >nul
goto _quit

:check
pause
goto _quit

:_quit

 

4、选择参考:(根据技术要求和网友的测试,仅供参考)
★Standard PC:适用所有主板,但对于新的主板可能造成不能关机。
★ACPI:主板芯片高于BX440低于或等于INTEL 815/SIS 735/NFORCE1/ALI/VIA KT400
       /VIA P4X266等,一般2003年以前的机子都支持这种模式。
★ACPI Uniprocessor PC:SIS 748/大部分INTEL 845系列/VIA KT600/nVIDIA nFORCE2
       或更新的产品,一般2003年以后的机子使用这种模式。
★ACPI Multiprocessor PC:主板支持HT并且安装了支持HT功能CPU的主板/安装了
       双CPU的早期入门级双CPU主板/入门级服务器及一小部分部门级服务器,例
       如INTEL 845GE L 845PE、865PE以上并使用P4 X.X HT CPU

5、=====================名词解释:========================
APM为Advanced Power Management(高级电源管理,此模式下ACPI未打开)
APIC为Advanced Programmable Interrupt Controller(高级可编程中断控制器,P4和Athlon XP的主板都支持此功能,可将15个IRQ中断扩展为23个,此模式下ACPI打开)
MPS为Multi Processor System(多处理器系统,此模式下ACPI未打开)


6、对各种计算机类型的解释
=================
Standard PC
=================
Standard PC 通用于任何标准PC、非ACPI、或非MPS,可以使386、486、Pentium2 350以下或其他类型的机器;所有系统均支持,但新主板支持ACPI并打开了ACPI的新主板使用这个可能导致不能软关机!

============================================================
Advanced Configuration and Power Interface (ACPI) PC
============================================================
一般用于2003年前买的电脑,目前最常见的类型,Win2000-2003
均支持ACPI用于带有单处理器的ACPI系统的单处理器主板,处于ACPI模式下的单处理器电脑,主板不提供APIC功能。如果选择这个启动发现左上角
光标一直闪不能进入系统请在bios中打开ACPI。主板芯片高于BX440低于或等于INTEL 815/SIS
735/NFORCE1/ALI/VIA KT400/VIA P4X266等,一般2003年以前的机子都支持这种模式。

==============================
ACPI Uniprocessor PC
==============================
一般用于2003年以后购买中高端电脑,Win2000-2003
均支持这中电源模式。用于安装了一个处理器的ACPI多处理器主板,处于ACPI模式下的双处理器电脑(主板不支持双处理器),或处于ACPI模式下的单
处理器电脑,主板提供APIC功能,如SIS 748/大部分INTEL 845系列/VIA KT600/nVIDIA
nFORCE2或更新的产品,一般2003年以后的机子使用这种模式。


==============================
ACPI Multiprocessor PC
==============================
一般用于2003年以后买的电脑,Win2000-2003
均支持这种电源模式。用于安装了多个处理器的ACPI多处理器主板,处于ACPI模式下的双处理器电脑(主板支持双处理器),如主板支持HT(超线程)并
且安装了支持HT功能CPU的主板/安装了双CPU的早期入门级双CPU主板/入门级服务器及一小部分部门级服务器,如INTEL 845GE L
845PE、865PE以上并使用P4 X.X HT CPU,2004年以后,这种机子比较普遍了。

==============================
MPS Uniprocessor PC
==============================
MPS single processor:APM模式下的双处理器电脑(主板支持双处理器),或APM模式下的单处理器电脑,主板提供APIC功能Win2000 WinXP Win2003 均支持。请核对主板或电脑说明书,慎重选择。

==============================
MPS Multiprocessor PC
==============================
MPS multiprocessor PC:APM模式下的双处理器电脑(主板支持双处理器)。
Win2000 WinXP Win2003 均支持。请核对主板或电脑说明书,慎重选择。


注意:以下两种计算机类型是针对不同于x86体系结构的计算机设计的,因此,在制做万能克隆时可以不必考虑这两种计算机类型,据猜测,这两种类型与Standard PC都不兼容。
这个推测来源于JUJUMAO论坛的木鸟网友。
============================================================
Compaq SystemPro Multiprocessor or 100% Compatible
============================================================
猜测这个应该是Alpha机器专用HAL,很少见了,呵呵,不知道该怎么写说明了。
Win2000 WinXP支持,不适用于Win2003。


============================================================
Silicon Graphics Visual Workstation
============================================================
SGI图形工作站专用HAL,很少见了,只有Win2000支持。


注:上述4、5、6的内容摘自hyne网友的计算机类型选择程序的说明文件中,感谢hyne网友!

没有评论:

发表评论