如何使用RegReplaceKey()?

发布于 2024-12-17 22:46:29 字数 1454 浏览 0 评论 0原文

我尝试使用 RegReplaceKey() 替换注册表配置单元文件(新文件是使用 RegSaveKey() API 创建的),但它返回时显示 “文件已存在存在” 错误。如果我尝试先删除原始配置单元文件,则会失败并显示错误“文件正在使用”

我已经分配了适当的权限(SeBackupPrivilegeSeRestorePrivilege),用户是管理员,但没有运气。

有谁知道可能出了什么问题吗?这是代码:

...

// Setting privileges here, everything goes okay

nret := RegOpenKey(HKEY_LOCAL_MACHINE, 'system', hk);

if nret = 0 then
begin
  RegFlushKey(hk);
  if FileExists('C:\WINDOWS\system32\config\testhive') then
    DeleteFile('C:\WINDOWS\system32\config\testhive');
  nret := RegSaveKey(hk, 'C:\WINDOWS\system32\config\testhive', nil);
  if nret <> 0 then
    MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);

  // no errors so far, new file is created

  SeqNr := StartRestore('Before Registry Optimization');
  if FileExists('C:\WINDOWS\system32\config\system') then
  begin
    FileSetAttr('C:\WINDOWS\system32\config\system', 0);
    if not DeleteFile('C:\WINDOWS\system32\config\system') then
      MessageBox(0, pchar(SysErrorMessage(GetLastError)), '', 0);
      // error: file is in use
  end;

  nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive', 'C:\WINDOWS\system32\config\system');
  if nret <> 0 then
    MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);
    // error: file already exists
  if SeqNr <> 0 then
    EndRestore(SeqNr);

  RegCloseKey(hk);
end;

I'm trying to replace registry hive file by using RegReplaceKey() (new file is created with RegSaveKey() API), but it returns with "file already exists" error. If I try to delete original hive file first, it fails with an error "file is in use".

I've assigned proper privileges (SeBackupPrivilege and SeRestorePrivilege), user is an administrator, but no luck.

Does anyone have an idea what could be wrong? Here's the code:

...

// Setting privileges here, everything goes okay

nret := RegOpenKey(HKEY_LOCAL_MACHINE, 'system', hk);

if nret = 0 then
begin
  RegFlushKey(hk);
  if FileExists('C:\WINDOWS\system32\config\testhive') then
    DeleteFile('C:\WINDOWS\system32\config\testhive');
  nret := RegSaveKey(hk, 'C:\WINDOWS\system32\config\testhive', nil);
  if nret <> 0 then
    MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);

  // no errors so far, new file is created

  SeqNr := StartRestore('Before Registry Optimization');
  if FileExists('C:\WINDOWS\system32\config\system') then
  begin
    FileSetAttr('C:\WINDOWS\system32\config\system', 0);
    if not DeleteFile('C:\WINDOWS\system32\config\system') then
      MessageBox(0, pchar(SysErrorMessage(GetLastError)), '', 0);
      // error: file is in use
  end;

  nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive', 'C:\WINDOWS\system32\config\system');
  if nret <> 0 then
    MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);
    // error: file already exists
  if SeqNr <> 0 then
    EndRestore(SeqNr);

  RegCloseKey(hk);
end;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花落人断肠 2024-12-24 22:46:29

如果有人有类似的问题,我会回答我自己的问题。

错误出现在最后一个 RegReplaceKey() 参数中:它不应该指向实际和当前的配置单元注册表文件,而应该指向另一个临时文件

  nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive',
            'C:\WINDOWS\system32\config\testhive1');

因此,在这一行之前,我们不需要删除 hive 文件本身,而是删除第二个临时文件(以确保它不存在):

  if FileExists('C:\WINDOWS\system32\config\testhive1') then
  begin
    if not DeleteFile('C:\WINDOWS\system32\config\testhive1') then
      MessageBox(0, pchar(SysErrorMessage(GetLastError)), '', 0);
  end;

如果这样做,一切正常,Windows 会替换由 hk 确定的密钥,这是从收到的RegOpenKey()

In case someone has similar problem, I'll answer my own question.

The mistake was in last RegReplaceKey() parameter: it shouldn't point to actual and current hive registry file, but to another temp file:

  nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive',
            'C:\WINDOWS\system32\config\testhive1');

Consequently, prior to this line, we don't need to delete hive file itself, but the second temp file (to ensure it doesn't exist):

  if FileExists('C:\WINDOWS\system32\config\testhive1') then
  begin
    if not DeleteFile('C:\WINDOWS\system32\config\testhive1') then
      MessageBox(0, pchar(SysErrorMessage(GetLastError)), '', 0);
  end;

If done this way, everything works ok, and Windows replaces key determined by hk, which was received from RegOpenKey().

他不在意 2024-12-24 22:46:29

RegReplaceKey 将 Windows 设置为在重新启动 Windows 时使用支持注册表的文件。
您调用它并提供一个文件。
重新启动时它将使用它。
所以我怀疑这不是你想要的。

RegReplaceKey sets up windows to use the file backing the registry on restarting windows.
You call it and provide a file.
On restart it will use it.
So I suspect it's not what you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文