离线方式读写WINDOWS注册表

作者:张宇,北亚硬盘数据恢复中心,转载请联系作者,如果实在不想联系作者,至少请保留版权,谢谢。

  本文仅在WINDOWS XP及WINDOWS 2003上测试通过,其他平台未知。

  我在2007年曾经草拟了一篇文章《成功修复一例WINDOWS系统反复登陆,无法启动》,当时的想法是觉得这个过程很有意义,想把解决过程记录下来,结果是日复一日的忙碌,最终不了了之。其实在解决问题的过程中,体会最深的便是在系统无法启动的情况下,同时又没有注册表备份,如何修改它的错误的注册表键值。

  一个简单的方法是利用注册表编辑器的加载配置单元。

  WINDOWS XP和WINDOWS 2003的注册表文件通常在%SystemRoot%/system32/config 文件夹下:SAM、SECURITY、SOFTWARE、SYSTEM,当操作系统无法启动时,可以把这块无法启动的硬盘挂载在另外的WINDOWS上,或者通过PE进入系统,然后加载原先系统错误的注册表文件,再对相应键值进行修改。

  具体流程为:

  1. 打开“注册表编辑器”。
  2. 在注册表树(左侧)中,单击 HKEY_USERS 或者 HKEY_LOCAL_MACHINE 项。
  3. 在“文件”菜单上,单击“加载配置单元”。
  4. 在“查找范围”中,单击包含要加载的配置单元的驱动器、文件夹、网络计算机和文件夹。
  5. 单击“打开”。
  6. 在“项名称”中,键入要指派给配置单元的名称(随意起个名称就行了,作为子键名称),然后单击“确定”。


  注意事项:
  1、“加载配置单元”和“卸载配置单元”只影响 HKEY_USERS 和 HKEY_LOCAL_MACHINE 项,并且只有选中这些预定义项时它们才是活动的。在将配置单元加载到注册表中时,配置单元成为其中一个项的子项。
  2、修改完成后,别忘记卸载配置单元(在regedit中选择先前加载到系统中的配置单元,再打开文件菜单,选择“卸载配置单元”)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Qt的QSettings类来读写注册表数据,也可以直接调用Windows API来读写注册表数据。 以下是调用Windows API读写注册表数据的示例代码: ```c++ #include <windows.h> // 读取注册表中的字符串值 bool readRegistryString(HKEY hKey, const QString& subKey, const QString& valueName, QString& value) { HKEY hSubKey = NULL; DWORD dwType = REG_SZ; DWORD dwSize = 0; if (RegOpenKeyEx(hKey, subKey.toStdWString().c_str(), 0, KEY_READ, &hSubKey) != ERROR_SUCCESS) return false; if (RegQueryValueEx(hSubKey, valueName.toStdWString().c_str(), NULL, &dwType, NULL, &dwSize) != ERROR_SUCCESS) { RegCloseKey(hSubKey); return false; } if (dwType != REG_SZ) { RegCloseKey(hSubKey); return false; } WCHAR* pBuffer = new WCHAR[dwSize / sizeof(WCHAR)]; if (RegQueryValueEx(hSubKey, valueName.toStdWString().c_str(), NULL, NULL, (LPBYTE)pBuffer, &dwSize) != ERROR_SUCCESS) { RegCloseKey(hSubKey); delete[] pBuffer; return false; } value = QString::fromWCharArray(pBuffer, dwSize / sizeof(WCHAR)); delete[] pBuffer; RegCloseKey(hSubKey); return true; } // 写入字符串值到注册表中 bool writeRegistryString(HKEY hKey, const QString& subKey, const QString& valueName, const QString& value) { HKEY hSubKey = NULL; if (RegCreateKeyEx(hKey, subKey.toStdWString().c_str(), 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) != ERROR_SUCCESS) return false; if (RegSetValueEx(hSubKey, valueName.toStdWString().c_str(), 0, REG_SZ, (LPBYTE)value.toStdWString().c_str(), (value.length() + 1) * sizeof(wchar_t)) != ERROR_SUCCESS) { RegCloseKey(hSubKey); return false; } RegCloseKey(hSubKey); return true; } int main(int argc, char *argv[]) { // 读取注册表中的字符串值 QString value; if (readRegistryString(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", "Shell Folders", value)) qDebug() << value; // 写入字符串值到注册表中 if (writeRegistryString(HKEY_CURRENT_USER, "Software\\MyCompany\\MyApp", "MyValue", "Hello World")) qDebug() << "Write registry success."; return 0; } ``` 以上代码演示了如何使用Windows API来读写注册表数据。其中,readRegistryString函数用于读取注册表中的字符串值,writeRegistryString函数用于将字符串值写入注册表中。在main函数中,我们首先使用readRegistryString函数读取注册表中的Shell Folders值,并输出到控制台上,然后使用writeRegistryString函数将字符串值Hello World写入到注册表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值