11/16/2008

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

作者:Climbing(xclimbing@msn.com)
版本:2.1b
创建日期:2004年12月6日
最后修改日期:2005年3月1日

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


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


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


2) 所谓的内核文件有两个,一个是hal*.dll,另一个是NT的内核文件(NT Kernel),这些文件都可以从%windir%\Driver Cache\I386目录下的*.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%\system32\hal.dll),将ntkrnlmp.exe复制到%windir%\system32目录下改名为 ntoskrnl.exe(DOS命令:copy /y ntkrnlmp.exe %windir%\system32\ntoskrnl.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 "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E966-E325-11CE-BFC1-08002BE10318}\0000" /f
REG.EXE DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E966-E325-11CE-BFC1-08002BE10318}\0001" /f
REG.EXE DELETE "HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E966-E325-11CE-BFC1-08002BE10318}\0000" /f
REG.EXE DELETE "HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E966-E325-11CE-BFC1-08002BE10318}\0001" /f
REG.EXE DELETE "HKLM\SYSTEM\CurrentControlSet\Enum\Root\ACPI_HAL" /f
REG.EXE DELETE "HKLM\SYSTEM\CurrentControlSet\Enum\Root\PCI_HAL" /f
rundll32.exe setupapi,InstallHinfSection %1_HAL 131 %windir%\inf\hal.inf
cls
echo.
echo 恭喜,计算机类型更改完毕,请重新启动计算机使更改生效,系统会重新扫描硬件!
echo 按任意键退出...
pause >nul
goto _quit


:_usage
cls
echo.
echo 错误:你没有指定计算机类型对应的硬件ID或者你指定的硬件ID不存在。
echo 用法: %0 ^<硬件ID^>
echo.
echo 计算机类

没有评论: