Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.011 c
3-25234
KF111
2003-12-11 11:02
2004.01.09
FIBPLUS, транзакции, запросы....


14-25499
Thor
2003-12-19 16:36
2004.01.09
Дом престарелых.


1-25304
SoS
2003-12-22 18:35
2004.01.09
А где взять TSpinEdit ?


4-25650
Prov
2003-11-06 09:35
2004.01.09
MessageBoxIndirect - don t work


1-25351
АлекСандр Мих
2003-12-22 11:05
2004.01.09
Работа с Debug





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский