【文章标题】: 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处:
010063C4 |> \8BC6 MOV EAX,ESI
010063C6 |. 2D 00050000 SUB EAX,500 ; Switch (cases 500..501)
010063CB |. 74 1C JE SHORT regedit.010063E9
010063C4 >-\E9 47CC0500 JMP RegEdit.01063010
010063C9 90 NOP
010063CA 90 NOP
010063CB . 74 1C JE SHORT RegEdit.010063E9
01063010 B8 78030000 MOV EAX,378 ;EAX设置为888
01063015 3BF0 CMP ESI,EAX ;比较点击的菜单ID和888
01063017 75 06 JNZ SHORT RegEdit.0106301F ;不相等转程序原来010063C4的代码
01063019 57 PUSH EDI ;如果是我们的"转到"菜单,调用01063030处函数
0106301A E8 11000000 CALL RegEdit.01063030
0106301F 8BC6 MOV EAX,ESI ;程序原来
01063021 2D 00050000 SUB EAX,500 ;010063C4的代码
01063026 - E9 A033FAFF JMP RegEdit.010063CB ;跳回程序原流程
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!