Глобальные хуки в Vista
От: szimin  
Дата: 06.03.07 09:50
Оценка:
Приветствую!

Может меня кто-нибудь ткнуть носом почему приведенный ниже хук отлично работает в 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.
Re: Глобальные хуки в Vista
От: Аноним  
Дата: 07.03.07 02:50
Оценка:
Как минимум потому что IE под вистой в Protected Mode работает с Low Integrity level и не может открыть именованный файлмаппинг созданный процессом с более высоким Integrity Level
Re[2]: Глобальные хуки в Vista
От: szimin  
Дата: 07.03.07 07:23
Оценка:
А> Как минимум потому что IE под вистой в Protected Mode работает с Low Integrity level
А> и не может открыть именованный файлмаппинг созданный процессом с более высоким Integrity Level

а как создать файлмэппинг с более низким уровнем?
Танцевал с бубном вокруг этого:

  InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION1);
  SetSecurityDescriptorDACL(@SD, True, nil, False);

  SA.nLength := SizeOf(SA);
  SA.bInheritHandle := False;
  SA.lpSecurityDescriptor := @SD;

  MapHandle := CreateFileMapping($FFFFFFFF, @SA, PAGE_READWRITE, 0, MapSize, 'Local\ProbaHookoff');


ничего не дало
пробовал это:

  InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION1);
  ConvertStringSecurityDescriptorToSecurityDescriptorA('S:(ML;;NW;;;LW)', SECURITY_DESCRIPTOR_REVISION1, @SD, nil);

тоже не вышло... как не получилось и с
GetSecurityDescriptorSacl
SetSecurityDescriptorSacl

В общем я в ступоре... HELP!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.