C/C++實(shí)現(xiàn)Windows注冊(cè)表的基本操作
Windows注冊(cè)表(Registry)是Windows操作系統(tǒng)中用于存儲(chǔ)系統(tǒng)配置信息、用戶設(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),類似于文件夾,用于組織和存儲(chǔ)相關(guān)的信息。每個(gè)鍵可以包含子鍵和/或值。
- 子鍵(Subkey): 位于注冊(cè)表中的鍵的層次結(jié)構(gòu)中的更深一層的鍵。子鍵可以包含其他子鍵或值。
- 值(Value): 存儲(chǔ)在注冊(cè)表中的數(shù)據(jù)單元,通常與鍵相關(guān)聯(lián)。值可以包含配置信息、用戶設(shè)置等數(shù)據(jù)。
- 數(shù)據(jù)類型(Data Type): 值的數(shù)據(jù)類型定義了值的內(nèi)容和用途。常見的數(shù)據(jù)類型包括字符串、整數(shù)、二進(jìn)制數(shù)據(jù)等。
- 根鍵(Root Key): 注冊(cè)表的最頂層,有幾個(gè)根鍵,常見的包括
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ǔ)用戶設(shè)置: 注冊(cè)表中存儲(chǔ)了用戶特定的設(shè)置,如桌面背景、主題、鼠標(biāo)指針樣式等。
- 應(yīng)用程序配置: 許多應(yīng)用程序使用注冊(cè)表存儲(chǔ)其配置信息。當(dāng)應(yīng)用程序安裝時(shí),它可能會(huì)在注冊(cè)表中創(chuàng)建相關(guān)的鍵和值來保存配置。
- 組織系統(tǒng)和應(yīng)用程序數(shù)據(jù): 注冊(cè)表提供了一個(gè)結(jié)構(gòu)化的方式來組織系統(tǒng)和應(yīng)用程序需要存儲(chǔ)的數(shù)據(jù),使得操作系統(tǒng)和應(yīng)用程序可以輕松地檢索和修改配置信息。
- 提供對(duì)系統(tǒng)設(shè)置的訪問: 通過注冊(cè)表,用戶和系統(tǒng)管理員可以訪問和修改系統(tǒng)的各種設(shè)置,從而對(duì)系統(tǒng)行為進(jìn)行調(diào)整和優(yōu)化。
枚舉注冊(cè)表項(xiàng)
RegOpenKeyEx 是一個(gè)用于打開指定的注冊(cè)表鍵的 Windows API 函數(shù)。它允許應(yīng)用程序訪問和操作 Windows 注冊(cè)表的子鍵。在較新的 Windows 版本中,例如 Windows 10,RegOpenKeyEx 已被推薦的函數(shù) RegOpenKey 和 RegOpenKeyEx 代替。以下是 RegOpenKeyEx 的一般用法:
LSTATUS RegOpenKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult );
參數(shù)說明:
hKey: 指定要打開的基礎(chǔ)鍵的句柄,可以是HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等。lpSubKey: 指定相對(duì)于hKey的子鍵路徑。ulOptions: 保留參數(shù),通??梢栽O(shè)置為 0。samDesired: 指定鍵的訪問權(quán)限,例如KEY_READ或KEY_WRITE。phkResult: 接收指向打開的注冊(cè)表鍵的句柄的指針。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
RegEnumValue 用于列舉指定注冊(cè)表鍵中的值。它可以用來遍歷注冊(cè)表鍵中的所有值,以便你可以獲取鍵中包含的信息。以下是 RegEnumValue 的一般用法:
LSTATUS RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcchValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData );
參數(shù)說明:
hKey: 指定要列舉值的注冊(cè)表鍵的句柄。dwIndex: 指定要檢索的值的索引。從 0 開始,逐漸遞增。lpValueName: 接收值的名稱的緩沖區(qū)。lpcchValueName: 接收值名稱的緩沖區(qū)大小的指針。在調(diào)用函數(shù)之前,你應(yīng)該將其設(shè)置為緩沖區(qū)大小。lpReserved: 保留參數(shù),通??梢栽O(shè)置為 NULL。lpType: 接收值的數(shù)據(jù)類型的指針。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;
// 打開注冊(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 名稱: %-25s 值: %-50s 類型: ", 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即可完成開機(jī)自啟動(dòng).
Enum_Regedit(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\");
system("pause");
return 0;
}
添加注冊(cè)表項(xiàng)
RegCreateKey 是用于創(chuàng)建或打開指定的注冊(cè)表鍵。如果鍵不存在,則它將被創(chuàng)建;如果存在,則它將被打開。以下是 RegCreateKey 的一般用法:
LSTATUS RegCreateKey( HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult );
參數(shù)說明:
hKey: 指定要?jiǎng)?chuàng)建或打開的基礎(chǔ)鍵的句柄,可以是HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等。lpSubKey: 指定相對(duì)于hKey的子鍵路徑。phkResult: 接收指向創(chuàng)建或打開的注冊(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ù)說明:
hKey: 指定要設(shè)置值的注冊(cè)表鍵的句柄。lpValueName: 指定要設(shè)置的值的名稱。Reserved: 保留參數(shù),通??梢栽O(shè)置為 0。dwType: 指定值的數(shù)據(jù)類型,例如REG_SZ表示字符串。lpData: 指定要設(shè)置的值的數(shù)據(jù)。cbData: 指定數(shù)據(jù)的大小。
函數(shù)返回值:
- 如果函數(shù)調(diào)用成功,返回
ERROR_SUCCESS。 - 如果函數(shù)調(diào)用失敗,返回一個(gè)錯(cuò)誤代碼。
通過獲取自身進(jìn)程名稱,并將該進(jìn)程路徑寫入到CurrentVersion變量中實(shí)現(xiàn)開機(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)開機(jī)自啟動(dòng),由于Win系統(tǒng)都是在注冊(cè)表之上工作的,只要向指定位置寫入鍵值,即可實(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è)表鍵中的指定值。它可以用來獲取注冊(cè)表鍵中的數(shù)據(jù),例如字符串、整數(shù)等。以下是 RegQueryValueEx 的一般用法:
LSTATUS RegQueryValueEx( HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData );
參數(shù)說明:
hKey: 指定要查詢值的注冊(cè)表鍵的句柄。lpValueName: 指定要查詢的值的名稱。lpReserved: 保留參數(shù),通常可以設(shè)置為 NULL。lpType: 接收值的數(shù)據(jù)類型的指針。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è)置過.
#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è)表鍵中的指定值。它可以用來刪除注冊(cè)表鍵中的數(shù)據(jù)值。以下是 RegDeleteValue 的一般用法:
LSTATUS RegDeleteValue( HKEY hKey, LPCTSTR lpValueName );
參數(shù)說明:
hKey: 指定要?jiǎng)h除值的注冊(cè)表鍵的句柄。lpValueName: 指定要?jiǎng)h除的值的名稱。
函數(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++中拷貝構(gòu)造函數(shù)的參數(shù)類型必須是引用
如果拷貝構(gòu)造函數(shù)中的參數(shù)不是一個(gè)引用,即形如CClass(const CClass c_class),那么就相當(dāng)于采用了傳值的方式(pass-by-value),而傳值的方式會(huì)調(diào)用該類的拷貝構(gòu)造函數(shù),從而造成無窮遞歸地調(diào)用拷貝構(gòu)造函數(shù)。因此拷貝構(gòu)造函數(shù)的參數(shù)必須是一個(gè)引用2013-07-07
C語(yǔ)言實(shí)現(xiàn)通訊錄的方法(包括靜態(tài)版本和動(dòng)態(tài)版本)
本文給大家分享C語(yǔ)言實(shí)現(xiàn)通訊錄的方法(包括靜態(tài)版本和動(dòng)態(tài)版本),針對(duì)每種方法給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-09-09
用C語(yǔ)言模仿Python函數(shù)的實(shí)例
下面小編就為大家?guī)硪黄肅語(yǔ)言模仿Python函數(shù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程
這篇文章主要介紹了Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程 ,需要的朋友可以參考下2020-02-02
C++中strlen(),sizeof()與size()的區(qū)別
本文主要介紹了C++中strlen(),sizeof()與size()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
C++ LeetCode1775通過最少操作次數(shù)使數(shù)組和相等
這篇文章主要為大家介紹了C++ LeetCode1775通過最少操作次數(shù)使數(shù)組和相等,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
ros項(xiàng)目調(diào)試:vscode下配置開發(fā)ROS項(xiàng)目的詳細(xì)教程
這篇文章主要介紹了ros項(xiàng)目調(diào)試:vscode下配置開發(fā)ROS項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
C++使用HDF5庫(kù)實(shí)現(xiàn)將h5圖像轉(zhuǎn)為tif格式
這篇文章主要為大家詳細(xì)介紹了C++ 語(yǔ)言如何通過hdf5庫(kù)與gdal庫(kù)實(shí)現(xiàn)將.h5格式的多波段HDF5圖像批量轉(zhuǎn)換為.tif格式,有需要的可以參考一下2024-12-12

