Форум: "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