另外INI其實(shí)是依據(jù)某種定義規(guī)范的文本文件,編輯過程極易出錯(cuò)并由此導(dǎo)致系統(tǒng)故障,為了克服這些問題,在Windows 95及其后的版本中,Window系統(tǒng)都無(wú)一例外的采用了注冊(cè)表機(jī)制,并將原來由多個(gè)INI組成的軟硬件配置信息統(tǒng)一到了一起,形成一個(gè)數(shù)據(jù)庫(kù),那就是注冊(cè)表。注冊(cè)表是一個(gè)保存系統(tǒng)、軟件設(shè)置數(shù)據(jù)的數(shù)據(jù)庫(kù),而“注冊(cè)表編輯器”只是對(duì)于整個(gè)系統(tǒng)的讀取/修改工具。
既然注冊(cè)表是一個(gè)數(shù)據(jù)庫(kù),那么這個(gè)數(shù)據(jù)庫(kù)文件在那里呢?其實(shí),難怪不少剛接觸電腦的朋友誤以為regedit.exe就是注冊(cè)表,這是由于對(duì)注冊(cè)表數(shù)據(jù)庫(kù)的組成不清楚而造成的。Windows 98注冊(cè)表的數(shù)據(jù)文件主要由System.dat和User.dat這兩個(gè)文件組成,并保存在C:\Windows目錄下,其中System.dat存儲(chǔ)的是系統(tǒng)和硬件相關(guān)的配置,而User.dat則保存軟件配置和用戶配置,Windows 2000/XP注冊(cè)表的數(shù)據(jù)文件主要存儲(chǔ)在%Windir%\System32\config目錄中的Default,Sam,Security,System,software和Userdiff等6個(gè)文件中,除此之外,還有部分?jǐn)?shù)據(jù)保存在用戶的配置文件目錄中,比如Window 2000/XP中的Administrator的部分注冊(cè)表數(shù)據(jù)就保存在C:\Documents and Settings\Administrator目錄的Ntuser.dat文件中,所以只需要Administrator登陸系統(tǒng)后其目錄下的NTUSER.DAT就不能被刪除,因?yàn)樗呀?jīng)被加載到注冊(cè)表中了。
注冊(cè)表分支和其相對(duì)應(yīng)的數(shù)據(jù)庫(kù)文件。
HKEY_LOCAL_MACHINE\SYSTEM這個(gè)分支相對(duì)應(yīng)的文件就是%Windir%\System32\config目錄中的System。
HKEY_LOCAL_MACHINE\SOFTWARE這個(gè)分支相對(duì)應(yīng)的文件就是%Windir%\System32\config目錄中的software。
這2個(gè)分支和封裝的關(guān)系比較密切。HKEY_LOCAL_MACHINE\SYSTEM是記錄計(jì)算機(jī)的硬件信息,每個(gè)驅(qū)動(dòng)安裝后的信息都會(huì)被系統(tǒng)記錄在這個(gè)分支中的。做封裝時(shí)所預(yù)先加載硬盤控制器驅(qū)動(dòng)的注冊(cè)表信息也是保存在這個(gè)分支的。HKEY_LOCAL_MACHINE\SOFTWARE這個(gè)分支保存的是軟件信息,包括windows自身的一些信息。明白這個(gè)對(duì)應(yīng)關(guān)系,可以應(yīng)用于不用重新封裝而再次直接修改定制已經(jīng)生成的映像。
驅(qū)動(dòng)信息是記錄在HKEY_LOCAL_MACHINE\SYSTEM這個(gè)分支中,具體的關(guān)系又是如何的呢?自己沒找著微軟官方的資料,以下說明全是自己猜測(cè)出來的。僅僅代表個(gè)人觀點(diǎn)!
HKEY_LOCAL_MACHINE\System 注冊(cè)表分支包含用于 Windows XP 啟動(dòng)過程的三個(gè)控件組: ControlSet001、ControlSet002、CurrentControlSet。 每個(gè)注冊(cè)表項(xiàng)都有相同的子項(xiàng)結(jié)構(gòu)。 Windows XP 提供 ControlSet001 的副本,名為 CurrentControlSet,這樣,應(yīng)用程序就不必考慮在啟動(dòng)過程中用幾號(hào)控件組。 “Current”數(shù)據(jù)項(xiàng)目表示 Windows XP 在這次啟動(dòng)過程中使用的控件組。
“Default”數(shù)據(jù)項(xiàng)目表示 Windows XP 在下次啟動(dòng)時(shí)將使用的控件組,它與這次啟動(dòng)使用的控件組相同。
“LastKnownGood ”數(shù)據(jù)項(xiàng)目表示您在啟動(dòng)過程中選擇“最近一次的正確配置”時(shí) Windows XP 將使用的控件組。
“Failed”數(shù)據(jù)項(xiàng)表示 Windows XP 在其中保存失敗啟動(dòng)產(chǎn)生的數(shù)據(jù)的控件組。 此控件組在用戶第一次調(diào)用“最近一次的正確配置”選項(xiàng)之前并不實(shí)際存在。 操作系統(tǒng)每成功啟動(dòng)一次,它都將 CurrentControlSet 和 ControlSet001 中的數(shù)據(jù)復(fù)制到 ControlSet002 中。 這樣,在對(duì)配置進(jìn)行更改時(shí),所作的更改就會(huì)寫入 CurrentControlSet 和 ControlSet001 中。 如果下次啟動(dòng)時(shí)出現(xiàn)問題,選擇“最近一次的正確配置”將命令 Windows XP 使用 ControlSet002 中的數(shù)據(jù),該數(shù)據(jù)代表系統(tǒng)在上次正確啟動(dòng)時(shí)的狀態(tài)。 請(qǐng)注意,Windows XP 直到用戶成功登錄之后才將啟動(dòng)視為“正確”。
首先說這個(gè)HKLM\SYSTEM\CurrentControlSet\Enum這個(gè)分支。
注冊(cè)樹包含關(guān)于系統(tǒng)中設(shè)備的信息。PNP管理器為每個(gè)設(shè)備創(chuàng)建了一個(gè)子鍵, 子鍵的名字形式如同
HKLM\SYSTEM\CurrentControlSet\Enum\enumerator\deviceID . 在每個(gè)這些鍵下是一個(gè)子鍵,代表了系統(tǒng)中存在的設(shè)備實(shí)例。這個(gè)子鍵,眾所周知是設(shè)備的硬件鍵(或,設(shè)備鍵) ,有的信息如設(shè)備描述,硬件ID號(hào),兼容ID號(hào),資源需求等等。
Enum樹是被操作系統(tǒng)保留自己用的,而且它的規(guī)劃是變化的主題。驅(qū)動(dòng)和用戶模式安裝
組件使用系統(tǒng)支持的函數(shù),如同IoGetDeviceProperty和SetupDiGetDeviceRegistryProperty
,去獲得這個(gè)樹的信息。驅(qū)動(dòng)和安裝應(yīng)用程序不能直接訪問Enum樹。當(dāng)你調(diào)試驅(qū)動(dòng)的時(shí)候,你可以使用注冊(cè)表編輯器來直接看Enum樹。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum這個(gè)分支中是保存著機(jī)器設(shè)備和信息。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI為電源管理。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI_HAL硬件抽像層。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY顯示設(shè)備(顯示器)。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID人體工學(xué)輸入設(shè)備。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE IDE設(shè)備
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI 掛在PCI總線上的設(shè)備包括(顯卡,聲卡……)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCIIDE IDE控制器
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root 虛擬設(shè)備和物理的非即插即用設(shè)備。
一個(gè)硬盤控制器驅(qū)動(dòng)如果被正確安裝到機(jī)器上,那在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI上就可以找到其相關(guān)的注冊(cè)表信息。這個(gè)信息是系統(tǒng)自動(dòng)處理生成的。所以這邊也可以作為,清除多余的硬盤控制器驅(qū)動(dòng)驅(qū)動(dòng)的判斷條件之一。在這邊能找著相應(yīng)的信息的SRS驅(qū)動(dòng)就應(yīng)該被保留的,沒找著的可以被刪除。那些沒有被使用到的硬盤控制器驅(qū)動(dòng)驅(qū)動(dòng),系統(tǒng)也會(huì)將相對(duì)應(yīng)的信息記錄在: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root 這個(gè)分支中。因?yàn)橄到y(tǒng)將其識(shí)別為非即插即用設(shè)備啦。但如果這里多余的SRS驅(qū)動(dòng)如果沒被清除,系統(tǒng)在啟動(dòng)時(shí)還是會(huì)將其加載的。這個(gè)會(huì)增加啟動(dòng)時(shí)間,占用內(nèi)存空間并且有可能引發(fā)系統(tǒng)的不穩(wěn)定。
接著說HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services這個(gè)分支。這個(gè)是保存驅(qū)動(dòng)服務(wù)加載和其它服務(wù)的。
HKLM\SYSTEM\CurrentControlSet\Services這個(gè)注冊(cè)樹保存了關(guān)于系統(tǒng)中每個(gè)服務(wù)的信息。
每個(gè)驅(qū)動(dòng)有一個(gè)鍵形式如同HKLM\SYSTEM\CurrentControlSet\Services\
DriverName.
PnP管理器調(diào)用驅(qū)動(dòng)的DriverEntry
的例程時(shí),會(huì)將這個(gè)地址傳送到驅(qū)動(dòng)的RegistryPath參數(shù)
中去。(終于知道這個(gè)參數(shù)的來由了,哈哈) 一個(gè)驅(qū)動(dòng)可以在Services
樹下的DriverName鍵
中存儲(chǔ)驅(qū)動(dòng)定義的全局?jǐn)?shù)據(jù)。在驅(qū)動(dòng)初始化時(shí),信息存儲(chǔ)在這個(gè)鍵下是允許的。
下面的鍵和值入口是特別感興趣的:
ImagePath是一個(gè)值入口,它指定了驅(qū)動(dòng)文件的修飾全路徑。安裝時(shí)通過使用驅(qū)動(dòng)的Inf文
件中的ServiceBinary入口創(chuàng)建了這個(gè)值。這個(gè)入口在service-install-section中,參考驅(qū)動(dòng)的INF中的AddService子節(jié)。
directive , 對(duì)于這個(gè)路徑一個(gè)典型的值是
%windir%\system32\Drivers\DriverName.sys ,而DriverName是驅(qū)動(dòng)的Services鍵的名字。
Parameters
一個(gè)鍵用于存儲(chǔ)驅(qū)動(dòng)指定數(shù)據(jù)。一些類型的驅(qū)動(dòng),系統(tǒng)期望去找到指定的值入
口。你可以添加到這個(gè)子鍵中,通過在驅(qū)動(dòng)的INF文件中使用AddReg
入口。
Performance
一個(gè)鍵用于指定可選的監(jiān)控行為的信息。這個(gè)鍵下的值指定驅(qū)動(dòng)的行動(dòng)DLL
的名字和那個(gè)DLL特定輸出接口的名字。你可以通過在驅(qū)動(dòng)的INF文件的AddReg
入口添加的值。
例如:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaStor]
“Type”=dword:00000001
“Start”=dword:00000000
“ErrorControl”=dword:00000001
“Tag”=dword:00000019
“ImagePath”=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,61,00,53,00,74,00,6f,00,72,\
00,2e,00,73,00,79,00,73,00,00,00
“DisplayName”=”Intel RAID Controller”
“Group”=”SCSI Miniport”
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaStor\Enum]
“0″=”PCI\\VEN_……”--->使用iaStor這個(gè)驅(qū)動(dòng)的設(shè)備的硬件ID。
“Count”=dword:00000001--->說明iaStor這個(gè)驅(qū)動(dòng)只被一個(gè)設(shè)備使用。
“NextInstance”=dword:00000001
這是intel的串口硬盤控制器驅(qū)動(dòng).
其中的”Type”=dword:00000001說明是一個(gè)核心設(shè)備驅(qū)動(dòng)程序服務(wù).
“Start”=dword:00000000 是引導(dǎo)時(shí)就會(huì)被NTLDR加載的服務(wù).
“ErrorControl”=dword:00000001就是錯(cuò)誤控制的意思.將錯(cuò)誤記錄到系統(tǒng)日志并提示警告信息,但繼續(xù)啟動(dòng)過程。
“Tag”=dword:00000019就是指在”SCSI Miniport”組內(nèi)的加載順序.
“ImagePath”就要加載的驅(qū)動(dòng)文件路徑.
“DisplayName”=”Intel RAID Controller”顯示的名稱.
“Group”=”SCSI Miniport”指定驅(qū)動(dòng)程序或者服務(wù)隸屬的組。此項(xiàng)設(shè)定允許驅(qū)動(dòng)程序或者服務(wù)同步啟動(dòng)(比入:文件系統(tǒng)驅(qū)動(dòng)程序)注冊(cè)表子鍵 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder 中的 List 項(xiàng)指定了組項(xiàng)啟動(dòng)順序。
HKLM\SYSTEM\CurrentControlSet\Control
注冊(cè)樹包括了控制系統(tǒng)啟動(dòng)和一些方面的驅(qū)配置。下面的子鍵是特別感興趣的:
HKLM\SYSTEM\CurrentControlSet\Control\Class
包含關(guān)于系統(tǒng)中設(shè)備安裝類的信息。每個(gè)類有一個(gè)子鍵, 名字使用安裝類的GUID。每個(gè)子鍵包含了關(guān)于一個(gè)安裝類的信息,如同class installer (假設(shè)這里有一個(gè)), 注冊(cè)類上層過濾驅(qū)動(dòng),注冊(cè)類下層過濾安裝驅(qū)動(dòng)等等。
每個(gè)類子鍵包含其他的子鍵如大家知道的軟鍵(或驅(qū)動(dòng)鍵),對(duì)于類安裝的系統(tǒng)的每個(gè)設(shè)備實(shí)
例。每個(gè)這樣的軟鍵使用設(shè)備實(shí)例ID號(hào)來命名,是基于十進(jìn)制的,四位數(shù)字的順序值。
CoDeviceInstallers
包含關(guān)于類指定co-installers的信息,注冊(cè)在系統(tǒng)中的co-installers 。
DeviceClasses
包含關(guān)于系統(tǒng)中設(shè)備接口的信息。There is a subkey for each device interface
class and entries under those subkeys for each instance of an interface that is registered for the
device interface class 。