本文已参与「新人创作礼」活动,一起开启掘金创作之路。
注册表
注册表是学习 Windows 中必不可少的一项,其存在的意义以及可以实现的目的是我们在不断深入学习Windows操作系统中一个很重要的分支。操作注册表的相关接口也是我们经常会打交道的一类windows API。
本文以 RegEnumValue 为主,演示如果通过该接口查询注册表项中某一路径下的所有信息。
适用场景:
- 该接口是查询注册表键值项的接口,具体到注册表子路径下。 关于注册表的接口可以看下边这张图,查询注册表子键的接口使用可以查看我其他的文章。
#关于上去的补充:这个子键和键值项的区分有好几个版本,有的把上图中的子键称作键值项。这个问题就是仁者见仁智者见智,在使用中能统一思想就好,避免造成误会。
- 查询某一大类项是,如通过注册表查询驱动程序、系统服务、自启动项等,这类注册表项往往有几十上百不等,要一次查询此类注册表项,便需要使用
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;
}