注册表

一、注册表

1.注册表实际上是一个管理配置系统运行参数的核心数据库,它记录了安装软件与运行程序的关联关系,计算机的硬件配置等信息。可以说计算机上所有针对硬件、软件、网络的操作都是源于注册表的。

2.注册表内的所有信息都是存放在 System.dat、User.dat 文件中的,其中 System.dat 文件包含了所有的

硬件信息和软件信息,User.dat 包含了用户信息。

3.修改注册表实际上就是对上述的文件进行修改。但是,我们不能对这些二进制数据文件进行直接修改,而

必须要借助于注册表编辑器regedit.exe

4.注册表编辑器regedit.exe实际上就是我们查看和修改注册表文件的图形界面。

 

二、注册表图示

 

三、注册表根键

Windows XP的注册表同样是以树形结构组织的。它由两个注册表子目录树组成:HKEY_LOCAL_MACHINE 和 HKEY_USERS。但是为了使注册表中的信息更易于查找,Windows XP 预定义了五个子目录树。

1.HKEY_LOCAL_MACHINE 根键中包含了操作系统、安装软件及硬件的相关信息。如计算机总线类型、系统可用

内存、当前装载了哪些设备驱动程序以及启动控制数据等。实际上,HKEY_LOCAL_MACHINE 根键保存着注册表

中的大部分信息,而另外4个根键都是其子键的别名。
2.HKEY_CURRENT_USER 根键包含这当前登录到计算机上的用户的配置文件。其子键包含着环境变量、个人程

序组、桌面设置、网络连接、打印机和应用程序首选项等信息。计算机把当前用户的信息映射到这个根键下,若未

激活用户配置,则它指向子键 HKEY_USERS\.DEFAULT。

3.HKEY_CLASSES_ROOT 根键记录的是系统中各类文件与其应用程序之间的对应关系,即记录了某类文件和打开

该类文件的应用程序之间的相互关联关系。HKEY_CLASSES_ROOT根键是HKEY_LOCAL_MACHINE\SOFTWA

RE\Classes 的快捷方式,是注册表的一个最大分支,包括了成千上万的与程序、文件相关联的键和值以及

ActiveX类的定义等内容。

4.HKEY_USERS根键下包含了计算机的所有用户的信息。用户根据个人爱好设置的诸如桌面、背景、开始菜单程序

项、应用程序快捷键、显示字体、屏幕节电设置等信息均记录在这个跟键中HKEY_CURRENT_USER 也是

HKEY_USERS 其中的的一个快捷键部分。

5.HKEY_CURRENT_CONFIG 根键包含的主要内容是计算机的当前配置情况,如显示器、打印机等可选外部

设备及其设置信息等。

 

四、常用的注册表的键值类型

REG_BINARY:未处理的二进制数据。多数硬件组件信息都是以二进制存储,而以十六进制格式显示在注册表编辑器中;
REG_WORD:数据由4字节长的数表示。许多设备驱动程序和服务的参数是这种类型,并在注册表编辑器中以二进制、十六进制或十进制的格式显示;
REG_EXPAND_SZ:长度可变的数据串。该数据类型包含在程序或服务使用该数据时确定的变量;
REG_MULTI_SZ:多重字符串。其中包含格式可被用户读取的列表。项用空格、逗号、或其他标记分开;
REG_SZ:固定长度的文本串。

 

五、打开和关闭注册表

注册表的键的打开:RegOpenKey 与 RegOpenKeyEx

 

LONG WINAPI RegOpenKeyEx(
  __in          HKEY hKey,
  __in          LPCTSTR lpSubKey,
  DWORD ulOptions,
  __in          REGSAM samDesired,
  __out         PHKEY phkResult
);


注册表关闭

 

 

LONG WINAPI RegCloseKey(
  __in          HKEY hKey
);

示例:

 

	HKEY hKey = NULL;
	TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
	if (lRet == ERROR_SUCCESS){
		MessageBox(_T("打开成功!"));
	}else{
		MessageBox(_T("打开失败!"));
	}

	RegCloseKey(hKey);

 

 

六、创建和删除注册表

注册表的键创建:RegCreateKey 与 RegCreateKeyEx (也可以打开指定的键,同时可以创建n层深的一个子键)

 

LONG WINAPI RegCreateKeyEx(
  __in          HKEY hKey,
  __in          LPCTSTR lpSubKey,
  DWORD Reserved,
  __in          LPTSTR lpClass,
  __in          DWORD dwOptions,
  __in          REGSAM samDesired,
  __in          LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __out         PHKEY phkResult,
  __out         LPDWORD lpdwDisposition
);

 

 

注册表的键删除:RegDeleteKey 与 RegDeleteKeyEx(x64)

 

LONG WINAPI RegDeleteKey(
  __in          HKEY hKey,
  __in          LPCTSTR lpSubKey
);

 

七、键信息的获取和子健枚举

键信息的获取:RegQueryInfoKey(API函数)

示例:

	HKEY hKey = NULL;
	TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
	if (lRet == ERROR_SUCCESS) {
		DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
		lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
		if (lRet == ERROR_SUCCESS) {
			//
		}
	}

子键的枚举操作:RegEnumKeyEx(API函数)

示例:

 

	HKEY hKey = NULL;
	TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
	if (lRet == ERROR_SUCCESS) {
		DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
		lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
		if (lRet == ERROR_SUCCESS) {
			//Enum for the sub keys
			DWORD dwNameLen = maxSubKeyLen+1;
			TCHAR *pszName = new TCHAR[maxSubKeyLen+1];
			for (DWORD dwIndex = 0; dwIndex < dwSubKeys; ++dwIndex) {

				ZeroMemory(pszName, dwNameLen);
				dwNameLen = maxSubKeyLen+1; //※※※

				RegEnumKeyEx(hKey, dwIndex, pszName, &dwNameLen, NULL, NULL, NULL, NULL);
				//Other operations
			}
			delete [] pszName;
		}
		RegCloseKey(hKey);
	}


八、键的备份与恢复

 

备份:RegSaveKey(第二个参数 lpFile 为保存信息的文件名称,这个文件必须是不存在的)

恢复:RegRestoreKey:

 

void CRegTestDlg::OnBnClickedBtn()
{
	HKEY hKey = NULL;
	TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	EnableTargetPriv(SE_BACKUP_NAME);
	LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
	if (lRet == ERROR_SUCCESS) {
		lRet = RegSaveKey(hKey, _T("C:\\123"), NULL);
		RegCloseKey(hKey);
	}
}


恢复:RegRestoreKey:
void CRegTestDlg::OnBnClickedBtn()
{
	HKEY hKey = NULL;
	TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	EnableTargetPriv(SE_RESTORE_NAME);
	LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
	if (lRet == ERROR_SUCCESS) {
		LPCTSTR lpszFile = _T("C:\\123");
		lRet = RegRestoreKey(hKey, lpszFile, REG_FORCE_RESTORE);
		RegCloseKey(hKey);
	}
}

BOOL EnableTargetPriv(LPTSTR lpszPrivilege)
{
	HANDLE hToken = NULL;
	TOKEN_PRIVILEGES tkp = {0};
	if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
		return FALSE;
	}
	if ( !LookupPrivilegeValue( NULL, lpszPrivilege, &tkp.Privileges[0].Luid ) ) {
		CloseHandle( hToken );
		return FALSE;
	}
	tkp.PrivilegeCount = 1;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

	if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ) ) {
		CloseHandle( hToken );
		return FALSE;
	}
	return TRUE;
}

 

九、键值

-------①、键值信息的获取:RegQueryValueEx

 

方式一:
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
	DWORD dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
	lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
	if (lRet == ERROR_SUCCESS) {
		DWORD dwType = 0;
		BYTE *lpData = new BYTE[maxValueDataLen+1];
		ZeroMemory(lpData, maxValueDataLen+1);
		lRet = RegQueryValueEx(hKey, _T("Edifier.EasyVOL"), NULL, &dwType, lpData, &maxValueDataLen);

		CString strValue;
		strValue.Format(_T("%s"), lpData);
		MessageBox(strValue);
		delete [] lpData;
	}
	RegCloseKey(hKey);
}

方式二:
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
	DWORD dwType = 0, dwDataLen = 0;
	BYTE *lpData = NULL;
	lRet = RegQueryValueEx(hKey, _T("Edifier.EasyVOL"), NULL, &dwType, NULL, &dwDataLen);
	lpData = new BYTE[dwDataLen+1];
	ZeroMemory(lpData, dwDataLen+1);
	lRet = RegQueryValueEx(hKey, _T("Edifier.EasyVOL"), NULL, &dwType, lpData, &dwDataLen);
	RegCloseKey(hKey);

	CString strValue;
	strValue.Format(_T("%s"), lpData);
	MessageBox(strValue);
	delete [] lpData;
}

 

-------②、键值信息的设置:RegSetValueEx

 

HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
	CString strPath = _T("D:\\Program Files\\SoftWare\\123.exe");
	RegSetValueEx(hKey, _T("Edifier.EasyVOL"), 0, REG_SZ, (LPBYTE)strPath.GetBuffer(), strPath.GetLength()*sizeof(TCHAR));

	strPath = _T("G:\\VMWare\\CentOS\\abc.exe");
	RegSetValueEx(hKey, _T("TestRun"), 0, REG_SZ, (LPBYTE)strPath.GetBuffer(), strPath.GetLength()*sizeof(TCHAR));
	RegCloseKey(hKey);
}

 

-------③、键值的删除:RegDeleteValue

 

HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
	RegDeleteValue(hKey, _T("TestRun"));
	RegCloseKey(hKey);
}

 

-------④、键值的枚举操作:RegEnumValue

 

 

HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
	DWORD dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
	lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
	if (lRet == ERROR_SUCCESS) {
		DWORD dwNameLen = maxValueNameLen+1;
		TCHAR *pszName = new TCHAR[dwNameLen];

		DWORD dwType = 0;
		DWORD dwValueDataLen = maxValueDataLen+1;
		BYTE *lpValueData = new BYTE[dwValueDataLen];

		for (DWORD dwIndex = 0; dwIndex < dwValueCount; ++dwIndex) {
			dwNameLen = maxValueNameLen+1;
			ZeroMemory(pszName, dwNameLen);

			dwValueDataLen = maxValueDataLen+1;
			ZeroMemory(lpValueData, dwValueDataLen);

			lRet = RegEnumValue(hKey, dwIndex, pszName, &dwNameLen, NULL, &dwType, lpValueData, &dwValueDataLen);
			//Other operations
			CString strValueData;
			strValueData.Format(_T("%s"), lpValueData);
		}
		delete [] pszName;
		delete [] lpValueData;
		RegCloseKey(hKey);
	}
}




 

转载于:https://www.cnblogs.com/jadeshu/p/10663709.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值