如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?

How to recover all the elements of a registry key? (last write time, type, value, name …) Is this the right method?

本文关键字:名称 类型 时间 方法 注册表 恢复 何恢复 元素      更新时间:2023-10-16

我想恢复注册表项的所有元素。 Windows API RegOpenEX和RegEnumKeyEx的方法,但我不确定这是正确的方法。下面是我的代码示例,那么是否应该使用这两种方法来检索此信息?

HKEY RegHkey;
Long RC=0;
DWORD a=0;
DWORD TMP=255;
FILETIME filetime;
LPWSTR lpName=nullptr;
LPWSTR lpClass=nullptr;
DWORD cchClasss=0;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\",0,KEY_READ,&RegHkey);
while(RC != ERROR_NO_MORE_ITEMS)
{
RC=RegEnumKeyEx(RegHkey, a, lpName, &TMP, nullptr, lpClass, &cchClass, &filetime);
if(RC==ERROR_SUCCESS)
{
std::cout<<"type= "<<cchClass<<std::endl;
//etc...
}
a++;
}

如果 RC==ERROR_SUCCESS我想检索类型、值和last_write_time....这是正确的方法吗?

不幸的是,这段代码中几乎所有内容都是错误的。

LPWSTR lpName=nullptr;
LPWSTR lpClass=nullptr;

每当函数参数的文档显示">指向缓冲区的指针"之类的内容时,都需要提供分配的缓冲区。

// The {} brackets zero-initialize the buffers.
wchar_t szName[255]{};
wchar_t szClass[255]{};
DWORD TMP=255;
DWORD cchClasss=0;

cchClass设置为零是错误的。你必须告诉函数,你的缓冲区实际上有多大(它可以存储多少个字符,包括"\0")。变量TMP没有有意义的名称,cchName会更一致:

// No need to hardcode the array size.
DWORD cchName  = ARRAYSIZE(szName);
DWORD cchClass = ARRAYSIZE(szClass);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\",0,KEY_READ,&RegHkey);

缺少函数是否成功的检查。打开注册表项可能会由于多种原因而失败,例如权限不足:

DWORD res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\",0,KEY_READ,&RegHkey);
if(res == ERROR_SUCCESS)
{
// do something with the registry key
} 
while(RC != ERROR_NO_MORE_ITEMS)

RegEnumKeyEx由于完成枚举以外的其他原因而失败时,您有一个无限循环。正确的条件是RC == ERROR_SUCCESS

RC=RegEnumKeyEx(RegHkey, a, lpName, &TMP, nullptr, lpClass, &cchClass, &filetime);

注册表项SOFTWAREMicrosoftWindowsCurrentVersionRun的子项是值,因此必须改用RegEnumValueW()

确保在使用完注册表项后也调用RegCloseKey()