Приветствую!
Может меня кто-нибудь ткнуть носом почему приведенный ниже хук отлично работает в 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.
Как минимум потому что IE под вистой в Protected Mode работает с Low Integrity level и не может открыть именованный файлмаппинг созданный процессом с более высоким Integrity Level
А> Как минимум потому что 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!