Перехват записи в реестр
От: cahbi7 Россия  
Дата: 22.08.04 13:34
Оценка:
Здравствуйте!

Ни у кого не найдется примерчика кода, который ставит глобальный хук на событие записи в реестр и/или записи на жесткий диск (удаление/создание/изменение директорий, файлов)?
Чтение хелпа мне не особо помогло.

Просьба не отсылать к исходникам RegMon.

Заранее благодарен.
Re: Перехват записи в реестр
От: aGrey Литва  
Дата: 22.08.04 13:43
Оценка:
Здравствуйте, cahbi7, Вы писали:

C>Просьба не отсылать к исходникам RegMon.


А к DDK?
Re[2]: Перехват записи в реестр
От: cahbi7 Россия  
Дата: 22.08.04 20:02
Оценка:
Здравствуйте, aGrey, Вы писали:

G>А к DDK?


А что это такое? И где его найти?
Re[3]: Перехват записи в реестр
От: AMogil Россия  
Дата: 22.08.04 20:45
Оценка: :))) :)
Здравствуйте, cahbi7, Вы писали:

C>Здравствуйте, aGrey, Вы писали:


G>>А к DDK?


C>А что это такое? И где его найти?


Delphi Development Kit



Алексей.
Re: Перехват записи в реестр
От: TObject Россия  
Дата: 23.08.04 06:49
Оценка:
Здравствуйте, cahbi7, Вы писали:


var hEventHandle: THandle;
      ErrorCode: integer;
      rKey: HKEY;
      s: string;

 ............

 hEventHandle:=CreateEvent(nil,false,false,nil);
 rKey:=0;
 s:='SOFTWARE\YOUR_PRODUCT';
 ErrorCode:=RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                         PChar(s),
                         0,
                         KEY_NOTIFY,
                         rKey);
 if ErrorCode<>ERROR_SUCCESS then
  begin
   Result:=false;
   Exit;
  end;
 ErrorCode := RegNotifyChangeKeyValue(rKey,
                                     True,
                                     REG_NOTIFY_CHANGE_NAME,
                                     hEventHandle,
                                     True);
 if ErrorCode<>ERROR_SUCCESS then
  begin
   Result:=false;
   Exit;
  end;
 if WaitForSingleObject(hEventHandle,INFINITE)<>WAIT_FAILED then  Result:=true
  else Result:=false;
 RegCloseKey(rKey);
 RegCloseKey(hEventHandle);
... << RSDN@Home 1.1.4 @@subversion >>
Re[2]: Перехват записи в реестр
От: cahbi7 Россия  
Дата: 23.08.04 10:00
Оценка:
Здравствуйте, TObject, Вы писали:

TO>Здравствуйте, cahbi7, Вы писали:


[skipped]

это не совсем то. мне нужно перехватить само событие изменения в реестре чего либо, а не конкретного ключа.

кто-нибудь знает как это сделать (желательно на CBuilder)?
Re[3]: Перехват записи в реестр
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 23.08.04 10:03
Оценка:
Здравствуйте, cahbi7, Вы писали:

[]
C>это не совсем то. мне нужно перехватить само событие изменения в реестре чего либо, а не конкретного ключа.

C>кто-нибудь знает как это сделать (желательно на CBuilder)?


А вы внимательно читали документацию по RegNotifyChangeKeyValue? Придет вам "само событие изменения в реестре чего либо", придет. Достаточно только поставить RegNotifyChangeKeyValue на все рутовые ключи реестра — HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE etc.
Re[4]: Перехват записи в реестр
От: cahbi7 Россия  
Дата: 23.08.04 11:14
Оценка:
Здравствуйте, Flamer, Вы писали:

F>А вы внимательно читали документацию по RegNotifyChangeKeyValue? Придет вам "само событие изменения в реестре чего либо", придет. Достаточно только поставить RegNotifyChangeKeyValue на все рутовые ключи реестра — HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE etc.


поставил RegNotifyChangeKeyValue на все ключи. запихнул в отдельный поток.
но в этом случае программа узнает только об единичной попытке изменения реестра. приходится перезапускать поток.

З.Ы: можно как-то реализовать всё это через глобальный хук. но как?
на форуме эта тема поднималась не один раз, но ничего путнего так и не писалось. неужели никто не знает как это делается?
Re[5]: Перехват записи в реестр
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 23.08.04 14:49
Оценка: +1
Здравствуйте, cahbi7, Вы писали:


C>поставил RegNotifyChangeKeyValue на все ключи. запихнул в отдельный поток.

C>но в этом случае программа узнает только об единичной попытке изменения реестра. приходится перезапускать поток.

А внимательней перечитать документацию по RegNotifyChangeKeyValue? Там сказано — вызовите RegNotifyChangeKeyValue еще раз. В общем случае псевдокод потоковой функции будет выглядеть так:

void __fastcall TMyThread::Execute()
{
HANDLE hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
  while(!Terminated)
    {
      if(WaitForSingleObject(hEvent,100) == WAIT_OBJECT_0)
         {
             RegNotifyChangeKeyValue(key,TRUE,REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET,hEvent,TRUE);
         }
    }
}


В чем сложность-то?
... << RSDN@Home 1.1.3 stable >>
Re[5]: Перехват записи в реестр
От: akasoft Россия  
Дата: 23.08.04 19:41
Оценка: :)
Здравствуйте, cahbi7, Вы писали:

C>неужели никто не знает как это делается?


Все всё знают. Не знают только, зачем бороть свою лень, чтобы побороть твою. Чем твоя лень, например, лучше моей?
... << RSDN@Home 1.1.4 beta 2 rev. 168 Тишь да гладь, да Божья благодать >>
Re: Перехват записи в реестр
От: aGrey Литва  
Дата: 23.08.04 20:41
Оценка:
Здравствуйте, cahbi7

Вот тебе ссылочка (shareware, $500 (?), Delphi & Builder).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.