отслеживание и запрет изменений фона рабочего стола

Тема в разделе "WASM.WIN32", создана пользователем seiko, 10 ноя 2007.

  1. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    для этой цели думал обойтись хуком WH_GETMESSAGE на сообщение WM_WININICHANGE
    оно же WM_SETTINGCHANGE, но как оказалось хук таинственным образом не работает.
    В некоторых случаях этому есть объяснение: раздел реестра не меняется а просто заменяется файл виндоусовский файл Wallpaper1.bmp (это происходит при замене на стандартную картинку), но это лишь частичный случай

    вот собственно код длл

    жду ваших замечаний

    Код (Text):
    1. library Hook;
    2.  
    3. uses
    4.   Windows,
    5.   messages,
    6.   registry;
    7.  
    8. var
    9. SysHook:HHook=0;
    10. f1,f2,f3:string;
    11.  
    12.  
    13. procedure FirstCheck;
    14. Var reg:TRegistry;
    15. begin
    16. reg:=TRegistry.Create;
    17. try
    18. reg.RootKey:=HKEY_CURRENT_USER;
    19. reg.OpenKey('Control Panel\Desktop',false);
    20. f1:=reg.ReadString('Wallpaper');
    21. f2:=reg.ReadString('ConvertedWallpaper');
    22. f3:=reg.ReadString('OriginalWallpaper');
    23. reg.CloseKey;
    24. finally
    25. reg.Free;
    26. end;
    27. end;
    28.  
    29. function DesktopChange:boolean;
    30. Var reg:TRegistry; r1,r2,r3:string;
    31. Begin
    32. result:=false;
    33. reg:=TRegistry.Create;
    34. try
    35. reg.RootKey:=HKEY_CURRENT_USER;
    36. reg.OpenKey('Control Panel\Desktop',false);
    37. r1:=reg.ReadString('Wallpaper');
    38. r2:=reg.ReadString('ConvertedWallpaper');
    39. r3:=reg.ReadString('OriginalWallpaper');
    40. if (r1<>f1) or (r2<>f2) or (r3<>f3) then result:=true;
    41. reg.CloseKey;
    42. finally
    43. reg.Free;
    44. end;
    45. end;
    46.  
    47. function SysMsgProc(code:integer; wParam,lparam:longint):longint;
    48. stdcall;
    49. Var reg:TRegistry;
    50. begin
    51. if (code>0) or (wparam=0) then
    52. result:=CallNextHookEx(SysHook,Code,wParam,lParam)
    53. else
    54. If (PMsg(lparam)^.message=WM_WININICHANGE) and DesktopChange
    55. then
    56. begin
    57. reg:=TRegistry.Create;
    58. try
    59. reg.RootKey:=HKEY_CURRENT_USER;
    60. reg.OpenKey('Control Panel\Desktop',false);
    61. reg.WriteString('Wallpaper',f1);
    62. reg.WriteString('ConvertedWallpaper',f2);
    63. reg.WriteString('OriginalWallpaper',f3);
    64. reg.CloseKey;
    65. finally
    66. reg.Free;
    67. end;
    68. MessageBox(0,'Компьютеру не нравится эта картинка','Ошибка',MB_ICONERROR);
    69. end;
    70. result:=CallNextHookEx(SysHook,Code,wParam,lParam);
    71. end;
    72.  
    73. procedure RunStopHook(State:boolean) export; stdcall;
    74. begin
    75. if State then
    76. begin
    77. FirstCheck;
    78. SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0);
    79. end
    80. else
    81.  begin
    82.   UnhookWindowsHookEx(SysHook);
    83.   SysHook:=0;
    84.  end;
    85. end;
    86.  
    87. exports RunStopHook index 1;
    88. begin
    89. end.
    Но ставить ловушку на реестр - это неуниверсальное решение
    Поэтому я подумал о перехвате API. От перехвата SystemParametersInfoA я и так ничего не ждал, да конечно, перехват рабочий, только вот система не этой функцией пользуется
    Возник вопрос есть ли какая нибудь функция в ntdll или в kernel32 которая вызывается внутри SystemParametersInfo, каковы её парамеры, да и где вообще можно достатьчто-то вроде справочника так называемых недокументированных функции-переходников с префиксом Zw
     
  2. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Несколько отвлечённый вопрос, но: а не греховно ли применять в хуке столь блокирующую функцию, как MessageBox?
     
  3. MagnumGT

    MagnumGT New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    122
    CyberManiac
    Если сделать отдельным потоком вызов МсджБокса - то нет, не греховно )
     
  4. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Народ, я конечно понимаю, что вы знаете больше моего, но у меня в сообщении простые понятные вопросы, разве трудно на них ответить?
    если лень отвечать просто киньте ссылку на материал
    я например не могу найти бесплатно книгу Г. Неббета - Справочник по базовым функциям API Windows NT/2000, думаю она мне в этой теме поможет

    Чем так плохо использование MessageBoxа?
    Есть какие-то ограничения на вызов WinAPI в хуках?
     
  5. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    гы, впервые вижу как кто то юзает HInstance по прямому назначению ))
    сорре, не мог не отреагировать ))

    ..ограничений нет, а вопросы подобные твоим на rsdn прилично категоризированы и оформлены в общем..
    ..глянь(к примеру на delphi.sources.ru.. или soruces.ru/delphi..) глянь что кеддесы юзают чтобе воллпепер поменядь,
    отбери самых популярных способов штуки три, там увидишь на какие апихуки вешать, а на какие - просто проверка время от времени..
    ..кстате можно просто из своего приложения по таймеру проверять реестр и всё на места ставить..
    изврата меньше и стабильней.. и чего вас туда понесло..
    ..кароче лучше найди на винте WIN32.HLP и его зофтыкай =)..
     
  6. MagnumGT

    MagnumGT New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    122
    Comer_
    А можно примеры, как юзать Хистанц не по прямому назначению? ))))
     
  7. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ну я [...] такой делаю всегда так:
    CreateThread(nil,0,Proc,params,0,HInstance);
    ибо не приходецо декларировать лишние 4 байта ))
    или еще в циклах тоже.
    если в процедуре декларируется
    var i:integer;
    begin

    то это позор! ибо [...] стока писанины ради одной i? надо еёё альтернативно заменить ))
    пускай даже асом фставкой! =)))
    ХЕК!
     
  8. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    за ссылки спасибо

    насчёт изврата, прогу ишу для человека, чтобы она таким образом издевалась над своей мамой, когда сама будет в общаго, оставив на рабочем столе что-то вроде ПОХ... НА ВСЁ

    ага там прямо так и написано какие сообщения для ловушек ставить и как конкретно отслеживать изменения рабочего стола

    насчёт HINSTANCE - это надо очень ленивым быть чтобы таким образом над ним издеваться

    так всё таки чё насчёт перехвата, нет ли какой отдельной изначальной функции для установки новых обоев рабочего стола?
    почему не работают хуки, в том случае если меняешь реестр (то есть ставишь картинку не из стандартного списка)?
     
  9. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ага, есь!
    ZwUserChangeWallpaper юзай.

    ..прфф.. бред.. внедри дебаг уже..
    ..если валлп меняется посредством перезаписи реестра, то ставь хук на апи, и обрабатывай через апи, а не tregistry..
    ..всё время вспоминается как кез сказал про TFormGrabber =)

    //всё же не понимаю, если дело в одном лишь регистре.. то [...] регистр не править ежесекундно...?
     
  10. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    может достаточно назначить права доступа
    на файл и соответствующий раздел реестра ?
    (запретить изменение/удаление)
    ибо при наличии прав хуки не помогут.
     
  11. MagnumGT

    MagnumGT New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    122
    kropalik
    а при наличии мозга - вообще ничего не поможет )))

    Так что самого элементарного - делегирования прав вполне хватит
     
  12. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    А разве груповыми политиками это не перекрывается?
     
  13. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    погоди в списке экспортируемых функций ntdll я ничё подобного типа ZwUserChangeWallpaper и гугл ничё не выдал по ней и с zw и с nt префиксом?
    Мож её не существует или она в другой длл или по дркгому называеться?