【文章标题】: PEDIY---让RegEdit更人性(一)增加 "转到(Goto)" 功能!
【文章作者】: slore
【作者邮箱】: slorelee@yahoo.com.cn
【软件名称】: regedit.exe
【下载地址】: 附件
【使用工具】: OD,Restorator,ZeroAdder
【操作平台】: Windows XP SP3
本次修改的regedit已经修改一次,改了regedit的标题,和本身的类名,
以及删除了对通过注册表设置DisableRegEditTools来禁用注册表编辑器的部分。
这样做的目的是打造一个不被禁用的注册表编辑器(特殊场合需要这样),但是改动并
不影响下面操作,所以如果你要在默认的注册表编辑器增加该功能,拷贝我的补丁到
原注册表编辑器即可。
PEDIY当然先开Windows的刀了……(我不是第一人哦,记事本,计算器都被改的不行了。)
但是诸多修改只是练手,个人更注重实用性。
继先前对windows 任务管理器的增强之后,今天我们来让注册表编辑器更人性吧。
对任务管理器DIY的链接:
http://bbs.pediy.com/showthread.php?t=95905
前言
一直以来微软各个操作系统上的注册表编辑器都没有转到功能,经常要查看注册表的时候
难免要麻烦一番,一级一级的展开,看来是MS不喜欢我们去动注册表吧。虽然打首字母可以
快速定位,但是还是很麻烦,你觉得呢?
很多第三方注册表编辑器,提供了这个功能,但是基本需要注册,而且功能对于我来说有些
太繁琐了,主要三方动不动就更新……
如果你觉得当前对注册表编辑器的使用你很满意了,那么下面的内容你当作PEDIY的练手吧。
让注册表快速定位是我还不会一点编程的时候就希望用的,每次打开注册表编辑器都感慨,
如此简单的功能为什么不给呢……还好我的电脑(资源管理器)这个更经常用的东西是有的。
毕竟用人家的东西,不满也只好自己忍受了。
曾经用VB写过一个"地址栏",其实是一个程序,用SetParent把自己做到注册表编辑器上,但是
不会Hook他的WM_RESIZE消息,拖动下窗口就不见了……一直就搁浅了(而且用总是Shell的嫌
疑,效率也不高)。
过了5,6年,今天决定○一下自己这个梦。给注册表编辑器进行DIY,加上这个功能!
让RegEdit更人性(一)增加 "转到(Goto)" 功能!
让RegEdit更人性(二)添加 "地址栏" 功能!
(计划中...,能力还不够,还需了解些知识)
大家都知道注册表编辑器有LastKey和收藏夹为大家方便访问。所以里面一定有代码去实现,所
以我们去找下吧。OD打开Regedit,查找参考字符串找到LastKey有2个,进去看下一个后面用了
SetRegValue应该是关闭的时候保存当前位置的,下断Run也证实了。
进另一个地方F8单步看读取了LastKey后到了下面:
01005D4F |. 50 PUSH EAX
01005D50 |. E8 D2E7FFFF CALL RegEdit.01004527
跟进去发现这个就是我们要找到的函数啦,而且调用很方便,
就一个参数要去的路径字符串的指针地址(字符串是Unicode方式存储)。
这个CALL RegEdit.01004527我们就记下来。
下面我们需要一个对话框,还有对应菜单选项。
用资源编辑器打开Regedit,
对话框我们先打开104资源
104 DIALOGEX 32, 24, 252, 53, 0
STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_3DLOOK | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "加载配置单元"
FONT 9, "宋体", 400, FALSE
{
LTEXT "项名称(&K):", -1, 6, 6, 134, 8
EDITTEXT 1001, 6, 17, 240, 12, ES_AUTOHSCROLL
DEFPUSHBUTTON "确定", 1, 142, 35, 50, 14
PUSHBUTTON "取消", 2, 196, 35, 50, 14
}
做简单修改,去掉DS_CONTEXTHELP样式(右上角的帮助按钮),
改改名称,把EDITTEXT的ID改为1000,并设置确定按钮默认禁用(代码有解释),
并添加为118号对话框资源。
结果如下图所示:

下面增加菜单项,转到菜单103处:
在查看菜单项我们修改如下:
POPUP "查看(&V)", 514
{
MENUITEM "状态栏(&B)", 668
MENUITEM "", -1, MFT_SEPARATOR
MENUITEM "拆分(&L)", 670
MENUITEM "", -1, MFT_SEPARATOR
MENUITEM "显示二进位数据(&D)", 679
MENUITEM "", -1, MFT_SEPARATOR
MENUITEM "转到(&G)...\tCtrl+G", 888
MENUITEM "", -1, MFT_SEPARATOR
MENUITEM "刷新(&R)\tF5", 648
}
888是菜单的ID不重复就好了,我们给它加个加速键。
资源编辑器打开快捷键(ACCELERATOR 资源)列表,在后面追加如下:
888: "Ctrl+G"
//菜单ID和对应快捷键
看了下默认的空间似乎都不大,所以自己用ZeroAdder添加了一个1KB的区段。
---------------------------
Cave Info
---------------------------
Section RVA Offset Size
.text 00018908 00017D08 000000F8
.data 00019229 00018029 000001D7
.rsrc 0006236D 0002056D 00000093
Slore 00063008 00020608 000003F8
---------------------------
确定
---------------------------
菜单消息处理
01006327 |. /0F8F 97000000 JG RegEdit.010063C4 '这里打开我们的对话框
比768(0x300)大的ID号从这里跳转处理。。。我们的菜单888(0x378)就加在这里吧
(其实这条判断链上能写地方很多,自己凭喜好选择吧)。
我们写补丁的地址在 01063010
所以将010063C4处:
修改为:
补丁分为三段,第一段是菜单处理:
第二段补丁打开我们的"转到"对话框
这个代码完全是COPY程序打开"删除收藏夹"对话框的代码,比较短很简单
就是调用DialogBoxParamW打开窗口。自己看下DialogBoxParamW的参数
列表就很明了了。
打开"删除收藏夹"对话框的代码
我们的代码:
第三段补丁我们的"转到"对话框的回调函数(消息处理)
这里可以参考"添加收藏夹"的回调函数(010049E2),代码和我
们的补丁差不多就不在这里重复了,有兴趣的话可以比对下不
同之处。
注:
WM_INITDIALOG,272,0110,在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
WM_COMMAND,273,0111,当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
效果预览:
附件列表
Pic1.PNG
Pic2.GIF
DIY-注册表编辑器.txt
RegEdit原版(XP SP3).exe
RegEdit-Plus.exe
完,希望大家喜欢此次DIY。
10596A0 HWND