Windows CE下的註冊表 (轉)

Windows CE下的註冊表

與桌面Windows一樣,Windows CE也使用註冊表(Registry)來保存應用程序、驅動程序和用戶的設定以及其他一些配置信息。Windows CE註冊表也採用樹形結構來管理配置信息,由於Windows CE註冊表的結構和功能與桌面Windows幾乎一樣,在這裏就不詳細介紹了,讀者可以參考其它關於註冊表的資料。
Windows CE支持四個根鍵,描述如下:
鍵名 描述
HKEY_LOCAL_MACHINE 硬件和驅動配置數據
HKEY_CURRENT_USER 用戶配置數據
HKEY_CLASSES_ROOT OLE和文件類型匹配配置數據
HKEY_USERS 適用於所有用戶的數據
由於嵌入式系統的特點,一些嵌入式設備是沒有外存的。因此Windows CE的註冊表提供了兩種實現方式:基於RAM的註冊表(RAM-Based Registry)和基於Hive的註冊表(Hive-Based Registry)。我們可以選擇在Windows CE中使用任何一種註冊表,註冊表類型對於用戶和應用程序來說是透明的。
 基於RAM的註冊表
正如其名,基於RAM的註冊表把整個註冊表作爲一個對象存儲堆存放在系統的內存中。這意味着如果對系統進行冷啓動或者系統斷電,對註冊表的所有改動都會丟失。
如果使用基於RAM的註冊表,對註冊表的讀寫訪問操作會變得非常高效。因此基於RAM的註冊表比較適用於沒有外部存儲,而且有電池保存內存數據(battery-backed RAM)的設備。如果有外存且經常冷啓動的設備採用基於RAM的註冊表,則需要在系統斷電的時候對註冊表進行保存,等系統再次啓動時對保存的註冊表進行還原。
Windows CE提供了兩種方法用來斷電保存基於RAM的註冊表:
1. Windows CE提供了兩個系統API用來保存和還原整個註冊表,它們的原形如下:
BOOL RegCopyFile( 
  LPCWSTR lpszFile  // 保存註冊表信息的文件的名字
);
BOOL RegRestoreFile( 
  LPCWSTR lpszFile  // 保存註冊表信息的文件的名字
);
如果要保存和恢復註冊表,我們只需要在系統斷電的時候調用RegCopyFile函數將整個註冊表保存爲外存上的一個文件。當系統重新啓動時,我們再調用RegRestoreFile函數將文件全部讀出RAM中,然後再熱啓動系統,我們保存得註冊表就可以生效了。值得注意的是這次熱啓動是必須的,因爲只有在系統啓動的時候纔會去檢測RegRestoreFile放在RAM裏的註冊表信息。這種方法的優點是完全可以使用應用程序來實現基於RAM的註冊表的保存,而且這種方法相對簡單。但是此方法的缺點是需要兩次啓動。因此效率相對比較低。
2. 第二種方法需要OEM的參與,OEM可以在BSP的OAL層中實現WriteRegistryToOEM和ReadRegistryFromOEM兩個函數,它們的聲明爲:
DWORD ReadRegistryFromOEM(
  DWORD dwFlags,  // 參數, REG_READ_BYTES_START表示讀新的註冊表
  LPBYTE lpData,  // 指向註冊表數據的緩衝區,由OS分配
  DWORD cbData  // 緩衝區的大小
);
BOOL WriteRegistryToOEM( 
  DWORD dwFlags,  // 參數,REG_WRITE_BYTES_START表示寫新的註冊表
  LPBYTE lpData,  // 指向註冊表數據的緩衝區,由OS分配
  DWORD cbData  // 緩衝區的大小,0表示到達註冊表尾部
);
Windows CE會在系統啓動和關閉的時候調用這兩個函數來保存和恢復註冊表。此種方法雖然可以避免兩次啓動,但是困難的地方是ReadRegistryFromOEM函數的實現比較困難,因爲在系統啓動的時候,塊設備驅動和文件系統的驅動都還沒有加載,因此不能使用CreateFile,ReadFile這樣的文件系統API來實現ReadRegistryFromOEM函數,只能使用一些更底層的操作來實現。
 基於Hive的註冊表
自從Windows CE 4.0之後,Windows CE提供了基於Hive的註冊表。基於Hive的註冊表把註冊表數據存放在文件系統的文件上,這種文件被稱作蜂箱Hive。這就意味着不再需要在系統斷電和啓動時進行保存恢復註冊表操作。
Hive是註冊表中的一組鍵,子鍵和值。Hive是文件系統上表現爲單個文件。Windows CE中有三種Hive。
類型 文件 描述
Boot hive ROM中的Boot.hv HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有數據。只在啓動時使用。
System hive 由OEM決定
(通常是System.hv) HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有數據。包含設備範圍內不隨着用戶改變而改變的數據。
User hive User.hv HKEY_CURRENT_USER下的所有數據。 包含用戶特有的設置,每個用戶都有一個單獨的User.hv。
基於Hive的註冊表適用於對於有永久存儲並且需要經常冷啓動的設備。我們也可以看到,基於Hive的註冊表把系統數據和用戶數據分開存放,這就意味着基於Hive的註冊表還提供多用戶支持。對於每一個用戶,可以提供不同的User.hv,當用戶登錄時加載相應的User.hv,從而達到多用戶目的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章