如何删除注册表中损坏的符号链接

2024-03-19

我正在对注册表进行一些编辑原型,以创建从一个区域到另一个区域的符号链接。我使用了以下代码:

HKEY hkFS;
HKEY hkSOFTWARE;
DWORD dwDisposition;
LSTATUS result;
result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE"), 0,
         KEY_CREATE_SUB_KEY , &hkSOFTWARE);
if (result == 0) {
   result = RegOpenKeyEx(hkSOFTWARE, _T("MyKey"), REG_OPTION_OPEN_LINK,
            KEY_WRITE | KEY_CREATE_LINK | KEY_WOW64_64KEY, &hkFS);
   if (result != ERROR_SUCCESS) {
      _tprintf(_T("%d\n"), result);
      result = RegCreateKeyEx(hkSOFTWARE, _T("MyKey"), 0, NULL,
               REG_OPTION_CREATE_LINK,
               KEY_WRITE | KEY_CREATE_LINK | KEY_WOW64_64KEY,
               NULL, &hkFS, &dwDisposition);
      _tprintf(_T("%d\n"), result);
   }
   if (result == ERROR_SUCCESS) {
      //result = ZwDeleteKey(hkFS);
      TCHAR target[] = _T("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MyKey");
      result = RegSetValueEx(hkFS, _T("SymbolicLinkValue"), 0, REG_SZ,
               (const BYTE const *)target, sizeof(target));
      if (result != ERROR_SUCCESS) {
         TCHAR msg[256];
         FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, 0, msg,
                       sizeof(msg) / sizeof(TCHAR), NULL);
         _tprintf(_T("Failed to write SymbolicLinkValue: %s"), msg);
      }
      RegCloseKey(hkFS);
   }
   else {
      TCHAR msg[256];
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, 0, msg,
                    sizeof(msg) / sizeof(TCHAR), NULL);
      _putts(msg);
   }
}
else {
   TCHAR msg[256];
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, 0, msg,
                 sizeof(msg) / sizeof(TCHAR), NULL);
   _tprintf(_T("Error opening SOFTWARE: %s"), msg);
}
RegCloseKey(hkSOFTWARE);

现在我有两个问题。

  1. 我无法删除在软件下创建的 MyKey 值。
  2. 尝试将 SymbolicLinkValue 写入 MyKey 时,即使以管理员身份运行,也会出现“访问被拒绝”错误。

我需要帮助清理我的注册表并使此代码正常工作。


我在以下位置找到了代码http://www.codeproject.com/Articles/11973/Registry-Symbolic-Links http://www.codeproject.com/Articles/11973/Registry-Symbolic-Links这解决了我所有的问题。

这是它用来删除代表符号链接的注册表项的代码:

typedef LONG NTSTATUS;

#if !defined(_NTSYSTEM_)
#define NTSYSAPI     DECLSPEC_IMPORT
#else
#define NTSYSAPI
#endif

NTSYSAPI
NTSTATUS
NTAPI
ZwDeleteKey(
    IN HANDLE KeyHandle
    );

typedef NTSYSAPI NTSTATUS  (NTAPI *ZW_DELETE_KEY_PROTO)(HANDLE);
static LONG DynZwDeleteKey(HKEY hKey)
{
    LONG lStatus = ERROR_SUCCESS;
    HMODULE hNTDll = LoadLibraryW( L"ntdll.dll" );
    if (hNTDll)
    {
      ZW_DELETE_KEY_PROTO lpfnZwDeleteKey =  (ZW_DELETE_KEY_PROTO)GetProcAddress(hNTDll, "ZwDeleteKey");
      if (lpfnZwDeleteKey)
        lStatus = lpfnZwDeleteKey(hKey);
      else
        lStatus = GetLastError();

      VERIFY(FreeLibrary(hNTDll));
    }
    else
        lStatus = GetLastError();

    return lStatus;
}

我上面的代码在创建链接时存在一些问题。 这些更正后的行使其正常工作:

result = RegCreateKeyEx(hkSOFTWARE, _T("MyKey"), 0, NULL,
         REG_OPTION_CREATE_LINK,
         KEY_ALL_ACCESS | KEY_CREATE_LINK | KEY_WOW64_64KEY,
         NULL, &hkFS, &dwDisposition);

...

result = RegSetValueExW(hkFS, L"SymbolicLinkValue", 0, REG_LINK,
         (const BYTE const *)target, lstrlen(target) * sizeof(WCHAR));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除注册表中损坏的符号链接 的相关文章

  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 无缝滚动瓷砖地图

    我正在开发一个自上而下的角色扮演游戏 并且想要实现无缝滚动地图 也就是说 当玩家探索世界时 地图之间没有加载屏幕 也没有通往下一个区域的 门 我有两种方法可以打破世界 在顶层 我有 区域 它只是 9 个 地图 的集合 这些区域仅由目录表示
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 数组与映射的性能

    我必须循环一个大数组中的元素子集 其中每个元素都指向另一个元素 问题来自于检测大图中的连接组件 我的算法如下 1 考虑第一个元素 2 将下一个元素视为前一个元素所指向的元素 3 循环直到没有发现新元素 4 考虑1 3中尚未考虑的下一个元素
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐