第二章、硬件驱动的处理 * Z$ j; u1 K p5 T8 p! Q6 K. {6 V# y+ Q$ N* } 驱动程序是沟通操作系统和硬件的重要桥梁,通过驱动程序可以让操作系统识别更多的硬件,并使硬件发挥更好的性能。然而封装系统时我们必须要处理一下源计算机的硬件驱动,毕竟你无法确定目标计算机是怎么样的硬件环境。4 k; Y: g+ a5 d( E: d 处理好源计算机系统中的硬件驱动,可以拓展系统可部署的范围,减少因系统残留源计算机硬件和驱动信息造成的各种不良影响。虽然我没有在微软官方文档中看到必须处理源计算机硬件驱动的内容,但是根据长时间的实践与应用,在无数前辈们的基础上,我们总结出了一套切实可行的源计算机硬件驱动处理方法,这也是本章将要讲述的重点内容。 7 A: I, ?) Q. G6 N+ u, O7 V Windows操作系统是即插即用的,也就是说当出现新硬件时会自动去识别,如果可能则会自动安装该设备的驱动。所以即使我们不处理源计算机操作系统的驱动程序,当系统部署到新计算机时也会自动的识别新硬件,这也可能是为什么微软没有强调封装部署必须处理驱动程序的原因之一。但现实情况事与愿违,某些硬件驱动由于硬件ID的问题本身就存在冲突,某些时候有些驱动程序的残留会造成不良影响等等,这虽然不是Windows的原因而是驱动制作者的问题,但这些情况实实在在的影响了系统封装与部署。 8 X, P d. E0 F; F& ]$ d' C9 l) Z 我们要讲理论,可也要结合实践,实践才能出真知。本章将结合实践,讲讲在现实中我们应该怎么做。 + S% u- b5 a; x% _) P8 h7 U! y2 i, J- d0 k 2.1 硬件抽象层(HAL)的处理 . @& z: _8 e. Z; ^# W; f7 j $ G) s2 T ~# s3 O" Y$ J& i 2.1.1 什么是HAL 3 S5 [# m1 ]/ X1 y8 O9 l" A6 R* i/ f- t; R+ A6 U: t 硬件抽象层(Hardware Abstraction Layer,简称HAL),位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。简单说就是将硬件抽象化,以利于各种操作。5 e$ E/ o% k1 H6 J4 p. z0 V; F6 |- J 如果要查看当前计算机的HAL类型,打开设备管理器,展开“计算机”项目,即可看到当前计算机的HAL类型。HAL类型又被很多技术员称为“电源管理模式”或简称“电源”。 / q' }: @, E; a e : }$ y3 R! [0 @5 c2 ` Windows XP的HAL有很多种,有“Advanced Configuration and Power Interface (ACPI) PC”、“ACPI Multiprocessor PC”、“ACPI Uniprocessor PC”、“MPS Multiprocessor PC”、“MPS Uniprocessor PC”、“Standard PC”以及等等,种类很多,而且特殊的计算机硬件还会有特殊的HAL。Windows 2000、Windows Server 2003这些与Windows XP同属于Win5.x的操作系统亦是如此,HAL种类繁多。如果算上32位和64位系统的差别,那么HAL的种类至少还要乘2来计算。" \! X1 H ?) r. w9 u- S Windows 7的HAL就简单多了,分为了32位和64位系统两种:“ACPI x86-based PC”和“ACPI x64-based PC”,中文版本可能翻译了其名称,“ACPI基于x86的电脑”和“ACPI基于x64的电脑”。Windows Vista、Windows Server 2008这些与Windows 7同属于Win6.x的操作系统也是一样,HAL简单高效。某些特定机型还有个别专用的HAL,一般用户很少碰到,这里不再介绍。) K. m; n, n0 k% j: U/ P9 h P3 Y 根据微软文档的要求,封装与部署不可用于不同HAL的计算机。不同的HAL之间是不完全通用的,如果非要把不适合此计算机的HAL用于此计算机,那么很容易出现各种错误。最常见的例子,如部署有Windows XP某计算机在系统部署后无法正常关机和重启。5 k- X, d y; l: N$ T2 ?* g 那我们要如何处理HAL,特别是像Windows XP这种HAL非常多的操作系统,难道要手动改吗?莫着急,待我一一道来。 2 T+ Z$ x- q5 S6 U' p: D7 R i: u; m% e R+ b+ I; S+ g$ K 2.1.2 Windows XP HAL的处理 2 V$ r7 _7 T6 R. L9 _: ]* Z g; ~3 O$ I( t Windows XP的HAL最常见的也有6种,既然微软的要求是不同HAL的不可通用,那如果碰到封装时源计算机是A种HAL,而部署的目标计算机是B种HAL,怎么办?手动改?如果部署了500台计算机个个手动改?或者我就封装6种HAL的系统,碰到哪种HAL的计算机就部署哪个系统,这样做不是不可,但一是需要维护至少6个系统映像十分麻烦,二是对于一般的IT人员还真不一定分得开什么计算机用什么HAL。 / L9 |! ~0 V5 w& S 那能不能自动判断并自动更改HAL?勇于探索的前辈们还真找到了方法。这个方法源于Windows XP到Windows Vista之间的年代,那时有一个测试版本,叫做Windows Longhorn。Windows Longhorn虽然没有像现在Win6.x那样将HAL简化到只有32位HAL和64位HAL两种,但Windows Longhorn具备了自动判定计算机HAL并自动更改HAL的能力。由于Longhorn的引导方式与XP无异,都是使用NTLDR引导,所以前辈们完美实现了移植Longhorn的HAL判定到XP! 8 Z0 B8 f& Z* `3 s$ }) c8 @& z1 I( z & m' U, I3 ?6 T; x* F 要准备的文件和程序:7 K& Y) s3 v7 H (1)Windows Longhorn的NTLDR,位于Windows Longhorn的C盘根目录下,默认隐藏。4 S3 W/ x. X6 h m K* f% y$ U (2)SetACL.exe,用于更改部分注册表键值的权限。 3 ^( O" L/ |2 [9 U. c4 k$ k# g& S- e0 L7 Z, q9 Q: w 移植Longhorn的HAL自动判定到XP的方法: " \' T; V( _: ^( D5 f5 r9 {8 f* d, t- v 1、在当前系统中提取所需文件 E( J5 j# L6 M' l3 b- m' d" L. k0 G8 ` (1)如果系统安装过Service Pack,那么找到“C:\Windows\Driver Cache\i386”目录下与你当前Service Pack版本相同的.cab文件。例如当前系统是XP SP3,那么找“C:\Windows\Driver Cache\i386\SP3.cab”。如果系统没有安装过Service Pack,那么找“C:\Windows\Driver Cache\i386\driver.cab”。6 J- P8 v, l: _/ x3 l" O, p (2)新建一个文件夹,如C:\Windows\HalCache。 & K) G/ g9 P1 B0 \4 N/ ?; b (3)将(1)中找到的cab包中的halacpi.dll、halapic.dll、halmps.dll、halaacpi.dll、halmacpi.dll、hal.dll、ntkrnlmp.exe、ntkrnlpa.exe、ntkrpamp.exe、ntoskrnl.exe解压到C:\Windows\HalCache文件夹中。 ( ^6 _* x) H5 h (4)将hal.dll改名为halstnd.dll,将ntoskrnl.exe改名为ntkrnlup.exe。2 W {% ^; q+ ^. H: | (5)将C:\Windows\HalCache中所有文件复制到C:\Windows\System32中,覆盖同名文件。' r4 S. c1 O* u+ x# x! j (6)删除C:\Windows\HalCache。; Z4 d) K; l6 D$ s/ U * I I* w. v" P7 y6 v2 o& j/ S4 T 2、创建一个.inf文件$ V8 g1 Y. ~* A m 在C:\Windows\Inf文件夹(默认为隐藏属性)中创建一个名为dtecthal.inf的纯文本文件,写入如下内容: * p) T$ \# O; U/ i, S" f [Version] + t$ Z6 m! c% U _6 K1 F& L signature="$Windows NT$"+ p& Y" P( k _ w$ s# P( Y DriverVer=07/01/2001' J3 Y, |, a, o1 c K [hal]2 Q. T6 S2 H5 ] MPS_MP=halmps.dll% G' ]9 H2 f' ]+ R; R, o MPS_UP=halapic.dll % M6 N. M7 o- j6 W6 J: w E_ISA_UP=halstnd.dll & `& o" y5 Z- w& r8 L+ X ACPIPIC_UP=halacpi.dll) T$ Z0 r4 B' ^" r, z ACPIAPIC_UP=halaacpi.dll % S2 m# m0 `' ? ACPIAPIC_MP=halmacpi.dll) V) U+ v# \' W1 I [ACPIOptions] . @$ U" L/ {: i& G$ C9 `& \) [% g ACPIEnable=2 2 u0 |7 u( k% c" @ ACPIBiosDate=01,01,1999 / Q2 y+ d9 B; M # R' M1 I( b5 @1 ?/ w 3、修改启动文件, Q9 q- M6 a2 O( C C:\NTLDR和C:\Boot.ini均为具有隐藏属性的系统文件,且具有只读属性,请去掉这些属性后再做下列操作。8 g7 M8 p# x3 A6 p (1)备份XP的NTLDR为NTLDR_BAK(这个文件没有后缀名)。; e7 \. l# |- f# N0 _ (2)将Longhorn的NTLDR复制到C盘根目录下。3 x8 X% h7 `0 n0 b6 O (3)将Bootfont.bin改名为Bootfont.bin.bak,由于Longhorn的NTLDR加载XP的Bootfont.bin会出现乱码的情况,所以先改名,以备以后恢复。(如果你是英文版系统则没有Bootfont.bin,可略过此步骤) 8 ?5 P& j; C. t, s7 \, k (4)打开Boot.ini,找到XP的启动项,例如: 9 @% _. _/ N+ j5 s4 B multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect $ M) f( l8 ~; C! n! X2 F. u 在最后加入自动检测HAL的参数“/detecthal”:8 n0 ^# ?. T q2 k' U: \# i multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /detecthal ; v6 t# `4 w9 M! O y8 x ; O" i0 [+ H( L0 r% H% H 4、处理掉当前的HAL信息 * I1 m# g& K4 Z7 ` 一直有的方法说是把当前的HAL改成Standard PC可以提高兼容性,的确改成这个之后无论HAL是什么样的都不会出现如不能启动这种问题,至多是不能正常关机而已,可以说这个的确有很高的兼容性。但经过一段时间的观察、测试和应用,发现这种方法只是个权宜之计。我们既然有了HAL自动判定,且我们担心源计算机的HAL信息会影响系统在目标计算机中的部署,那么我们直接把当前计算机的HAL做掉好了。 3 ~ w F5 x7 p3 ?8 u0 Y 注册表中“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL”键和“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ Root\ACPI_HAL”键记录了当前计算机的HAL类型和信息,删除掉它俩就相当于做掉了目标计算机的HAL。 2 ^+ _: }; s2 I1 V7 M! `" {0 W( x 但这两个键都是有保护的,哪怕是Administrator用户都不能随便删除它们,幸好我们刚才准备了SetACL.exe。在命令提示符中切换到SetACL所在目录,运行如下命令:$ n: Z1 s$ M1 N$ D5 @# @; ?# A setacl.exe MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL /registry /grant everyone /full* { V8 r! I2 o/ ?7 L! K setacl.exe MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL /registry /grant everyone /full " _% q! Q; }( S# I8 i) \ 打开注册表编辑器,删除掉“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL”键和“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ Root\ACPI_HAL”键。 1 B% j3 |7 b9 S+ [& s& g& {打开设备管理器,可看到以前的“计算机”项目不见了,对,源计算机的HAL已经被我们删除了。当此系统部署到目标计算机时,由于我们已经移植了Longhorn的HAL自动判定,被删除的HAL注册表键会自动创建,且与目标计算机的HAL相匹配。5 o$ B: L: ^) f9 Z 经过一番折腾,我们成功的将Longhorn的HAL自动判定功能移植给了XP,由于这种HAL自动判定技术也完全来自于微软,所以正确率和稳定性毋庸置疑。至此,XP由于HAL类型造成的部署适用性问题完美解决。 ) G3 g, H: l+ e2 l, o 8 N4 V' t; o2 E, a 2.1.3 Windows XP HAL的自动处理 }4 `8 O# ?% j( \
: S) D! ~0 ~% a, ~/ u) V 虽然操作一次2.1.2中的过程并不复杂,但很多人为了达到完美封装经常要几遍甚至几十遍的调整系统并做系统封装测试,那么2.1.2中的过程就变的麻烦了。为了达到便利的操作,减少手工操作可能带来的错误,我书写了一段AU3程序来代替这个过程。* W/ A3 V! B# D. n0 Y: Y3 ~ 注意,为了方便大家的理解,我加入了足够的注释。但这仍是一段简单的代码,为的是给大家展示自动化过程,为大家提供一份参考而已,不具备各种纠错功能。仅算作是抛砖引玉吧。 j' h, Y% }2 Y2 ~4 j 9 f! @% V! G d% U+ A8 p# W8 Q5 [
- ;将要用到的SetACL.exe和Longhorn的NTLDR编译进此AU3程序
- #Region
- #AutoIt3Wrapper_Res_File_Add=NTLDR_Longhorn
- #AutoIt3Wrapper_Res_File_Add=SetACL.exe
- #EndRegion
- ;执行主函数,而后退出程序
- _DetecHAL_Main()
- Exit
- ;主函数,调用其他函数完成任务
- Func _DetecHAL_Main()
- ;(1)提取文件,改名,并放置到相应位置
- _DetecHAL_HalFiles()
- ;(2)创建dtecthal.inf及其内容
- _DetecHAL_HalInf()
- ;(3)修改Boot.ini并替换NTLDR
- _DetecHAL_HalBootFiles()
- ;(4)删除源计算机HAL信息
- _DetecHAL_KillCurrentHAL()
- MsgBox(0, "", "完成")
- EndFunc ;==>_DetecHAL_Main
- ;由cab包中提取文件,并修改与复制
- Func _DetecHAL_HalFiles()
- ;检测当前Service Pack版本
- Local $SP = @OSServicePack
- Local $Package
- If @OSServicePack = "" Then
- ;如果检测不到SP版本则使用driver.cab
- $Package = @WindowsDir & "\driver cache\i386\driver.cab"
- Else
- ;如果检测的到SP版本,则使用与SP版本相匹配的sp[SP版本].cab包
- Local $n = StringRight($SP, 1)
- $Package = @WindowsDir & "\driver cache\i386\SP" & $n & ".cab"
- EndIf
- ;使用extrac32.exe解压cab包中的文件
- Local $Extrac = @WindowsDir & "\System32\extrac32.exe"
- ;创建存放文件的临时文件夹
- Local $CacheDir = @WindowsDir & "\Temp\HalCache"
- DirCreate($CacheDir)
- ;运行extrac32.exe到cab包中解压所需文件
- RunWait($Extrac & " /e /y " & '"' & $Package & '"' & " " & _
- "halacpi.dll halapic.dll halmps.dll halaacpi.dll halmacpi.dll hal.dll " & _
- "ntkrnlmp.exe ntkrnlpa.exe ntkrpamp.exe ntoskrnl.exe" & _
- " /l " & '"' & $CacheDir & '"', "", @SW_HIDE)
- ;将hal.dll和ntoskrnl.exe改名
- FileMove($CacheDir & "\hal.dll", $CacheDir & "\halstnd.dll", 1)
- FileMove($CacheDir & "\ntoskrnl.exe", $CacheDir & "\ntkrnlup.exe", 1)
- ;复制临时目录下的所有文件到Syste32中,覆盖同名文件
- FileCopy($CacheDir & "\*.*", @WindowsDir & "\System32\*.*", 1)
- ;删除刚才使用的临时文件夹
- DirRemove($CacheDir, 1)
- EndFunc ;==>_DetecHAL_HalFiles
- ;创建dtecthal.inf,写入内容
- Func _DetecHAL_HalInf()
- Local $Inf = @WindowsDir & "\inf\dtecthal.inf"
- ;如果发现已存在同名文件,删除后重新创建
- If FileExists($Inf) Then FileDelete($Inf)
- ;写入Inf内容
- IniWrite($Inf, "Version", "signature", '"' & "$Windows NT[ DISCUZ_CODE_0 ]quot; & '"')
- IniWrite($Inf, "Version", "DriverVer", "07/01/2001")
- IniWrite($Inf, "hal", "MPS_MP", "halmps.dll")
- IniWrite($Inf, "hal", "MPS_UP", "halapic.dll")
- IniWrite($Inf, "hal", "E_ISA_UP", "halstnd.dll")
- IniWrite($Inf, "hal", "ACPIPIC_UP", "halacpi.dll")
- IniWrite($Inf, "hal", "ACPIAPIC_UP", "halaacpi.dll")
- IniWrite($Inf, "hal", "ACPIAPIC_MP", "halmacpi.dll")
- IniWrite($Inf, "ACPIOptions", "ACPIEnable", "2")
- IniWrite($Inf, "ACPIOptions", "ACPIBiosDate", "01,01,1999")
- EndFunc ;==>_DetecHAL_HalInf
- ;修改与Longhorn HAL自动判定相关的启动文件
- Func _DetecHAL_HalBootFiles()
- ;去掉系统目录下NTLDR的只读、系统和隐藏权限
- FileSetAttrib(@HomeDrive & "\NTLDR", "-RSH")
- ;将XP的NTLDR改名为NTLDR_BAK
- FileMove(@HomeDrive & "\NTLDR", @HomeDrive & "\NTLDR_BAK", 1)
- ;装载Longhorn的NTLDR到C盘根目录
- FileInstall("NTLDR_Longhorn", @HomeDrive & "\NTLDR")
- ;恢复NTLDR的只读、系统和隐藏权限
- FileSetAttrib(@HomeDrive & "\NTLDR", "+RSH")
- ;去掉系统目录下Boot.ini的只读、系统和隐藏权限
- FileSetAttrib(@HomeDrive & "\Boot.ini", "-RSH")
- ;读取当前的启动信息
- Local $s = IniRead(@HomeDrive & "\Boot.ini", "operating systems", _
- "multi(0)disk(0)rdisk(0)partition(1)\WINDOWS", "")
- ;如果当前的启动参数中不包括/detecthal,则为其添加此参数
- If Not (StringInStr($s, "/detecthal")) Then
- $s = $s & " /detecthal"
- IniWrite(@HomeDrive & "\Boot.ini", "operating systems", _
- "multi(0)disk(0)rdisk(0)partition(1)\WINDOWS", $s)
- EndIf
- ;恢复系统目录下Boot.ini的只读、系统和隐藏权限
- FileSetAttrib(@HomeDrive & "\Boot.ini", "+RSH")
- ;如果系统目录下村咋诶Bootfont.bin则执行如下操作
- ;(英文系统没有Bootfont.bin)
- If FileExists(@HomeDrive & "\Bootfont.bin") Then
- ;去掉系统目录下Bootfon.bin的只读、系统和隐藏权限
- FileSetAttrib(@HomeDrive & "\Bootfont.bin", "-RSH")
- ;将Bootfont.bin改名为Bootfont.bin.bak
- FileMove(@HomeDrive & "\Bootfont.bin", @HomeDrive & "\Bootfont.bin.bak", 1)
- EndIf
- EndFunc ;==>_DetecHAL_HalBootFiles
- ;删除源计算机系统的HAL信息
- Func _DetecHAL_KillCurrentHAL()
- ;确定临时目录的存在性
- DirCreate(@WindowsDir & "\Temp")
- ;装载SetACL.exe到临时目录
- FileInstall("setacl.exe", @WindowsDir & "\Temp\setacl.exe", 1)
- ;去掉ACPI_HAL的权限保护
- RunWait(@WindowsDir & "\Temp\setacl.exe" & " " & _
- "MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL " & _
- "/registry /grant everyone /full", _
- "", @SW_HIDE)
- RunWait(@WindowsDir & "\Temp\setacl.exe" & " " & _
- "MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL " & _
- "/registry /grant everyone /full", _
- "", @SW_HIDE)
- ;删除刚才装载的SetACL.exe
- FileDelete(@WindowsDir & "\Temp\setacl.exe")
- ;删除ACPI_HAL键
- RegDelete("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL")
- RegDelete("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL")
- EndFunc ;==>_DetecHAL_KillCurrentHAL
-
复制代码 8 ~% i6 G4 V9 E- S) J. h
, ~3 h- j) K7 F" P* n3 y 2.1.4 Windows 7 HAL的处理 3 y7 m3 M0 _6 a1 a+ l! u ! S. i; L* E: ?/ Q 在2.1.1节中已述,Win7的常见的HAL种类只有x86(32位)和x64(64位)两种:“ACPI x86-based PC”和“ACPI x64-based PC”,这为我们的封装与部署操作提供了很大的方便。我这里对x86和x64两种系统的适用范围再啰嗦几句: 0 p' t6 g! T5 w. j1 t7 X0 j* { c - R. p% B. z9 ^+ M6 L _! o! i' f 早期的CPU大多数是32位的,拥有32位CPU的计算机只能安装x86的操作系统。绝大多数软件都是基于32位系统设计的,所以一般而言32位系统对软件的兼容性要优于x64的操作系统。但是32位操作系统的最大内存支持仅有约3.25G(拥有内存扩展寻址的x86服务器版Windows除外),x86的Windows 7虽然会显示您所有的内存容量,但最大仅能使用约3.25G。, Z$ i& h5 x5 H( A6 j 而现今的CPU大多数是64位的,64位的CPU兼容32位,这也就是说拥有64位CPU的计算机可以部署x86的操作系统,也可以部署x64的操作系统。x64的操作系统可以发挥64位CPU的最大潜能,支持64位的应用程序,且兼容32位程序——绝大多数为32位的应用程序可以运作于x64操作系统下(某些古老的、国产的、与驱动相关的应用程序除外)。x64的操作系统拥有更大的内存寻址范围,理论上支持2的64次方约16384PB(单位:PB>TB>GB>MB)。对普通用户而言,如果您使用的是x64的操作系统,基本不用考虑内存支持的上限是多少。1 [8 e- } H6 N& `# X* C 总结一下,一般而言: $ J8 R: D9 l, ]5 w9 i (1)如果CPU是32位的,只能部署x86的操作系统; 1 {2 H/ n% ^8 y/ T (2)如果CPU是64位的,可以部署x64的操作系统,亦可以部署x86的操作系统;+ [: F# X, h% C r0 r/ y4 `9 z* n (3)x86的操作系统只能运行32位软件,但兼容性较高; Z( q* {7 b$ J. P) o (4)x64的操作系统可以运行64位软件,亦可以运行32位的软件,但对某些32位的软件可能不支持;7 |( t& o) S7 l* U; i6 u" G }' n (5)x64操作系统可支持的内存上限高于x86操作系统;. p( n( q) C; I5 v2 { (6)上述内容对windows操作系统普遍有效,不只针对Windows 7。2 c* j8 @. u6 C- t ) ]' k' U2 W+ V7 L# c4 b# p. C 说完了x86与x64的操作系统,我们再来回头看看Win7的HAL。在排除其他因素(如磁盘控制器驱动、兼容性问题等)的影响后: + r; |7 n$ q% }# ` (1)如果我们封装了具有x86 HAL的Win7操作系统,可以部署于所有拥有32位和64位CPU的计算机。但只支持3.25G内存,只支持32位软件。+ ^+ Z5 E7 k: N (2)如果我们封装了具有x64 HAL的Win7操作系统,只可以部署于拥有64位CPU的计算机。支持更大的内存,同时支持32位和64位软件。3 J0 [5 X+ y4 c$ N3 v6 B 这样看,只要我们避免将拥有x64 HAL的win7系统映像部署于32位的计算机中就可以了,不用像WinXP时那么麻烦了!
|
|