![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хук в разных ОС [D7, Win95/98, WinME, NT4, Win2k, WinXP]
Spawn © (2003-10-30 15:53:00)
Сделал хук дял перехвата запуска одной проги. В ХП все нормально работает. Если же попробовать запустить прогу в 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.
Владислав (2003-11-06 09:15:00) [1]
Не вижу я в приведенном коде подобную ошибку.
А так... Вот здесь:
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.
Spawn (2003-11-06 05:02:00) [2]
Да, та же
Владислав (2003-11-05 15:28:00) [3]
КАКАЯ, ТА ЖЕ?
Spawn (2003-11-05 13:12:00) [4]
Все равно та же ошибка.
Владислав (2003-11-04 15:07:00) [5]
"
hHook:=MapViewOfFile(hMapFile, File_Map_Write, 0, 0,"
DataSize);
hHook проверяй на nil.
Spawn (2003-11-04 13:56:00) [6]
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:
Содержимое стека:
Dima_dvp (2003-11-01 00:36:00) [7]
minegod:
Дельный совет:)
minegod (2003-10-31 10:22:00) [8]
а могет надо DataSize=SizeOf(ДВОРД), а не DataSize=SizeOf(Integer)?
Digitman (2003-10-31 08:52:00) [9]
> она завершается с критической ошибкой
с какой ? конкретно и дословно ?