Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 136. - hlídání registru

Jan Šindelář - 28.4.2004

Sledování změn v konkrétní části registru se může hodit pro různé účely a přitom implementace podobné funkce je poměrně snadná. Řada aplikací jako jsou například antivirové programy či jiné "bezpečnostní" programy podobnou kontrolou disponují, takže si pojďme něco podobného taky zkusit.

Cílem našeho dnešního snažení bude velmi jednoduchá aplikace, jejíž formulář bude obsahovat pouze Memo. Do něj budou vypisovány změny v zadané větvi registru, které za běhu programu nastaly. Kontrola bude prováděna v samostatném procesu (vláknu) naší aplikace, takže nebude nijak zatěžovat běh našeho programu a bude odebírat jen zanedbatelné množství systémových zdrojů. O samotné zachycení změny se pak postará funkce RegNotifyChangeKeyValue z Windows API.

Náš zdrojový kód bude pro tentokrát trochu komplikovanější, protože bude obsahovat dvě jednotky (viz. dále). Pro vaše pohodlí jsem tedy připravil kompletní ukázkový projekt, který si budete moci stáhnout na konci článku.

Velkou část práce za nás tedy vykoná zmiňovaná funkce RegNotifyChangeKeyValue, které řekneme, jakou větev má sledovat, zda se mají kontrolovat i jednotlivé vnořené větve a pokud ke změně dojde, je vyvolána příslušná událost, která je předána formou zprávy hlavnímu oknu naší aplikace.

Začneme tvorbou nového projektu. Na prázdný formulář stačí umístit zmiňované Memo, které bude sloužit pro výpis výsledků. V dalším kroku nás čeká vytvoření nového vlákna - threadu, které bude obsahovat vlastní kontrolu registru. Z hlavní nabídky Delphi zvolíme File -> New -> Other. Na první záložce zobrazeného dialogu pak najdeme objekt Thread Object, který zvolíme a poté již jen definujeme jeho název. Vytvoří se nám nová jednotka právě s tímto objektem. Tu poté hned přidáme do uses jednotky našeho hlavního formuláře.

Do metody Execute vytvořeného threadu pak vložíme hlavní část kódu. Jedná se v podstatě o „nekonečný cyklus“, který je ukončen spolu s programem. Při odchycení změny v registru je pak poslána zpráva WM_REGCHANGE a naše hlavní okno pak zprávu zpracuje.

V události OnCreate našeho hlavního formuláře nejprve vytvoříme příslušný objekt pro sledování, naplníme jej vlastnostmi (kterou větev kontrolujeme apod..) a spustíme kontrolu. Důležitá je i vlastnost Filtr, která sice není v příkladu použita, protože hlídáme veškeré změny, ale změnou tohoto číselného parametru lze omezit kontrolu například jen na kontrolu smazání či přidání klíče (hodnota REG_NOTIFY_CHANGE_NAME), změnu atributů klíče (REG_NOTIFY_CHANGE_ATTRIBUTES), změnu hodnot klíče (REG_NOTIFY_CHANGE_LAST_SET) a konečně změnu nastavení tzv. security descriptoru (REG_NOTIFY_CHANGE_SECURITY). Příslušná omezení se dají pochopitelně libovolně kombinovat.

V události OnDestroy pak příslušný objekt a s ním samozřejmě i kontrolu zrušíme. Poslední důležitá procedura hlavního formuláře pak zpracovává došlé zprávy o změnách a vypisuje výsledky (tedy čas a název větve) do připraveného Mema.

Tento jednoduchý příklad slouží pouze k pasivnímu monitoringu změn a pokud bychom chtěli registry opravdu hlídat, tzn. zamezit například uživateli (nebo viru?) provádět nějaké změny, musíme pro příslušnou větev znát původní (správné) hodnoty a při změně je opět obnovit do původního stavu.

Jak vidíte, celý postup není příliš složitý a doporučuji prostudovat zdrojový kód (hlavně "monitorovací část"), kde najdete ještě pár detailů navíc (hlavně deklaraci příslušných objektů a jejich vlastností). Zdrojový projekt, vytvořený v Delphi7, tedy stahujte zde.