Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.047 c
2-1194960137
antonn
2007-11-13 16:22
2007.12.09
Tthread и внутренний цикл


2-1194847372
Layner
2007-11-12 09:02
2007.12.09
Запуск приложения от другого пользователя и выход(logout) из XP


15-1194867744
@!!ex
2007-11-12 14:42
2007.12.09
Проект вылетает


2-1194962162
Malik
2007-11-13 16:56
2007.12.09
ShellAPI парадокс и ничего более??


8-1170734577
avprohorov
2007-02-06 07:02
2007.12.09
как перерисовать только Image





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский