欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++實現(xiàn)Windows注冊表的基本操作

 更新時間:2023年11月23日 08:45:30   作者:微軟技術分享  
Windows注冊表(Registry)是Windows操作系統(tǒng)中用于存儲系統(tǒng)配置信息、用戶設置和應用程序數(shù)據(jù)的一個集中式數(shù)據(jù)庫,本文主要為大家介紹了C++對注冊表的基本操作,感興趣的小伙伴可以了解下

Windows注冊表(Registry)是Windows操作系統(tǒng)中用于存儲系統(tǒng)配置信息、用戶設置和應用程序數(shù)據(jù)的一個集中式數(shù)據(jù)庫。它是一個層次結構的數(shù)據(jù)庫,由鍵(Key)和值(Value)組成,這些鍵和值被用于存儲各種系統(tǒng)和應用程序的配置信息。

以下是注冊表的一些基本概念:

  • 鍵(Key): 注冊表中的數(shù)據(jù)結構,類似于文件夾,用于組織和存儲相關的信息。每個鍵可以包含子鍵和/或值。
  • 子鍵(Subkey): 位于注冊表中的鍵的層次結構中的更深一層的鍵。子鍵可以包含其他子鍵或值。
  • 值(Value): 存儲在注冊表中的數(shù)據(jù)單元,通常與鍵相關聯(lián)。值可以包含配置信息、用戶設置等數(shù)據(jù)。
  • 數(shù)據(jù)類型(Data Type): 值的數(shù)據(jù)類型定義了值的內容和用途。常見的數(shù)據(jù)類型包括字符串、整數(shù)、二進制數(shù)據(jù)等。
  • 根鍵(Root Key): 注冊表的最頂層,有幾個根鍵,常見的包括 HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE 等。

Windows注冊表的作用包括:

  • 存儲系統(tǒng)配置信息: 注冊表中存儲了操作系統(tǒng)的配置信息,包括系統(tǒng)啟動時需要加載的驅動程序、系統(tǒng)服務、文件關聯(lián)等。
  • 存儲用戶設置: 注冊表中存儲了用戶特定的設置,如桌面背景、主題、鼠標指針樣式等。
  • 應用程序配置: 許多應用程序使用注冊表存儲其配置信息。當應用程序安裝時,它可能會在注冊表中創(chuàng)建相關的鍵和值來保存配置。
  • 組織系統(tǒng)和應用程序數(shù)據(jù): 注冊表提供了一個結構化的方式來組織系統(tǒng)和應用程序需要存儲的數(shù)據(jù),使得操作系統(tǒng)和應用程序可以輕松地檢索和修改配置信息。
  • 提供對系統(tǒng)設置的訪問: 通過注冊表,用戶和系統(tǒng)管理員可以訪問和修改系統(tǒng)的各種設置,從而對系統(tǒng)行為進行調整和優(yōu)化。

枚舉注冊表項

RegOpenKeyEx 是一個用于打開指定的注冊表鍵的 Windows API 函數(shù)。它允許應用程序訪問和操作 Windows 注冊表的子鍵。在較新的 Windows 版本中,例如 Windows 10,RegOpenKeyEx 已被推薦的函數(shù) RegOpenKey 和 RegOpenKeyEx 代替。以下是 RegOpenKeyEx 的一般用法:

LSTATUS RegOpenKeyEx(
  HKEY    hKey,
  LPCTSTR lpSubKey,
  DWORD   ulOptions,
  REGSAM  samDesired,
  PHKEY   phkResult
);

參數(shù)說明:

  • hKey: 指定要打開的基礎鍵的句柄,可以是 HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE 等。
  • lpSubKey: 指定相對于 hKey 的子鍵路徑。
  • ulOptions: 保留參數(shù),通??梢栽O置為 0。
  • samDesired: 指定鍵的訪問權限,例如 KEY_READ 或 KEY_WRITE。
  • phkResult: 接收指向打開的注冊表鍵的句柄的指針。

函數(shù)返回值:

  • 如果函數(shù)調用成功,返回 ERROR_SUCCESS。
  • 如果函數(shù)調用失敗,返回一個錯誤代碼。

RegEnumValue 用于列舉指定注冊表鍵中的值。它可以用來遍歷注冊表鍵中的所有值,以便你可以獲取鍵中包含的信息。以下是 RegEnumValue 的一般用法:

LSTATUS RegEnumValue(
  HKEY    hKey,
  DWORD   dwIndex,
  LPTSTR  lpValueName,
  LPDWORD lpcchValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE  lpData,
  LPDWORD lpcbData
);

參數(shù)說明:

  • hKey: 指定要列舉值的注冊表鍵的句柄。
  • dwIndex: 指定要檢索的值的索引。從 0 開始,逐漸遞增。
  • lpValueName: 接收值的名稱的緩沖區(qū)。
  • lpcchValueName: 接收值名稱的緩沖區(qū)大小的指針。在調用函數(shù)之前,你應該將其設置為緩沖區(qū)大小。
  • lpReserved: 保留參數(shù),通??梢栽O置為 NULL。
  • lpType: 接收值的數(shù)據(jù)類型的指針。
  • lpData: 接收值的數(shù)據(jù)的緩沖區(qū)。
  • lpcbData: 接收數(shù)據(jù)緩沖區(qū)大小的指針。在調用函數(shù)之前,你應該將其設置為緩沖區(qū)大小。

函數(shù)返回值:

  • 如果函數(shù)調用成功,返回 ERROR_SUCCESS
  • 如果函數(shù)調用失敗,返回一個錯誤代碼。

枚舉指定鍵值對中是否存在值,如果存在則循環(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;

  // 打開注冊表項
  LONG lRet = RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_ALL_ACCESS, &hKey);

  int index = 0;
  while (1)
  {
    // 枚舉注冊表鍵項
    lRet = RegEnumValue(hKey, index, szValueName, &dwBufferSize, NULL,
      &dwType, (unsigned char *)szValueKey, &dwKeySize);

    if (lRet == ERROR_NO_MORE_ITEMS)
      break;

    printf("序號: %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[])
{
  // 枚舉普通啟動項
  Enum_Regedit(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");
  Enum_Regedit(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");

  // 枚舉Boot啟動項
  // HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute
  Enum_Regedit(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\");

  // 枚舉ActiveX啟動項,在子鍵中添加SubPath即可完成開機自啟動.
  Enum_Regedit(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\");

  system("pause");
  return 0;
}

添加注冊表項

RegCreateKey 是用于創(chuàng)建或打開指定的注冊表鍵。如果鍵不存在,則它將被創(chuàng)建;如果存在,則它將被打開。以下是 RegCreateKey 的一般用法:

LSTATUS RegCreateKey(
  HKEY    hKey,
  LPCTSTR lpSubKey,
  PHKEY   phkResult
);

參數(shù)說明:

  • hKey: 指定要創(chuàng)建或打開的基礎鍵的句柄,可以是 HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINE 等。
  • lpSubKey: 指定相對于 hKey 的子鍵路徑。
  • phkResult: 接收指向創(chuàng)建或打開的注冊表鍵的句柄的指針。

函數(shù)返回值:

  • 如果函數(shù)調用成功,返回 ERROR_SUCCESS
  • 如果函數(shù)調用失敗,返回一個錯誤代碼。

RegSetValueEx 是用于在指定的注冊表鍵中設置一個值。它可以用于創(chuàng)建新的鍵值,也可以用于修改現(xiàn)有鍵值。以下是 RegSetValueEx 的一般用法:

LSTATUS RegSetValueEx(
  HKEY       hKey,
  LPCTSTR    lpValueName,
  DWORD      Reserved,
  DWORD      dwType,
  const BYTE *lpData,
  DWORD      cbData
);

參數(shù)說明:

  • hKey: 指定要設置值的注冊表鍵的句柄。
  • lpValueName: 指定要設置的值的名稱。
  • Reserved: 保留參數(shù),通??梢栽O置為 0。
  • dwType: 指定值的數(shù)據(jù)類型,例如 REG_SZ 表示字符串。
  • lpData: 指定要設置的值的數(shù)據(jù)。
  • cbData: 指定數(shù)據(jù)的大小。

函數(shù)返回值:

  • 如果函數(shù)調用成功,返回 ERROR_SUCCESS。
  • 如果函數(shù)調用失敗,返回一個錯誤代碼。

通過獲取自身進程名稱,并將該進程路徑寫入到CurrentVersion變量中實現(xiàn)開機自啟。

#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("添加自身啟動項成功 \n");
  }

  system("pause");
  return 0;
}

注冊表項不僅可以實現(xiàn)開機自啟動,由于Win系統(tǒng)都是在注冊表之上工作的,只要向指定位置寫入鍵值,即可實現(xiàn)許多不可思議的功能。

// 禁用系統(tǒng)任務管理器
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);
}

// 禁用注冊表編輯器
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 是用于檢索指定注冊表鍵中的指定值。它可以用來獲取注冊表鍵中的數(shù)據(jù),例如字符串、整數(shù)等。以下是 RegQueryValueEx 的一般用法:

LSTATUS RegQueryValueEx(
  HKEY    hKey,
  LPCTSTR lpValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE  lpData,
  LPDWORD lpcbData
);

參數(shù)說明:

  • hKey: 指定要查詢值的注冊表鍵的句柄。
  • lpValueName: 指定要查詢的值的名稱。
  • lpReserved: 保留參數(shù),通??梢栽O置為 NULL。
  • lpType: 接收值的數(shù)據(jù)類型的指針。
  • lpData: 接收值的數(shù)據(jù)的緩沖區(qū)。
  • lpcbData: 接收數(shù)據(jù)緩沖區(qū)大小的指針。在調用函數(shù)之前,你應該將其設置為緩沖區(qū)大小。

函數(shù)返回值:

  • 如果函數(shù)調用成功,返回 ERROR_SUCCESS。
  • 如果函數(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 \n", ret);

  system("pause");
  return 0;
}

刪除鍵值對

RegDeleteValue 是用于刪除指定注冊表鍵中的指定值。它可以用來刪除注冊表鍵中的數(shù)據(jù)值。以下是 RegDeleteValue 的一般用法:

LSTATUS RegDeleteValue(
  HKEY    hKey,
  LPCTSTR lpValueName
);

參數(shù)說明:

  • hKey: 指定要刪除值的注冊表鍵的句柄。
  • lpValueName: 指定要刪除的值的名稱。

函數(shù)返回值:

  • 如果函數(shù)調用成功,返回 ERROR_SUCCESS。
  • 如果函數(shù)調用失敗,返回一個錯誤代碼。

傳入需要刪除的注冊表位置,以及該表中鍵值對的名字即可完成刪除。

#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;
}

到此這篇關于C/C++實現(xiàn)Windows注冊表的基本操作的文章就介紹到這了,更多相關C++注冊表操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論