C/C++實(shí)現(xiàn)Windows注冊(cè)表的基本操作
Windows注冊(cè)表(Registry)是Windows操作系統(tǒng)中用于存儲(chǔ)系統(tǒng)配置信息、用戶(hù)設(shè)置和應(yīng)用程序數(shù)據(jù)的一個(gè)集中式數(shù)據(jù)庫(kù)。它是一個(gè)層次結(jié)構(gòu)的數(shù)據(jù)庫(kù),由鍵(Key)和值(Value)組成,這些鍵和值被用于存儲(chǔ)各種系統(tǒng)和應(yīng)用程序的配置信息。
以下是注冊(cè)表的一些基本概念:
- 鍵(Key): 注冊(cè)表中的數(shù)據(jù)結(jié)構(gòu),類(lèi)似于文件夾,用于組織和存儲(chǔ)相關(guān)的信息。每個(gè)鍵可以包含子鍵和/或值。
- 子鍵(Subkey): 位于注冊(cè)表中的鍵的層次結(jié)構(gòu)中的更深一層的鍵。子鍵可以包含其他子鍵或值。
- 值(Value): 存儲(chǔ)在注冊(cè)表中的數(shù)據(jù)單元,通常與鍵相關(guān)聯(lián)。值可以包含配置信息、用戶(hù)設(shè)置等數(shù)據(jù)。
- 數(shù)據(jù)類(lèi)型(Data Type): 值的數(shù)據(jù)類(lèi)型定義了值的內(nèi)容和用途。常見(jiàn)的數(shù)據(jù)類(lèi)型包括字符串、整數(shù)、二進(jìn)制數(shù)據(jù)等。
- 根鍵(Root Key): 注冊(cè)表的最頂層,有幾個(gè)根鍵,常見(jiàn)的包括
HKEY_CLASSES_ROOT
、HKEY_CURRENT_USER
、HKEY_LOCAL_MACHINE
等。
Windows注冊(cè)表的作用包括:
- 存儲(chǔ)系統(tǒng)配置信息: 注冊(cè)表中存儲(chǔ)了操作系統(tǒng)的配置信息,包括系統(tǒng)啟動(dòng)時(shí)需要加載的驅(qū)動(dòng)程序、系統(tǒng)服務(wù)、文件關(guān)聯(lián)等。
- 存儲(chǔ)用戶(hù)設(shè)置: 注冊(cè)表中存儲(chǔ)了用戶(hù)特定的設(shè)置,如桌面背景、主題、鼠標(biāo)指針樣式等。
- 應(yīng)用程序配置: 許多應(yīng)用程序使用注冊(cè)表存儲(chǔ)其配置信息。當(dāng)應(yīng)用程序安裝時(shí),它可能會(huì)在注冊(cè)表中創(chuàng)建相關(guān)的鍵和值來(lái)保存配置。
- 組織系統(tǒng)和應(yīng)用程序數(shù)據(jù): 注冊(cè)表提供了一個(gè)結(jié)構(gòu)化的方式來(lái)組織系統(tǒng)和應(yīng)用程序需要存儲(chǔ)的數(shù)據(jù),使得操作系統(tǒng)和應(yīng)用程序可以輕松地檢索和修改配置信息。
- 提供對(duì)系統(tǒng)設(shè)置的訪(fǎng)問(wèn): 通過(guò)注冊(cè)表,用戶(hù)和系統(tǒng)管理員可以訪(fǎng)問(wèn)和修改系統(tǒng)的各種設(shè)置,從而對(duì)系統(tǒng)行為進(jìn)行調(diào)整和優(yōu)化。
枚舉注冊(cè)表項(xiàng)
RegOpenKeyEx
是一個(gè)用于打開(kāi)指定的注冊(cè)表鍵的 Windows API 函數(shù)。它允許應(yīng)用程序訪(fǎng)問(wèn)和操作 Windows 注冊(cè)表的子鍵。在較新的 Windows 版本中,例如 Windows 10,RegOpenKeyEx
已被推薦的函數(shù) RegOpenKey
和 RegOpenKeyEx
代替。以下是 RegOpenKeyEx
的一般用法:
LSTATUS RegOpenKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult );
參數(shù)說(shuō)明:
hKey
: 指定要打開(kāi)的基礎(chǔ)鍵的句柄,可以是HKEY_CLASSES_ROOT
、HKEY_CURRENT_USER
、HKEY_LOCAL_MACHINE
等。lpSubKey
: 指定相對(duì)于hKey
的子鍵路徑。ulOptions
: 保留參數(shù),通??梢栽O(shè)置為 0。samDesired
: 指定鍵的訪(fǎng)問(wèn)權(quán)限,例如KEY_READ
或KEY_WRITE
。phkResult
: 接收指向打開(kāi)的注冊(cè)表鍵的句柄的指針。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS
。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
RegEnumValue
用于列舉指定注冊(cè)表鍵中的值。它可以用來(lái)遍歷注冊(cè)表鍵中的所有值,以便你可以獲取鍵中包含的信息。以下是 RegEnumValue
的一般用法:
LSTATUS RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcchValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData );
參數(shù)說(shuō)明:
hKey
: 指定要列舉值的注冊(cè)表鍵的句柄。dwIndex
: 指定要檢索的值的索引。從 0 開(kāi)始,逐漸遞增。lpValueName
: 接收值的名稱(chēng)的緩沖區(qū)。lpcchValueName
: 接收值名稱(chēng)的緩沖區(qū)大小的指針。在調(diào)用函數(shù)之前,你應(yīng)該將其設(shè)置為緩沖區(qū)大小。lpReserved
: 保留參數(shù),通常可以設(shè)置為 NULL。lpType
: 接收值的數(shù)據(jù)類(lèi)型的指針。lpData
: 接收值的數(shù)據(jù)的緩沖區(qū)。lpcbData
: 接收數(shù)據(jù)緩沖區(qū)大小的指針。在調(diào)用函數(shù)之前,你應(yīng)該將其設(shè)置為緩沖區(qū)大小。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS
。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
枚舉指定鍵值對(duì)中是否存在值,如果存在則循環(huán)將其輸出。
#include <stdio.h> #include <Windows.h> void Enum_Regedit(HKEY Reg_Root,const char *Reg_Path) { HKEY hKey = NULL; DWORD dwType = 0; char szValueName[MAXBYTE], szValueKey[MAXBYTE] = { 0 }; DWORD dwBufferSize = MAXBYTE, dwKeySize = MAXBYTE; // 打開(kāi)注冊(cè)表項(xiàng) LONG lRet = RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_ALL_ACCESS, &hKey); int index = 0; while (1) { // 枚舉注冊(cè)表鍵項(xiàng) lRet = RegEnumValue(hKey, index, szValueName, &dwBufferSize, NULL, &dwType, (unsigned char *)szValueKey, &dwKeySize); if (lRet == ERROR_NO_MORE_ITEMS) break; printf("序號(hào): %3d 名稱(chēng): %-25s 值: %-50s 類(lèi)型: ", index, szValueName, szValueKey); switch (dwType) { case 1: printf("REG_SZ \n"); break; case 2: printf("REG_EXPAND_SZ \n"); break; case 4: printf("REG_DWORD \n"); break; case 7: printf("REG_MULTI_SZ \n"); break; default: printf("None \n"); break; } dwBufferSize = MAXBYTE; dwKeySize = MAXBYTE; index++; } RegCloseKey(hKey); } int main(int argc, char *argv[]) { // 枚舉普通啟動(dòng)項(xiàng) Enum_Regedit(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run"); Enum_Regedit(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run"); // 枚舉Boot啟動(dòng)項(xiàng) // HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute Enum_Regedit(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\"); // 枚舉ActiveX啟動(dòng)項(xiàng),在子鍵中添加SubPath即可完成開(kāi)機(jī)自啟動(dòng). Enum_Regedit(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\"); system("pause"); return 0; }
添加注冊(cè)表項(xiàng)
RegCreateKey
是用于創(chuàng)建或打開(kāi)指定的注冊(cè)表鍵。如果鍵不存在,則它將被創(chuàng)建;如果存在,則它將被打開(kāi)。以下是 RegCreateKey
的一般用法:
LSTATUS RegCreateKey( HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult );
參數(shù)說(shuō)明:
hKey
: 指定要?jiǎng)?chuàng)建或打開(kāi)的基礎(chǔ)鍵的句柄,可以是HKEY_CLASSES_ROOT
、HKEY_CURRENT_USER
、HKEY_LOCAL_MACHINE
等。lpSubKey
: 指定相對(duì)于hKey
的子鍵路徑。phkResult
: 接收指向創(chuàng)建或打開(kāi)的注冊(cè)表鍵的句柄的指針。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS
。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
RegSetValueEx
是用于在指定的注冊(cè)表鍵中設(shè)置一個(gè)值。它可以用于創(chuàng)建新的鍵值,也可以用于修改現(xiàn)有鍵值。以下是 RegSetValueEx
的一般用法:
LSTATUS RegSetValueEx( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData );
參數(shù)說(shuō)明:
hKey
: 指定要設(shè)置值的注冊(cè)表鍵的句柄。lpValueName
: 指定要設(shè)置的值的名稱(chēng)。Reserved
: 保留參數(shù),通常可以設(shè)置為 0。dwType
: 指定值的數(shù)據(jù)類(lèi)型,例如REG_SZ
表示字符串。lpData
: 指定要設(shè)置的值的數(shù)據(jù)。cbData
: 指定數(shù)據(jù)的大小。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS
。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
通過(guò)獲取自身進(jìn)程名稱(chēng),并將該進(jìn)程路徑寫(xiě)入到CurrentVersion
變量中實(shí)現(xiàn)開(kāi)機(jī)自啟。
#include <stdio.h> #include <Windows.h> #define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run" BOOL Reg_Regedit(HKEY Reg_Root,char *lpszFileName, char *lpszValueName) { HKEY hKey; if (ERROR_SUCCESS != RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_WRITE, &hKey)) { return FALSE; } if (ERROR_SUCCESS != RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName)))) { RegCloseKey(hKey); return FALSE; } RegCloseKey(hKey); return TRUE; } int main(int argc, char *argv[]) { TCHAR szPath[MAX_PATH] = { 0 }; if (GetModuleFileName(NULL, szPath, MAX_PATH)) { int ret = Reg_Regedit(HKEY_CURRENT_USER, szPath, "main"); if (ret == 1) printf("添加自身啟動(dòng)項(xiàng)成功 \n"); } system("pause"); return 0; }
注冊(cè)表項(xiàng)不僅可以實(shí)現(xiàn)開(kāi)機(jī)自啟動(dòng),由于Win系統(tǒng)都是在注冊(cè)表之上工作的,只要向指定位置寫(xiě)入鍵值,即可實(shí)現(xiàn)許多不可思議的功能。
// 禁用系統(tǒng)任務(wù)管理器 void RegTaskmanagerForbidden() { HKEY hkey; DWORD value = 1; RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey); RegSetValueEx(hkey, "DisableTaskMgr", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD)); RegCloseKey(hkey); } // 禁用注冊(cè)表編輯器 void RegEditForbidden() { HKEY hkey; DWORD value = 1; RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey); RegSetValueEx(hkey, "DisableRegistryTools", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD)); RegCloseKey(hkey); } // 干掉桌面壁紙 void RegModifyBackroud() { DWORD value = 1; HKEY hkey; RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey); RegSetValueEx(hkey, "Wallpaper", NULL, REG_SZ, (unsigned char *)"c://", 3); RegSetValueEx(hkey, "WallpaperStyle", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD)); }
判斷鍵值狀態(tài)
RegQueryValueEx
是用于檢索指定注冊(cè)表鍵中的指定值。它可以用來(lái)獲取注冊(cè)表鍵中的數(shù)據(jù),例如字符串、整數(shù)等。以下是 RegQueryValueEx
的一般用法:
LSTATUS RegQueryValueEx( HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData );
參數(shù)說(shuō)明:
hKey
: 指定要查詢(xún)值的注冊(cè)表鍵的句柄。lpValueName
: 指定要查詢(xún)的值的名稱(chēng)。lpReserved
: 保留參數(shù),通常可以設(shè)置為 NULL。lpType
: 接收值的數(shù)據(jù)類(lèi)型的指針。lpData
: 接收值的數(shù)據(jù)的緩沖區(qū)。lpcbData
: 接收數(shù)據(jù)緩沖區(qū)大小的指針。在調(diào)用函數(shù)之前,你應(yīng)該將其設(shè)置為緩沖區(qū)大小。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS
。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
判斷指定鍵值對(duì)是否存在,是否被設(shè)置過(guò).
#include <stdio.h> #include <Windows.h> #define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run" BOOL Check_Regedit(HKEY Reg_Root,char * name) { HKEY hKey; if (ERROR_SUCCESS == RegOpenKeyEx(Reg_Root, Reg_Path, NULL, KEY_ALL_ACCESS, &hKey)) { DWORD dwSize = 255, dwType = REG_SZ; char String[256]; if (ERROR_SUCCESS == RegQueryValueEx(hKey, name, 0, &dwType, (BYTE *)String, &dwSize)) { return true; } } RegCloseKey(hKey); return false; } int main(int argc, char *argv[]) { int ret = Check_Regedit(HKEY_CURRENT_USER, "ctfmon"); printf("啟動(dòng)項(xiàng)存在: %d \n", ret); system("pause"); return 0; }
刪除鍵值對(duì)
RegDeleteValue
是用于刪除指定注冊(cè)表鍵中的指定值。它可以用來(lái)刪除注冊(cè)表鍵中的數(shù)據(jù)值。以下是 RegDeleteValue
的一般用法:
LSTATUS RegDeleteValue( HKEY hKey, LPCTSTR lpValueName );
參數(shù)說(shuō)明:
hKey
: 指定要?jiǎng)h除值的注冊(cè)表鍵的句柄。lpValueName
: 指定要?jiǎng)h除的值的名稱(chēng)。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS
。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
傳入需要?jiǎng)h除的注冊(cè)表位置,以及該表中鍵值對(duì)的名字即可完成刪除。
#include <stdio.h> #include <Windows.h> void Delete_Regedit(const char *Reg_Path,const char *Key_Name) { char szKeyName[MAXBYTE] = { 0 }; HKEY hKey = NULL; LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Reg_Path, 0, KEY_ALL_ACCESS, &hKey); RegDeleteValue(hKey, Key_Name); RegCloseKey(hKey); } int main(int argc, char *argv[]) { Delete_Regedit("Software\\Microsoft\\Windows\\CurrentVersion\\Run", "main1"); system("pause"); return 0; }
到此這篇關(guān)于C/C++實(shí)現(xiàn)Windows注冊(cè)表的基本操作的文章就介紹到這了,更多相關(guān)C++注冊(cè)表操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言創(chuàng)建數(shù)組實(shí)現(xiàn)函數(shù)init,empty,reverse
這篇文章主要介紹了C語(yǔ)言創(chuàng)建數(shù)組實(shí)現(xiàn)函數(shù)init,empty,reverse,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07淺談哈希表存儲(chǔ)效率一般不超過(guò)50%的原因
下面小編就為大家?guī)?lái)一篇淺談哈希表存儲(chǔ)效率一般不超過(guò)50%的原因。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01win10系統(tǒng)VS2019配置點(diǎn)云庫(kù)PCL1.12.1的詳細(xì)流程
這篇文章主要介紹了win10系統(tǒng)VS2019配置點(diǎn)云庫(kù)PCL1.12.1的教程與經(jīng)驗(yàn)總結(jié),本文記錄小白在配置過(guò)程中踩過(guò)的一些小坑,需要的朋友可以參考下2022-07-07C++?OpenCV技術(shù)實(shí)戰(zhàn)之身份證離線(xiàn)識(shí)別
OpenCV身份證離線(xiàn)識(shí)別技術(shù)的主要技術(shù)就是通過(guò)OpenCV找到身份證號(hào)碼區(qū)域,然后通過(guò)OCR進(jìn)行數(shù)字識(shí)別該區(qū)域的截圖即可得到身份證號(hào)碼。感興趣的可以了解一下2021-12-12C/C++最短路徑算法之迪杰斯特拉Dijkstra的實(shí)現(xiàn)詳解
Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文將詳解該算法的圖解與實(shí)現(xiàn),需要的可以參考一下2022-07-07C語(yǔ)言中判斷int,long型等變量是否賦值的方法詳解
聲明了int ,long型等局部變量,在利用一些方法給這些變量賦值之后,想判斷這些變量是不是真的被賦初值了,怎么辦2013-07-07C語(yǔ)言實(shí)現(xiàn)自動(dòng)分配地址的示例
本文介紹了兩種自動(dòng)分配地址的方法,包括通過(guò)宏定義實(shí)現(xiàn)地址分配和將EE地址作為一個(gè)結(jié)構(gòu)體,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11C語(yǔ)言位運(yùn)算符:與、或、異或、取反、左移與右移詳細(xì)介紹
以下是對(duì)C語(yǔ)言中的位運(yùn)算符:與、或、異或、取反、左移與右移進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08