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

Вниз

Хук в разных ОС   Найти похожие ветки 

 
Spawn ©   (2003-10-30 15:53) [0]

Сделал хук дял перехвата запуска одной проги. В ХП все нормально работает. Если же попробовать запустить прогу в 98 или МЕ, то она завершается с критической ошибкой. Причем в Хуке я учел, что до Win 2000 нужно было его Хендл делать доступным для всех процессов, например через Memory Mapped Files.

Вот код, работающий в ХП:

library ArtHook;

uses UArtHook;

exports
GetID,
SetHook,
FreeHook;

begin
end.



unit UArtHook;

interface

uses
SysUtils,
Windows,
UVariables;
{Dialogs;}

const
DataSize=SizeOf(Integer);
HookHandleName="hHookHandleName";

var
hHook:PHandle;
hMapFile:THandle;
Hooked:Boolean=False;

function GetID:integer;stdcall;
function SetHook:Boolean; stdcall;
function FreeHook:Boolean; stdcall;

implementation

function CBTProc(Code:integer;wParam:Integer;lParam:Integer):longint; stdcall;
var
ClassName:array[0..255] of AnsiChar;
hFile:THandle;
wPrm:Integer;
begin
if code < 0 then
begin
Result:=CallNextHookEx(hHook^, Code, wParam, lParam);
Exit;
end;

case Code of
HCBT_CREATEWND:
begin
GetClassName(wParam, ClassName, 256);

if (AnsiCompareStr(ClassName, XXX_MAIN_CLASS)=0) then
begin
Result:=1;
CallNextHookEx(hHook^, Code, wParam, lParam);
Exit;
end;

if (AnsiCompareStr(ClassName, XXX_MAIN_CLASS)=0) then
begin
if (FindWindow(XXX_MAIN_CLASS, nil)=0) then
begin
try
hFile:=CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
0 ,nil,OPEN_EXISTING,0,0);
wPrm:=Integer(GetFileSize(hFile,nil)=XXX_FILE_SIZE);
SendMessage(FindWindow("какая - то прога",nil),WM_XXX_FS_INVALID, wPrm, 0);
finally
CloseHandle(hFile);
end;
end
else
begin
Result:=1;
CallNextHookEx(hHook^, Code, wParam, lParam);
Exit;
end;
end;

end;
end;

Result:=CallNextHookEx(hHook^, Code, wParam, lParam);
end;

function SetHook:Boolean; stdcall;
begin
hHook^:=SetWindowsHookEx(WH_CBT, @CBTProc, hInstance, 0);
Result:=hHook^<>0;
end;

function FreeHook:Boolean; stdcall;
begin
Result:=UnhookWindowsHookEx(hHook^);
end;

initialization
hMapFile:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
0, DataSize, HookHandleName);
if hMapFile=0 then
raise Exception.Create("Error MMF Handle");
hHook:=MapViewOfFile(hMapFile, File_Map_Write, 0, 0,
DataSize);

finalization
UnMapViewOfFile(hHook);
CloseHandle(hMapFile);

end.


 
Digitman ©   (2003-10-31 08:52) [1]


> она завершается с критической ошибкой


с какой ? конкретно и дословно ?


 
minegod   (2003-10-31 10:22) [2]

а могет надо DataSize=SizeOf(ДВОРД), а не DataSize=SizeOf(Integer)?


 
Dima_dvp ©   (2003-11-01 00:36) [3]

minegod:
Дельный совет:)


 
Spawn ©   (2003-11-04 13:56) [4]

Digitman ©
Вот что пишет при возниконовении ошибки:
Программа AUTORIZATOR вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 0000:00000000.
Регистры:
EAX=00000000 CS=0000 EIP=00000000 EFLGS=00000000
EBX=00000000 SS=0000 ESP=00000000 EBP=00000000
ECX=00000000 DS=0000 ESI=00000000 FS=0000
EDX=00000000 ES=0000 EDI=00000000 GS=0000
Байты по адресу CS:EIP:

Содержимое стека:


 
Владислав ©   (2003-11-04 15:07) [5]

" hHook:=MapViewOfFile(hMapFile, File_Map_Write, 0, 0,
DataSize);
"

hHook проверяй на nil.


 
Spawn ©   (2003-11-05 13:12) [6]

Все равно та же ошибка.


 
Владислав ©   (2003-11-05 15:28) [7]

КАКАЯ, ТА ЖЕ?


 
Spawn ©   (2003-11-06 05:02) [8]

Да, та же


 
Владислав ©   (2003-11-06 09:15) [9]

Не вижу я в приведенном коде подобную ошибку.

А так... Вот здесь:
try
hFile:=CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
0 ,nil,OPEN_EXISTING,0,0);
wPrm:=Integer(GetFileSize(hFile,nil)=XXX_FILE_SIZE);
SendMessage(FindWindow("какая - то прога",nil), WM_XXX_FS_INVALID, wPrm, 0);
finally
CloseHandle(hFile);
end;

замени на:
hFile:=CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
0 ,nil,OPEN_EXISTING,0,0);
try
wPrm:=Integer(GetFileSize(hFile,nil)=XXX_FILE_SIZE);
SendMessage(FindWindow("какая - то прога",nil), WM_XXX_FS_INVALID, wPrm, 0);
finally
CloseHandle(hFile);
end;

иначе ты можешь закрывать хендл неоткрытого файла (если здесь CreateFile произошла ошибка).
Ну и попробуй SendMessage заменить на PostMessage.



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
1-25441
pashtet
2003-12-23 17:06
2004.01.09
Диаграмма Ганнта..


3-25218
SKing
2003-11-22 11:50
2004.01.09
Delphi+Halcyon+NTX=?


3-25250
kalishenko
2003-12-08 12:15
2004.01.09
Что за файл pdoxusrs.lck?


14-25599
mfender
2003-12-15 07:52
2004.01.09
Теперь в Штатах все встанет на свои места!


14-25552
bobtubob
2003-12-18 10:04
2004.01.09
нужна очень мощная система математической обработки