小弟想用Hook让自己的程序在后台锁定一个注册表的特定键值
如果有程序访问~将被这个程序自动屏蔽掉,然后返回刚才操作注册表的那个程序的名称,路径之类的信息~~~
请问该如何实现
如果将这方面的API作为过程或者函数写入DLL里面
那么,改用什么样的方法调用,才能达到随系统启动后最快锁定注册表,并监视~~

解决方案 »

  1.   

    ?????你是不是问过一次了??
    我好象回答过这个问题。
    WH_GETMESSAGE Installs a hook procedure that monitors messages posted to a message queue. For more information, see the GetMsgProc hook procedure.
    我没做过,仅提供建议
    用wh_getmessage钩子,好象注册表改动了要发送WM_SETTINGCHANGE之类的消息。
    好象是吧
      

  2.   

    unit reg1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,registry,StdCtrls;constmachine_rootkey=HKEY_LOCAL_MACHINE;user_rootkey=HKEY_CURRENT_USER;defaultuser_rootkey=HKEY_USERS;subkey1='SOFTWARE';subkey2='SOFTWARE';function regmonitor(hkeys:hkey;keys:string):boolean;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Memo1: TMemo;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}function regmonitor(hkeys:hkey;keys:string):boolean;varreg1:tregistry;beginreg1:=tregistry.Create;reg1.RootKey:=hkeys;tryreg1.OpenKey(keys,false);//我的问题是在这下面的几句,当我执行时,如果注册表里我指定的键没被改变过,程序//好像失去响应一样,你试试就知道了,也许要用多线程才行,不过我后来没去试了application.ProcessMessages;if RegNotifyChangeKeyValue(reg1.CurrentKey,false,REG_NOTIFY_CHANGE_NAME+REG_NOTIFY_CHANGE_LAST_SET,0,false)=ERROR_SUCCESS thenresult:=trueelseresult:=false;finallyreg1.CloseKey;reg1.Free;end;end;procedure TForm1.Button1Click(Sender: TObject);beginmemo1.Lines.Clear;if regmonitor(machine_rootkey,subkey1) thenmemo1.Lines.Add('registry is monitored')elsememo1.Lines.Add('registry monitors fail');end;end.这个就是上次哪个兄弟发给我~~的
      

  3.   

    在自己的应用程序里去监视注册表的改动是不行的。必须要用全局HOOK.
      

  4.   

    挂接你想要监视的注册表函数,APIhook的例子狠多。