遍曆搜尋註冊表
作者:UESTC 劉一 下載原始碼 一、註冊表的組織圖 圖一 類比:Key有如檔案夾,Value有如檔案。 Value組成:Name/Type/Data, 通常指某Value就是指其Name。 二、目前的訪問手段 regedit, regedt32,第三方軟體,編程。 Windows提供了三種方式供編程實現:函數,Shell函數,CRegKey類(由ATL庫提供,是對API的封裝,簡化了部分功能)。這三種方式的提供的函數大同小異;由於它們對註冊表操作的函數都是原子動作,故功能強大卻使用不便。 類比:dir瀏覽當前檔案夾下的子檔案夾和檔案,卻無法知道子檔案夾中有什麼;註冊表操作函數也僅能瀏覽當前Key下的Subkey和Value,卻無法知道Subkey中有什麼。 三、面臨的問題——本程式的目的 無法直接查詢註冊表中是否存在某一Key或Value。 為實現對註冊表的查詢,必須編程對註冊表進行遍曆。 遞迴函式是不二的選擇。
圖二 四、基本函數(以API為例): 1、RegOpenKeyEx 主要參數:欲訪問鍵柄,子鍵路徑,存取權限,返回鍵柄 欲訪問鍵柄可以是5個預定義根鍵,也可以是返回鍵柄 子鍵路徑如果是空串,表明直接開啟欲訪問鍵柄 返回的鍵柄可以直接指定為欲訪問鍵柄 為加快處理速度,鍵柄用長整型表示 註:鍵的控制代碼,簡稱鍵柄 2、RegQueryKeyInfo 主要參數:欲訪問鍵柄,返回子鍵數目 3、RegEnumKeyEx 主要參數:欲訪問鍵柄,子鍵編號,返回某編號子鍵名 通過RegQueryKeyInfo返回的子鍵數目,再用RegEnumKeyEx逐個返回子鍵名 4、RegQueryValueEx 主要參數:欲訪問鍵柄, 欲查詢Value的Name 如果存在該Name,則返回ERROR_SUCCESS 五、演算法設計:使用遞迴函式對註冊表進行遍曆 1、使用RegOpenKeyEx開啟一個鍵 2、使用RegQueryValueEx尋找是否存在欲查詢的Value A、是:退出遞迴,並表示“已找到” B、否:使用RegQueryKeyInfo尋找當前鍵下是否有子鍵 I、否:當前鍵下無欲尋找的Value II、是:逐個開啟子鍵,並調用遞迴函式 六、演算法流程圖: 圖三 七、結束語——尚待改進之處 針對不同條件尋找:目前尋找的對象僅為value的name,改進可使其尋找key和value的data。 模糊尋找:該程式目前對字串的搜尋是精確尋找,要使其功能更加強大,須加入字串模糊比對演算法。 尋找下一個合格值:如果註冊表中有多個滿足條件的值,那麼本程式只能查出第一個,對遞迴進行中斷,再恢複,可實現下一次尋找。 |