在使用者態下面,有大把的api可供我們操作登錄檔,例如regopenkey,regclosekey等,這些api都是由windows提供給使用者態使用的api。
那麼對於驅動層了,因為驅動程式設計,並沒有哪個能夠提供額外的庫可供我們呼叫,肯定是不能呼叫如regopenkey等這些api函式,那難道核心態就不能操作登錄檔嘛?答案顯示是不成立的。那我們回頭想想api的呼叫方式,任何登錄檔的操作,實際都是呼叫上層api,然後觸發核心態api執行真正的操作,既然我們進入了核心態,那不是就可以直接呼叫上層api的真正實現函式麼?於是乎,開啟ntdll檔案一看,大把的類似於zwopenkey,zwenumeratekey等函式,都是用來操作登錄檔的。如此,我們就一一的討論關於登錄檔的一些常見操作。
一 登錄檔中常見資料結構
typedef struct _key_basic_information key_basic_information, *pkey_basic_information;
typedef struct _key_node_information key_node_information, *pkey_node_information;
typedef _key_full_information key_full_information; pkey_full_information
其中,key_basic_information表示乙個鍵下面所有的子鍵的資訊;
key_node_information表示該鍵的所有資訊;
key_full_information表示該鍵的所有資訊,包括自身和子鍵的資訊;
二 api函式概述
1.zwcreatekey:開啟或者建立乙個新的登錄檔鍵;
2.zwopenkey:開啟乙個已在的登錄檔鍵;
3.zwflushkey:
4.zwquerykey:查詢某登錄檔項所屬的類,以及子鍵的數量和長度;
5.zwqueryvaluekey:查詢某登錄檔項的所有鍵值資訊;
6.zwenumeratekey:查詢某子項的所有資訊;
7.zwenumeratevaluekey:獲取某登錄檔子鍵的所有資訊;
8.zwclose:關閉登錄檔控制代碼;
三 登錄檔操作。
1.路徑的表示方式
heky_local_machine對應在核心程式設計裡的寫法是\registery\machine
heky_users對應在核心程式設計裡的寫法是\registry\user
另外兩個主目錄暫時沒討論;
2.登錄檔基本操作
(1)列舉登錄檔鍵下面的所有子項:利用zwquerykey和zwenumeratekey完成。
如下例:
rtlinitunicodestring(&ustrregstring,strkey);
initializeobjectattributes(&obj_attrib,&ustrregstring,obj_case_insensitive,null,null);
// 開啟登錄檔
status = zwopenkey(&hregister, key_read, &obj_attrib);
zwquerykey(hregister, keyfullinformation, null, 0, &ulsize);
pfi = (pkey_full_information)exallocatepool(pagedpool, ulsize);
zwquerykey(hregister, keyfullinformation, pfi, ulsize, &ulsize);
for (i = 0; i < pfi->subkeys; i++)
exfreepool(pfi);
大致流程如下:
a.先將檔案路徑資訊轉換為object_attributes型別;(同檔案操作一致)
b.開啟路徑對應的登錄檔項;
c.呼叫zwquerykey獲取該鍵對應的子項內容;
d.呼叫zwenumratekey獲取子項的所有資訊;
細心發現上面沒個api函式都呼叫兩次,第一次的目的是獲取子項的大小,以此動態分配記憶體,節約儲存空
間。(2)枚舉子項下面的某對應名字的子鍵的內容值
如下例:
rtlinitunicodestring( ®unicodekeyname,l"displayname");
initializeobjectattributes(&objectattributes,pstrkey, obj_case_insensitive,null,null );
ntstatus = zwopenkey( &hregister,generic_read,&objectattributes);
ntstatus = zwqueryvaluekey(hregister,®unicodekeyname,keyvaluefullinformation,null,0,&ulsize);
pvfi =(pkey_value_full_information)exallocatepool(pagedpool,ulsize);
zwqueryvaluekey(hregister,®unicodekeyname,keyvaluefullinformation,pvfi,ulsize,&ulsize);
呼叫流程不在敖述,大致同上面類似,只是最後取子鍵值的時候,呼叫zwqueryvaluekey獲取,對於keyvaluefullinformation值,該值記載了子鍵對應的名字和內容,內容在名字之後,偏移是根據dataoffset獲取的。
(3)枚舉子項下面的所有子鍵資訊
initializeobjectattributes(&objectattributes,®unicodestring,obj_case_insensitive,null,
null );
ntstatus = zwopenkey( &hregister,key_all_access, &objectattributes);
zwquerykey(hregister,keyfullinformation,null,0,&ulsize);
pfi=(pkey_full_information)exallocatepool(pagedpool,ulsize);
zwquerykey(hregister,keyfullinformation,pfi,ulsize,&ulsize);
for ( i=0;ivalues;i++)
上面的流程首先開啟某登錄檔子項,呼叫zwquerykey獲取該子項對應的子鍵資訊(數目和長度),然後呼叫zwenumeratuekey遍歷該子項下面的所有子鍵資訊。
登錄檔操作
近來由於需要在自己寫的程式中對登錄檔進行操作。總結些經驗,並做個乙個demo供日後使用,現在把它拿出來和大家分享 小弟初學vc,有誤之處還請賜教。為了使用方便,我把一些操作寫成了函式,以便方便呼叫,具體 如下所示 一 定義 hkey hkey char content 256 所查詢登錄檔鍵值的內容...
登錄檔操作
2005年10月29日 19 29 00 一 寫入 1.建立檔案 建立乙個註冊 式檔案 reg,內容如下 windows registry editor version 5.00 hkey local machine software test server 192.168.66.22 databa...
登錄檔操作
import win32con key win32api.regopenkey win32con.hkey current user,software 0,win32con.key read print key import win32api import win32com key win32api...