65.9K
CodeProject 正在变化。 阅读更多。
Home

JumpTo RegEdit

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (8投票s)

2007年8月30日

CPOL

2分钟阅读

viewsIcon

35587

downloadIcon

886

一个 Sysinternals JumpTo 的克隆

Screenshot - RegEdit_JumpTo_Dlg.png

引言

你有没有想过 RegJump (来自 Sysinternals) 是如何工作的? 我第一次看到这个功能时感到非常惊讶,并想知道如何在 C# 中实现它。

这里提供的库使用 Windows 消息来自动化注册表编辑器。 树的内容通过 TVM_GETITEM 消息读取,并通过发出适当的 WM_Keyxx 消息来导航树。 唯一棘手的部分是处理 TVM_GETITEM 的内存分配。 由于消息被发送到另一个进程,因此消息使用的内存必须在目标进程中分配。 幸运的是,这可以通过使用 VirtualAllocEx 并提供对远程进程的句柄来完成。

Jeffrey Richter 在 MSJ 上有一篇文章 描述了它是如何实现的,Cory Nelson 写了一篇出色的 文章,使用了相同的技术,而 Chris Taylor 在他的博客上有一些 互操作代码,我可以使用。

Using the Code

以下代码片段显示了如何使用示例项目中的代码

RegEditLocator.Locate(@"HKCU\SOFTWARE\Microsoft\.NETFramework");

关注点

根据 MSDN,函数 OpenProcess 需要 SeDebugPrivilege 才能工作。 我试图通过在 XP 的普通用户帐户上运行示例程序来验证这一点,并惊讶地发现它有效。 在 Vista 中重复相同的测试得到了预期的结果:程序将无法在受限帐户下工作。

另一个让我不太舒服的问题是,该实现基本上是一种依赖于 Regedit.exe 内部结构的黑客行为。 这意味着 Microsoft 的任何热修复或安全更新都可能破坏代码。

这段代码旨在更多地作为一种关于如何使用 C# 中的消息来自动化应用程序的指南/示例,而不是一个可以用于生产代码的库。

历史

  • 2007 年 8 月 30 日:初始发布
© . All rights reserved.