
windows7封装的驱动处理.doc
12页]《步步为营封 Win7》驱动处理步步为营, 驱动二、驱动处理" M7 w+ ]0 `) w2 k8 Z# c& S(一)简介) D6 B1 I7 u, A- A! F6 d c2 D2 s封装前都会对封装用计算机(源计算机)中的硬件设备驱动进行处理所谓处理,主要是卸载驱动,以及一些对驱动程序的调整等5 q5 R! W7 ^3 a0 B: @* V为什么要卸载源计算机的硬件设备驱动程序?理论上说,卸载源计算机的驱动不是必要的步骤,Windows 本身就具有对硬件的即插即用能力,例如你添加一块网卡、更换一块显卡系统都会自动帮你搜寻适合的驱动并尝试安装系统封装与部署技术是将源计算机中的系统封装后部署到其他计算机上,对系统来说并不认为是系统部署到了不同计算机中,而是发现了更多的即插即用设备,系统会为这些“多出来”的设备自动搜索与安装驱动) P1 Q) {8 n: K* `& J8 O) Q' i/ m: j但是事与愿违,只有实践才能检验理论在实际的系统封装与部署中,由于硬件不卸载带来的一系列的小问题层出不穷这些问题中有些的确是由于硬件商造成的,例如 XP 时代经典的声卡 ID 冲突问题;而也有一些也是由于 Windows 本身的功能造成的,例如出现 “本地连接 2”等。
再加之每个用户都不想要一个“不干净”的系统,所以驱动处理逐渐的成为了必须要做的事情 P4 e. g9 n( w. S3 n(二)原理: N. O$ k9 G6 ~0 m! X. s; p0 n% k) K处理驱动程序不是什么难事,估计没有人不会卸载驱动与更改驱动所以,在本文里我绝对不会和大家探讨怎么一步步的在设备管理器里点鼠标卸载驱动,这无异于浪费大家的时间和精力我们要讨论的是怎么自动的卸载这些驱动程序,毕竟大家都喜欢双击一个程序解决一切问题的舒适感今天我们要做的,就是要了解这种舒适感背后的技术每种硬件都有它们自己的 ID,要查看硬件的 ID 很容易,如下图:, B% t n0 e' t 1 g7 K$ [/ q$ J. p; w3 H3 y: c从图中可以看到,硬件不只有一个 ID,一般来说一个硬件的硬件 ID(HWID)会有 1~4个HWID 就像身份证号一样独立标识着每类硬件,所以我们很容易的可以想到会存在一组硬件与 HWID 的对应关系列表如何获得这个列表?打开注册表: 2 k, p- F1 o3 u! j4 l6 _0 I' L# B9 U3 y, A: F! hHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum) n0 e8 i, `+ @; X- U0 f' w7 [) x' y# R! _可以看到其下的分类,打开某一个分类,例如 Display,再选取下面的硬件子类,例如我计算机中的:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\DISPLAY\BNQ76D9打开后会发现其下有以设备编号命名的设备键,例如我计算机中的:. p9 G3 }! J2 g9 d) [* lHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\DISPLAY\BNQ76D9\5&5db3def&0&UID2684354598 }4 t1 U) L; G- _0 Z. E* B3 @) Z7 g a这其实是我的 BENQ 显示器,显示器的标识是“5&5db3def&0&UID268435459”,我们来看一下“5&5db3def&0&UID268435459”下的子键,找到“HardwareID”键,它的键值即是我的 BENQ 显示器的 HWID。
) p0 W- \) a( i当然您的显示器不可能完全与我的一样,但您可以在类似的位置找到您显示器的HWID如果您已经找到了,那么可以以此类推看看其他硬件的 HWID您会发现HardwareID 键包括多个 HWID 键值,就像我们在设备管理器里看到的一样这也就是说,我们可以通过注册表来获取本机所有硬件设备的 HWID 列表了!8 a; \/ N# G$ U5 t5 l" j, j1 X! a- J说到这里您大概会有如下两个问题了:% D& i8 R# h, P3 o5 f5 V1 |4 _/ E1、我们有了 HWID 又能做什么?有 HWID 就能自动卸载驱动吗?2、怎么获取这个列表,难道要我们手工一个个的复制粘贴吗? 9 o/ z$ N9 ^# U% u下面我们来逐步解决这些问题,我们要用到命令行工具的操作基础和一定的 AU3 基础,如果您这两方面比较薄弱,那么建议先多学习一下这方面的知识再来学习如下内容(三)DevCon.exe5 p: Q" n: o# Y/ x* C) X7 YDevCon.exe 是微软的可代替设备管理器的命令行工具虽然是个命令行工具,但实际上讲,它有着比设备管理器更强大的性能。
如果对此工具有更多兴趣,可以查阅微软官方支持: h* Q) n, @" t0 R" a7 lDevCon.exe 的说明(读取自微软):2 c0 _9 ^. I6 e% ~2 B9 ?0 x$ C }' M, e5 `+ p5 M) T! s: g" ^devcon.exe [-r] [-m:\\] [...]; A9 i# o+ z4 R* _( [; r" C9 ^-r 如果指定它,在命令完成后若需要则重新启动计算机 _, g% @! Y9 w) P: t; |4 I是目标计算机的名称是将要执行的命令(如下所示) t9 q$ P& X4 r: C3 C2 I... 是命令需要的一个或多个参数要获取关于某一特定命令的帮助,请键入:devcon.exe help classfilter,允许修改类别筛选程序classes,列出所有设备安装类别 W: K! c8 G* ?3 H B% v pdisable,禁用与指定的硬件或实例 ID 匹配的设备 [0 K4 r* [0 Y- N' vdriverfiles,列出针对设备安装的驱动程序文件6 D+ S2 g# g+ D: F# a4 I* rdrivernodes,列出设备的所有驱动程序节点。
[* u/ K6 W M% n" Senable,启用与指定的硬件或实例 ID 匹配的设备find,查找与指定的硬件或实例 ID 匹配的设备 [# G- z7 U9 O" N( I( Vfindall,查找设备,包括那些未显示的设备help,显示此信息 K W, g- `9 Q8 bhwids,列出设备的硬件 ID8 C0 Q9 k2 F4 `install,手动安装设备5 @" [' B& P1 q# L& qlistclass,列出某一安装类别的所有设备reboot,重新启动本地计算机remove,删除与特定的硬件或实例 ID 匹配的设备 I {6 Z# B) W. K& Yrescan,扫描以发现新的硬件resources,列出设备的硬件资源restart,重新启动与特定的硬件或实例 ID 匹配的设备stack,列出预期的设备驱动程序堆栈3 e2 i9 V% F9 m) istatus,列出设备的运行状态update,手动更新设备UpdateNI,手动更新设备,无用户提示 * _5 ^* m0 F$ ]+ i! @! Y! wSetHwID,添加、删除和更改根枚举设备的硬件 ID 的顺序。
i, g k2 ~. Z8 j; Y& K+ [) Y) j这的确是一个功能很多的工具,但今天我们只需要它的一个功能就可以了,毕竟我们只需要用 DevCon.exe 来卸载驱动我们来看 DevCon.exe 的“remove”功能,此功能的语法是:0 L; M7 ^3 {* Z0 |" [+ ZDevCon.exe remove [HWID]0 E7 o: m R3 L6 yDevCon.exe 的这个功能的主要目的,是移除使用本 HWID 的硬件驱动程序即,我们只要知道设备的 HWID,就可以通过 DevCon.exe 的命令行模式将其卸载例如我们要卸载一个 HWID 为“PCI\VEN_1002&DEV_4393&CC_0104”设备的驱动,则:' {! A! T! K# p% T5 sDevCon.exe remove PCI\VEN_1002&DEV_4393&CC_0104# \' I/ W9 q! ~这为我们自动卸载驱动做了最好的铺垫四)自动卸载1、自动获取 HWID 列表: y: F" K1 ]% W4 n! e3 i4 m" ~0 n. C6 q& i既然我们只要有硬件的 HWID 就能卸载该硬件的驱动,那么我们现在就要想办法怎么弄到计算机中所有硬件的 HWID 列表了。
前文已述,可以通过读取注册表的方法获取 HWID,那么我们就可以通过 AU3 实现2 M5 i) x8 {! E: aFunc _DrvUnins_ReadHwids()Local $HwidList[1][2], $p = 1$ X/ V0 B% I+ ]Local $RootKey = "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum"$ {& n* g, O c1 TLocal $i = 1/ C1 o0 j+ _+ gWhile 1& m1 p. X) ^6 C+ j8 f8 rLocal $SubKey1 = RegEnumKey($RootKey, $i)If @error = -1 Then ExitLoop2 p( [0 t; S' K1 S$SubKey1 = $RootKey & "\" & $SubKey1& e6 n. I( G) o4 F& M( H& H. T4 XLocal $j = 19 b" N/ `$ m" V) j# [3 q* z3 A- nWhile 1Local $SubKey2 = RegEnumKey($SubKey1, $j)If @error = -1 Then ExitLoop! E& _4 W5 y; w3 f0 [0 S) j2 z$SubKey2 = $SubKey1 & "\" & $SubKey2Local $k = 1; S, c6 K& n V4 M( VWhile 1* K, T1 P% R* b9 } e- i2 lLocal $SubKey3 = RegEnumKey($SubKey2, $k)" K( V [8 B, yIf @error = -1 Then ExitLoop& _: _6 F: e! Q' N6 `$SubKey3 = $SubKey2 & "\" & $SubKey3 Local $Cls = RegRead($SubKey3, "Class");; x0 f- k+ h; c) |* ~If $Cls "Keyboard" And _$Cls "LegacyDriver" And _; S" K m$ }; ?5 x: e) P4 ]1 M" |$Cls "" ThenReDim $HwidList[$p + 1][2]$HwidList[$p][0] = $SubKey3$HwidList[$p][1] = RegRead($SubKey3, "HardwareID")$p += 10 a, H; T" N# |# h( ]6 ^EndIf$k += 1WEnd$j += 15 p, a% b8 c5 h) Z) xWEnd* B7 j4 g, w" H+ `. N$i +=。
