Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Глобальные хуки в Висте.   Найти похожие ветки 

 
szimin ©   (2007-03-06 12:58) [0]

Приветствую!

Может меня кто-нибудь ткнуть носом почему приведенный ниже хук отлично работает в WinXP, а в Vista не дает запускаться Internet Explorer"у.
Т.е. в висте он тоже работает при запуске/закрытии других программ, но при запуске IE — он (IE) падает.

Есть мнение, что это связано с работой IE в защищенном режиме в Vista...
Есть описание (и вроде как решение) похожей проблемы:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1110280&SiteID=1
но заставить работать этот хук так и не получилось.
(если будет нужна уже портированная функция с того форума, то она имеется)

Или просто, кто-нибудь, поделитесь примером работающего хука в Висте при запущенном Internet Explorer"e.


library ProbaDLL;

{$R *.res}

uses
 SysUtils,
 Classes,
 Windows;

type
 TMapData = class
   Hooked: Boolean;
   Hook: HHOOK;
 end;

const
 MapSize = 1024;

var
 OldDllProc: TDLLProc;
 MapData: TMapData;
 MapHandle: THandle;
 Map: Pointer;

function HookFunc(Code: Integer; wP: wParam; lP: lParam): Longint; stdcall;
begin
 if Code=HCBT_CREATEWND then begin
//    SysUtils.Beep;
 end
 else begin
   if Code=HCBT_DESTROYWND then begin
   end;
 end;

 Result := CallNextHookEx(MapData.Hook, Code, wP, lP);
end;

function UnHook: Boolean; forward;
function SetHook: Boolean;
begin
 Result := False;

 if (MapData.Hooked) and (not UnHook) then
   Exit;

 MapData.Hook := 0;
 MapData.Hook := SetWindowsHookEx(WH_CBT, @HookFunc, hInstance, 0);

 if (MapData.Hook<>0) then begin
   MapData.Hooked := True;
   Result := True;
 end
 else
   MapData.Hooked := False;
end;

function UnHook: Boolean;
begin
 Result := False;

 if MapData.Hooked then begin
   if MapData.Hook<>0 then
     UnhookWindowsHookEx(MapData.Hook);

   MapData.Hook := 0;
   MapData.Hooked := False;

   Result := True;
 end;
end;

procedure GetMap;
var
 LoadDefault: Boolean;
begin
 MapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, MapSize, "ProbaHookoff");
 LoadDefault := (GetLastError<>ERROR_ALREADY_EXISTS);
 Map := MapViewOfFile(MapHandle, FILE_MAP_WRITE, 0, 0, MapSize);
 MapData := TMapData(Map);

 if LoadDefault then begin
   MapData.Hooked := False;
   MapData.Hook := 0;
 end;
end;

procedure FreeMap;
begin
 FlushViewOfFile(Map, MapSize);
 UnmapViewOfFile(Map);
 CloseHandle(MapHandle);
end;

procedure DLLEntryPoint(Reason: Integer);
begin
 case Reason of
   DLL_PROCESS_ATTACH: begin
     GetMap;
   end;
   DLL_PROCESS_DETACH: begin
     FreeMap;
   end;
   DLL_THREAD_ATTACH: begin
   end;
   DLL_THREAD_DETACH: begin
   end;
 end;

 if Assigned(OldDllProc) then
   OldDllProc(Reason);
end;

exports SetHook, UnHook;

begin
 OldDllProc := DllProc;
 DllProc := @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
trubin ©   (2007-03-06 13:45) [1]

Как вариант, если ты в ДЛЛ-ке только считываешь данные из проекции, то в CreateFileMapping использовать PAGE_READONLY, в MapViewOfFile использовать FILE_MAP_READ.
Функции установки\снятия хука перенести в хост файл, где и использовать всякие ..._WRITE флаги.

Вообще при переходе на висту много проблем возникает?


 
szimin ©   (2007-03-06 16:07) [2]

надо попробовать...

очень многое зависит от приложения
некоторые программы смогут спокойно работать и без переделок. Если им не будет мешать виртуализация в Висте. А некоторые придется переделывать.


 
szimin ©   (2007-03-07 10:26) [3]

сделал отдельно ReadWrite из своего процесса, read из других - не помогло

Как можно создать файлмэппинг с более низким Integrity Level ?


 
Edel_Peter   (2007-05-15 22:33) [4]

Кто-нибудь решил данную проблему? Тоже в Висте глобальный хук перестаёт работать при запущенном IE7. Весь инет перерыл, не могу решить проблему.


 
Rouse_ ©   (2007-05-16 10:10) [5]

1. function SetHook: Boolean; stdcall;
function UnHook: Boolean; stdcall;

2. На форуме MSDN был такой вопрос, но ответа на него не поступило. Видимо где-то косяк...


 
Eraser ©   (2007-05-17 21:43) [6]

> [0] szimin ©   (06.03.07 12:58)

какие права имеет программа, устанавливающая хук?

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


 
mrcat ©   (2007-05-25 13:29) [7]

Во-первых, в Vist"e существует разграничение привелегий уровня доступа для выполняемых программ (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ietechcol/dnwebgen/protectedmode.asp). Основная фишка в том, что приложение с низким уровнем привелегий не может получить доступ к файлам приложения с повышенным привелегий выше чем у себя. В частности для IE7 установлен самый низкий уровень - Low (когда включен Защищенный режим), а твой хук имеет уровень Medium. Как следствие невозможность доступа при CreateFileMapping. И во-вторых: User Interface Privilege Isolation (UIPI) - который не позволяет отправлять для Low-Level приложений пользовательские сообщения, если они не определены в т.н. фильтре.

Решение: читать и понимать http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ietechcol/dnwebgen/protectedmode.asp
Удачи.



Страницы: 1 вся ветка

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
11-1180896008
=BuckLr=
2007-06-03 22:40
2007.12.09
Защита участка RichEdit от изменения


9-1164339612
grouzd)ev
2006-11-24 06:40
2007.12.09
А не проводить ли нам небольшие игры по кодингу? (ч. 5)


2-1195122648
San1
2007-11-15 13:30
2007.12.09
как избавиться от зависания


15-1194588696
Slider007
2007-11-09 09:11
2007.12.09
С днем рождения ! 9 ноября 2007 пятница


15-1194848225
Slider007
2007-11-12 09:17
2007.12.09
С днем рождения ! 12 ноября 2007 понедельник