1、自由天空出品,必属精品!Win7 时代是一个崭新的时代,从这里开始,我们所有人又回到了同一起跑线上。无论您以前是高手还是菜鸟、接触或没接触过这门技术,从 Win7 开始我们都是从 0 开始。步步为营封 Win7分为 6 章讲解 Win7 封装:0步步为营封 Win7引言:http:/bbs.skyun.org/viewthread.php?tid=20957If$Cls“Keyoard“And_$Cls“LegcyDrive“And_$Cls“ThenReDm$HwidLst$p+12$HwdList$p0=$SubKey3$HwdList$p1=RegRead($ubKey3,“Hardwr
2、eID“)$p+=1EndIf$k+=1WEn$j+=1WEnd$i+=1WEnRetrn$HwidistEndFunc ;=_DrvUins_Readwids函数_DrvUnin_ReadHwds的目的,即是列举本机 HWD列表。我做一下简单的说明:(1)本函数中通过三层循环,依次读取 Enum键下的设备类、设备子类、设备信息,最终获取每个设备的 HWD;(2)本函数最初创建一个$HwidLst数组,随着读取工作的进行而逐步扩大数据量,$HwdList数组中保存的即为本机 HWID列表;(3)在决定要读取某个设备的 HWID之前,还要判定一下该设备属于哪类设备,通过读取设备信息键值下的 Cl
3、ss键值实现;(4)在 Winows7下有 5类设备没必要卸载,分别是 PS2鼠标(Mous )、PS2键盘(Keboard)、系统设备(Sysem)、系统遗留驱动(LegacyDrivr)、硬件抽象层(HAL、或称计算机类型、或俗称电源管理)(Coputer),所以只要设备属于这 5类则不加入硬件ID列表。(5)本函数的返回值为一个数组,数组内容即为本机 HWID列表。2、整理 HWID列表同类硬件有相同的 HWD,例如两个相同的网卡,例如一个 CPU的多个核心。HWID是定位到硬件类,而不是像网卡的 MAC地址一样定位到每一个硬件,所以我们获得的 HWID列表中很大可能性的存在相同的 HW
4、D。虽然这些相同的 HWID不会影响我们的驱动卸载质量,但我们没必要增加这额外的重复工作,所以我们有必要整理一下我们刚才获得的 HWID列表。另外,由于我们刚才读取的HarwareID键值是一个“REG_MULT_SZ”类型的键值,所以我们读取的硬件 ID是这么一种形式:HWID1换行符HWID2 换行符 HWID所以我们在整理 HWID之前必须将刚才的数据进行一定的转化。Func_DrvUnis_TidyHids($HwdList)Locl$tHwidist1,$tp=1Locl$iFor$i=1ToUBound$HwidLst,1)-1Local$Hwids=$Hwidist$i1If$H
5、wids1ThenLocal$jFor$j=1ToUBound$tArr)-1ReDm$tHwidist$tp+1$tHidList$p=$trr$j$tp+=1NextEndfEndIfNex;_ArrayDisply($tHwdList)Local$i,$jFor$i=1ToUBound$tHwidLst)-2For$j=$i+1ToUBound($twidList -1If$tHwidLis$i“ThenReDm$Hwids$p+1$Hwds$p=$tHwidLst$i$p+=1EndIfNex;_ArrayDisply($Hwid)Return$HwidEndFunc ;=_DrvUi
6、ns_Tidywids函数_DrvUnin_TidyHwds的目的是整理刚才我们获得的 HWID列表,简单介绍一下:(1)本函数的第一个循环,将挤在一起的以换行符间隔的 HWID转化成独立的;(2)本函数的第二个循环,通过遍历将重复的 ID设置为空字符串;(3)本函数的第三个循环,将刚才整理过的 HWID列表重新填入 $Hwids,并跳过空字符串。(4)本函数的最终目的是返回一个整洁的本机 HWID列表。3、自动卸载的执行有了 HWID列表,再根据刚才说的 Devon.exe的命令行卸载驱动的功能,我们可以写一个自动根据 HWD列表调用 DevCn.exe卸载本机驱动的函数了。Func_Drv
7、Unis_Unins$Hwids,$DevConProressOn(“驱动卸载“,“正在卸载驱动.“)Locl$iLocl$Max=UBound(Hwids)-1Locl$per=1For$i=1To$Max$per=Int($ /$Max*100)ProgressSet(per,StingReplce($Hwds$i,“=_DrvUins_UninDrvUnins_Unis简介:(1)本函数有两个形式参数,一个是本机 HWID列表$Hwids,一个是 DevCn.exe程序的所在位置$DvCon;(2)本函数通过枚举 HWID列表中的每一个 HWID来卸载驱动程序;(3)本函数无返回值,目的
8、是写在本机所有驱动程序。好了,有了这三个函数,再加上 DevCn.exe的强大性能,我们完成了对本机驱动的自动卸载工作。(五)常见问题问答1、为什么执行完毕后我在设备管理器里还是看到很多驱动没有卸载掉?很多设备是正在被使用的,例如你的 CPU、显卡,这些设备如果被卸载掉会直接造成一系列的问题,所以 Widows对于这类设备的卸载有着特殊的方针。当硬件正在被使用时其驱动不可被卸载,但这些设备的驱动将在你重启计算机后自动卸载掉。所以无需担心这些设备的驱动。2、保留 PS2鼠标(Mouse)、PS2键盘(Keyoard)、系统设备(System)、系统遗留驱动(Legacyriver)、硬件抽象层(
9、Computer )设备驱动的目的是什么?(1)PS2鼠标和 PS2键盘,这是没有必要卸载的,你见过谁的机器因为换了个 PS2设备蓝屏或冲突吗?那为什么 USB的键盘鼠标要卸载掉,这个问题比较难解释,一是很多 USB键盘鼠标并不被识别为鼠标,而是被识别为人体学工程设备,在分辨上有些困难;二是某些USB键盘鼠标如果不被卸载,其残留的驱动在部署后对新接入的 USB设备有影响(实践中发现的问题,具体原因不明)。(2)系统设备,这是从 XP时代就公认不用卸载的,经过历年实践的检验,完全可以放心。(3)系统遗留驱动,这个翻译不是十分准确,LegayDriver 设备一般是以前安装过但现在并不在使用的,这
10、类设备的存在不会影响系统部署的成功率。(4)硬件抽象层(HAL),在上一章中已经叙述,Winows7的 HAL只分为 X86和 X64两个版本,所以我们无需对 HAL进行任何更改了。3、为什么没有将 PCIIDE控制器更改为“标准 PC IDE控制器” ?(1)Win6.x这代系统对驱动认证更为严格,而且很多驱动不是你关闭认证就可以真不需要认证的,大家有兴趣可以试试。这为自动更改“标准 PC IDE控制器” 行成了阻碍。(2)更改“标准 PCIIDE控制器 ”这个“行业标准”建立于遥远的 XP封装最初时代,这么做的目的已经被传的没有其本意了。经过理论求证和实践操作,一定程度上证明这种更改是没有
11、太大实际意义的,所以我个人一直倾向于将其卸载。大家可以再通过实践来进一步求证。4、这些代码是否完美?我不能保证代码的完美性,理论上说这只是一种自动卸载驱动的实现途径,如果大家有兴趣完全可以研究更强大的。但这里必须说一句,不管您有什么想法和理论,必须有长期实践为其撑腰。5、驱动卸载后我的分区看不到了?硬盘的分区也是靠驱动来实现的,系统通过驱动看到每个硬盘分区,而如果你在卸载驱动时某个硬盘分区没有正在被使用,则该分区的驱动会立刻被卸载,那么你就看不到这个分区了。这是个很正常的现象,就像卸载声卡后看不到声卡一样,无需担心硬盘分区内的数据,你只是暂时看不到他们了而已。6、手工卸载 VS自动卸载?如果你
12、实践过本章的代码,你可以很清晰的发现设备管理器里所看到的设备不是当前系统里的所有设备,所以即使你手工根据设备管理器卸载驱动,那么你卸载的是全部驱动吗?当然,自动卸载也不是完美的,人写的程序总会有错误,程序只会按照人的既定思路去做事,不会变通,但不应以此就判定自动卸载是垃圾的,虽然程序是人写的就会有错误,但程序是人写的就可以通过人去完善!7、驱动卸载要多干净?之前已经说过,驱动卸载不是必要的过程,而是为了避免细微的问题。而在以往的经历中我发现很多人过于苛求驱动的干净了,很多人往往为了一两个所谓的“幽灵硬件” 忧心忡忡,这其实是毫无必要的。你可以尝试为你的计算机更换一块网卡,你立刻就会看到你前网卡
13、的“幽灵硬件” 。“幽灵硬件”这种说法迷惑了太多人,这其实是 Winows的一种机制,目的是你再将这个设备换回本计算机时可以立刻启用,简化驱动搜索与安装过程。“幽灵硬件” 是一个具有一定偏颇性的叫法,无需过于担心它们的存在,但也别过于放心,某些时候它们的确能引起莫名其妙的问题。需要下载可以下载最后的附件。(见原帖)三步步为营封 Win7磁盘控制器(一)概念关于磁盘控制器驱动,这似乎是个老生常谈的问题了。从大概两年前我就一直在努力的纠正“SATA驱动、串口驱动”这些概念错误,但效果不佳,直至今日仍有部分技术人员将这些具有很大偏颇性的词语挂在嘴边,乃至误导更多的新手。所以今天我会再次重复强调一下“
14、磁盘控制器” 和“磁盘控制器驱动”的概念,新手请务必读懂,老手也有必要进行重温。什么是磁盘控制器?从字面上也大概可以看出,磁盘控制器的作用是管理和控制磁盘。这里的“磁盘”是一个广义的概念,泛指现在常用的机械硬盘和固态硬盘。磁盘控制器有集成于主板上的,也有独立的(如各类 SCSI卡),而且磁盘控制器是由来已久的,不是到“SATA时代”才开始出现的。我们这里一定要搞清楚三个问题:1、磁盘控制器与磁盘无关。系统是通过磁盘控制器来识别磁盘的,所以磁盘控制器上的磁盘无论是什么样子(无论是 PATA、SAA 、RAID 、SCSI以及等等)系统是绝对不会操心的,系统唯一关心的是它能否识别磁盘控制器,如果能
15、识别磁盘控制器那么磁盘控制器就会告诉系统怎么去管理磁盘。这就好像以为领导要找一份档案材料,他只要找的到档案室的管理员就可以,至于这个档案室管理员去什么样的档案柜上怎么去找档案材料,领导是无需担心的。就像系统无需操心磁盘类型是一样的。原版系统中(无论是 WINXP还是 WI7)都会包含一定量的磁盘控制器驱动,这些驱动可以应付部分磁盘控制器,而且一般而言,应付并口磁盘控制器是没有什么问题的。但随着时间的推移,随着新硬件和新磁盘控制器的推出,系统自带的磁盘控制器驱动会越来越显得单薄,这就是为什么我们在系统封装与部署时必须增补额外磁盘控制器驱动的原因。2、磁盘控制器驱动是针对磁盘控制器的。上文已述,系
16、统并不关心磁盘是什么样的,而系统只需要能够控制磁盘控制器就可以了。那么系统要怎么才能拥有对磁盘控制器的控制能力?答案就是通过驱动程序。系统通过磁盘控制器驱动获得对磁盘控制器的控制能力,从而控制磁盘。3、磁盘控制器工作模式与磁盘类型无关。现在硬盘的各种标识让人眼花缭乱,而各种关于磁盘控制器工作模式的描述又让人产生各种混淆,SATA、SATAII、AHCI、RAID以及等等,但我这里要说的是,你的硬盘是 SATA那么系统就真的把你的硬盘当做 SAA了吗?答案为否。刚才已经说了,系统通过磁盘控制器了解磁盘,而磁盘控制器又有着多种工作和控制模式。在 CMOS里我们可以看到对磁盘控制器的设置,大多磁盘控
17、制器拥有多种工作模式,例如 IDE模式、 AHCI模式、RAID 模式等等。如果你是一个 SATA硬盘,而磁盘控制器开启的是IDE模式,那么很遗憾,系统仅仅把你的硬盘当做普通 IDE硬盘来对待。建议,如果您的硬盘支持更高级的工作模式,请把 CMOS里的设置也相应调整以提高磁盘性能。说完这些概念,我请大家在今后不要再谈论所谓“SATA硬盘驱动” 了,这句话带有很大的错误性,并容易误导更多的新手!(二)磁盘控制器驱动封装用磁盘控制器驱动(俗称 SRS驱动)和即插即用磁盘控制器驱动还是有区别的。封装用磁盘控制器驱动属于系统关键设备驱动,随系统启动而启动,属于不可或缺的驱动,如果没有这个驱动系统就无法
18、控制磁盘控制器,从而无法操作磁盘,结果就是造成系统的宕机。即插即用磁盘控制器驱动则不同,它就像显卡和声卡的驱动一样,不安装仅仅是无法发挥硬件的最大效能而已,例如显卡驱动不装各种效果无法开启、声卡驱动不装会无声音等。但封装用磁盘控制器驱动和即插即用磁盘控制器驱动本身是无区别的,所以这只是同一种驱动的两种工作模式罢了。那么封装用磁盘控制器驱动是怎么工作的呢?1、系统启动时检测系统关键设备列表,并准备将这个列表中的设备启动起来,这个列表在注册表中的:HKY_LOCAL_MCHINESSTEMCntrolSet01ConrolCriicalDevceDatabse打开 CriticaDeviceDta
19、base键,其下是所有系统关键设备的硬件 ID。而我们看一个一硬件 ID名命名的键,一般包括 ClassUID和 Service子键,键值为拥有此硬件 ID的设备的设备所属类和所调用的系统服务。如果当前磁盘控制器存在于系统关键设备中,那么就根据磁盘控制器硬件 ID的 Service键去寻找它所需要使用的服务。而如果当前磁盘控制器不存在于系统关键设备中,则直接蓝屏宕机。2、使用磁盘控制驱动服务,系统的所有服务都位于:HKY_LOCAL_MCHINESSTEMCntrolSet01Serices当然也包括磁盘控制器驱动的服务。而如果当前磁盘控制器所需要的驱动服务并不存在,则直接蓝屏宕机。我们打开一
20、个磁盘控制器驱动的服务,这个服务包括很多子键,但其中较为重要的是ImgePath和 Start,它们分别规定了本服务要加载哪个驱动文件和本服务的启动方式。3、加载磁盘控制器驱动文件,启用磁盘控制器。由启动的磁盘控制器驱动服务决定加载哪个驱动文件,这些驱动文件一般都位于 C:WndowSystem32rivers中,而如果这个驱动文件在被加载的时候不存在,则直接蓝屏宕机。 通过如上描述,我们发现了如下一个过程:系统关键设备设备驱动服务设备驱动文件。(1)当前磁盘控制器是否属于系统关键设备,不属于则宕机,属于则根据系统关键设备列表中的相应描述,去寻找这个磁盘控制器所对应的驱动服务;(2)如果找不到
21、这个磁盘控制器所对应的驱动服务,则宕机,找得到则根据驱动服务中规定的驱动文件,去寻找这个磁盘控制器所对应的驱动文件;(3)如果找不到驱动文件,则宕机,找得到则使用此驱动控制磁盘控制器。这是个连贯的过程,哪一个环节出现问题,最终的结果都是宕机。(三)INF阅读术阅读驱动的 INF文件需要一定的经验积累,同样也需要一定的尝试和失败,所以我这里只能以制作封装用磁盘控制器驱动为目的的 INF阅读方法。以下我以 INELAHCI磁盘控制器驱动为例介绍,INTEL的驱动写的标准且简介,而且INEL驱动本身是最为稳定的,建议新手练手时选取 INTEL的驱动。1、 读出驱动所属类versionCatalogF
22、ile=aAHCI.ctSignature=“$INDOWSNT$“Class=hdcClassGuid=D36E96AE325-11C-BFC1-0002BE1318Provider=%INEL%DriverVer=0604/20098.9.0.123version段一般在驱动 INF的开头处,Clss即为本驱动所属类,而 Classuid是这个类的 GUID。驱动所属类是个重要的信息,在我们制作封装用磁盘控制器驱动的系统关键设备部分有着很重要的地位。2、读出哪些硬件 ID对应本驱动,而每个硬件 ID又使用了哪个驱动服务这一般需要去读两个段,一个是:Manufacture%INTEL%=IN
23、TE_HDC,nt86Manufacturer段规定了如下哪个段是用来记录驱动描述、所用服务、驱动 ID的。“INEL_HDC”是主段名,“,”后面的是附加段名。例如在这个描述中,如下可能有两个段包括驱动描述、所用服务和驱动 ID信息:INTEL_DC 段,或 INTEL_DC.ntx6段。INTEL的磁盘控制器是一体化的驱动,从 XP到 WI7用的驱动是相同的,所以它的Manfacturer段的内容比较简单。有些驱动针对不同系统是分开的,可能会有针对 XP和 WIN7的不同设置,请根据实际情况进行应变。另一个需要我们阅读的段十分重要,这个段也是由 Manfacturer段规定出来的:INTE
24、L_HDC.nx86%PCIVEN_808&DEV_261&CC_016.DevicDesc%=iator_Inst,PCVEN_8086DEV_268&CC_010%PCIVEN_808&DEV_271&CC_016.DevicDesc%=iaSor_Inst,CIVEN8086&DEV27C1&CC0106%PCIVEN_808&DEV_275&CC_016.DevicDesc%=iaSor_mobl_nst,PCVEN_808&DEV_275&CC_006%PCIVEN_808&DEV_281&CC_016.DevicDesc%=iator_Inst,PCVEN_8086DEV_282&
25、CC_010%PCIVEN_808&DEV_289&CC_016.DevicDesc%=iator_mobl_Ist,PCVEN_8086DEV_282&CC_010%PCIVEN_808&DEV_292&CC_016.DevicDesc%=iator_Inst,PCVEN_8086DEV_292&CC_010%PCIVEN_808&DEV_299&CC_016.DevicDesc%=iator_mobl_Ist,PCVEN_8086DEV_292&CC_010%PCIVEN_808&DEV_3A2&CC_016.DevicDesc%=iator_Inst,PCVEN_8086DEV_3A2&
26、CC_010%PCIVEN_808&DEV_3A2&CC_016.DevicDesc%=iator_Inst,PCVEN_8086DEV_3A2&CC_010%PCIVEN_808&DEV_3B9&CC_016.DevicDesc%=iator_mobl_Ist,PCVEN_8086DEV_3B2&CC_010%PCIVEN_808&DEV_3BF&CC_016.DevicDesc%=iator_mobl_Ist,PCVEN_8086DEV_3B2&CC_010%PCIVEN_808&DEV_3B2&CC_016.DevicDesc%=iator_Inst,PCVEN_8086DEV_3B2&
27、CC_010“=”前的部分是关于这个驱动的文字描述,我们可以在 INF的 Sting段里看到,不过这个对我们制作封装用磁盘控制器驱动基本没什么作用。“=”后的部分,“,”前是针对本硬件 ID哪些段对它进行了处理,例如“iator_Ins”,如下各段中凡以此开头的,都是针对本硬件 ID的处理,包括为本硬件 ID添加哪个服务。“=”后的部分,“,”后是磁盘控制器的硬件 ID,如“PCIVEN8086&DE_3B29&C_0106” 。这些磁盘控制器的硬件 ID将在随后被我们添加到封装用磁盘控制器驱动的系统关键设备中,而它们所对应的服务将是我们下一步阅读的目标。3、读出硬件所对应的服务。在刚才的 I
28、NEL_HDC.nx86段中,我们获得了本驱动可支持的硬件 ID列表,现在我们要把这些 ID对应的服务找出来。例如: %PCIVEN_808&DEV_3A2&CC_016.DevicDesc%=iator_Inst,PCVEN_8086DEV_3A2&CC_010规定了 PCIVN_8086&EV_3A22CC_0106的各类操作由 iaStor_Inst相关段决定,那我们就去寻找 iator_Int的相关段,直到找到:iaStor_InstServiceAddService=iaStor,%SPSVCNST_ASSOSERVIC%,iaStor_Servce_InstiaSor_Evento
29、g_Inst本段中决定要添加一个服务(AddService ),名为“iaStor”,添加方法由“iator_Serice_Ins”段决定,添加的事件日志由“iaStor_EvetLog_Int” 段决定。随后我们找到“iaStorServiceInst”段。iaStor_Servce_InstDisplayName =%*PP0600.DviceDes%ServiceType =%SEVICE_KRNEL_DRVER%StartType =%SEVICE_BOT_STARTErrorControl =%SEVICE_EROR_NORML%ServiceBinar =%12iaStorsysL
30、oadOrderGrop=SCS MinipotAddReg =iaSor_paraeters_AdRegDisplayName,服务的显示名,这对我们制作封装用磁盘控制器驱动没太大关系。ServiceType,服务的类型,这里是 “内核级驱动”。StartType,服务启动类型,这里是“随系统启动”。ErrorControl,报错类型,这里是“一般性报错”。 ServiceBinar,这个其实是驱动文件的位置,%12 代表 System32divers,则完整驱动文件路径为“System2drivesiaSto.sys” 。LoadOrderGrop,驱动所属的组。AddReg,这一般是为本
31、服务额外添加的注册表键和键值。通过阅读这些,我们知道了硬件 ID为“PCIVN_8086&EV_3A22CC_0106”的设备所需服务的基本概况,特别是我们得知了这个驱动服务所加载的驱动文件名称及位置。以此类推,解决其他的硬件 ID。从 INF里读到了这些信息,我们就可以着手制作 WIN7的封装专用磁盘控制器驱动了。(四)制作封装专用磁盘控制器驱动制作封装专用磁盘控制器驱动其实就是一个将 INF转成 REG的过程,曾经有过这种工具,但我个人并不建议大家使用。如果使用者并不明白 INF转 REG的真正原理,就很难了解这项技术的真正内在本质,更难于在出现问题时能够独立解决,这个技术的公共交流带来了
32、很多不便。本节内容我会和大家一起亲手将 INTELAHCI磁盘控制器驱动的 INF转成封装用的 REG文件,以让大家更加了解这项技术的本质。上文中,我们已经介绍了 INF阅读的基本方法,下面我们来对 INF进行一下转化。1、系统关键设备部分这部分的注册表键和键值遵守如下样式:HKEY_LOCAL_ACHINESYSTEMCntrolSe001CntroCriticalDviceDatbase件 ID) “ClassGUID”=”类的 GUID)”“Service”=“(对应的服务名)”硬件 ID,读取自 INTEL_DC.ntx86段,例如“PCIVEN8086&DEV2922&CC0106”
33、类的GUD,读取自 version段,“ClassGuid=4D36E9A-E325-1CE-BFC-08002B10318对应的服务名,读取自 INTEL_HC.ntx86段,由“PCVEN_8086&DV_2922&C_0106”对应的 iaStorInst段所派生的 iaStor_nst.Serices决定服务名,为 “iator”。那么“PCIVE_8086&DV_2922&C_0106”的系统关键设备部分注册表应该写为:HKEY_LOCAL_ACHINESYSTEMCntrolSe001CntroCriticalDviceDatbasePC#VEN_8086DEV_292&CC_01
34、0“ClassGUID“=4D36E9A-E325-1CE-BFC-08002E1018“Service“=“iastor“(注意硬件 ID中的“”变为“#”)以此类推,将其他硬件 ID的系统关键设备的注册表键和键值写完。2、驱动服务部分上文说过,驱动服务部分由 iaStor_Srvice_Ist来定,服务部分的注册表写起来比较容易,但要注意对应关系,即 INF中的名字和 REG中的名字不同。回顾一下 iaSor_Servce_Inst段,依据此段写封装用磁盘控制器驱动的驱动服务时,不是所有的部分都需要,我将它简化一下:iaStor_Servce_InstServiceType =%SEVIC
35、E_KRNEL_DRVER%StartType =%SEVICE_BOT_STARTErrorControl =%SEVICE_EROR_NORMLServiceBinar =%12iaStorsysLoadOrderGrop=SCS MinipotINF中带有“%” 的部分,在 INF的 Strig段有期对应的值,最简单的方法可以全文搜索一下两个“%”之间的内容,即会找到他们对应的值。如本例中,替换为值后为:iaStor_Servce_InstServiceType=1StartType=0ErrorControl=1ServiceBinar =systm32driersiaSor.sysLoadOrderGrop=SCS Minipot这些部分在注册表中分别对应:INF中的 ServceType对应注册表中的 Type;INF中的 StarType对应注册表中的 Star;INF中的 ErroControl对应注册表中的 ErrorConrolINF中的 ServceBinary对应注册表中的 ImagePah;INF中的 LoadrderGrop对应注册表中的 Group。而服务部分的一般样式为: