【WIN】【C/C++】枚举 注册表子项

638 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

注册表

注册表是学习 Windows 中必不可少的一项,其存在的意义以及可以实现的目的是我们在不断深入学习Windows操作系统中一个很重要的分支。操作注册表的相关接口也是我们经常会打交道的一类windows API。

本文以 RegEnumValue 为主,演示如果通过该接口查询注册表项中某一路径下的所有信息。

适用场景:

  1. 该接口是查询注册表键值项的接口,具体到注册表子路径下。 关于注册表的接口可以看下边这张图,查询注册表子键的接口使用可以查看我其他的文章。

image.png

#关于上去的补充:这个子键和键值项的区分有好几个版本,有的把上图中的子键称作键值项。这个问题就是仁者见仁智者见智,在使用中能统一思想就好,避免造成误会。

  1. 查询某一大类项是,如通过注册表查询驱动程序、系统服务、自启动项等,这类注册表项往往有几十上百不等,要一次查询此类注册表项,便需要使用 RegEnumValue 接口去查询。

调用RegEnumValue获取注册表某一路径下的所有键值。

在这里插入图片描述

以下内容为代码,有不足之处还请指出。

/********************************************************************************
 *
 *        All rights reserved
 *
 *        filename		: RegEnumValue
 *        description	:
 *
 *        created by  mingming on Aug. 13th, 2021
 *
 ********************************************************************************/
#include <Windows.h>
#include <iostream>

int main(int argc, TCHAR* argv[])
{
	HKEY hKey;
	LPCTSTR lpSubKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

	DWORD samDesire = KEY_READ | KEY_WOW64_64KEY; //KEY_READ | KEY_WOW64_32KEY   HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, samDesire, &hKey) != ERROR_SUCCESS)
	{
		return 1;
	}

	TCHAR szValueName[MAX_PATH] = { 0 };
	BYTE szKeyName[MAX_PATH] = { 0 };
	LONG lStatus;
	DWORD dwIndex = 0;
	DWORD dwSizeValueName = MAX_PATH;
	DWORD dwSizeofKeyName = MAX_PATH;
	DWORD dwType;

	dwSizeValueName = MAX_PATH;
	dwSizeofKeyName = MAX_PATH;
	do
	{
		lStatus = RegEnumValue(hKey, dwIndex++, szValueName, &dwSizeValueName,
			NULL, &dwType, szKeyName, &dwSizeofKeyName);
		if (lStatus == ERROR_SUCCESS)
		{
			wprintf(L"Key Name = %s\n", (wchar_t *)szValueName);

		}

		dwSizeValueName = MAX_PATH;
		dwSizeofKeyName = MAX_PATH;

	} while (lStatus != ERROR_NO_MORE_ITEMS);

	RegCloseKey(hKey);

	system("pause");

	return 0;
}

在这里插入图片描述