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

Вниз

SetWindowsHookEx(WH_KEYBOARD, 0)   Найти похожие ветки 

 
KADAN   (2003-11-17 22:14) [0]

Доброго времени суток, мастера!
Возникла некоторая проблемка...не могу поставить хук на 0 (на WH_KEYBOARD).
Делаю так: есть DLL-ка, в ней ставится хук, процедура
обработки там же (с резултом CallNextHookEx). среди переменных DLL-ки только
HHOOK и процедурка приложения, в которую отдаются хукнутые данные.
Пока я в своем приложении хук работает, как только нажму эникей на
рабочем столе хук падает, только хендл остается :)
(Хотя в фаре хук работает, как ни странно).


 
Shluz ©   (2003-11-18 01:15) [1]

ошибка в процедуре ловушки, скорее всего использовал RTL функции и вроде того... лучше конечно код выложи


 
Digitman ©   (2003-11-18 08:31) [2]

первый параметр ф-ции CallNextHookEx() у тебя указывает в "никуда", вот и "падает" тот процесс, который вызвал эту ф-цию


 
KADAN   (2003-11-18 10:41) [3]

Ну ладно, вот DLLина.

library Project2;

uses
windows, sysutils;

type TObrabotkaProc = procedure(wparam, lparam: Cardinal);

var H:HHOOK;
ObrProc:TObrabotkaProc;

function Hooking(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
ObrProc(wparam,lparam);
result:=CallNextHookEx(H,code,wparam,lparam);
end;

function HOOKKB(Hmod:HINST;ThreadID:Cardinal; const Obrabotka:TObrabotkaProc):boolean;
begin
if H<>0 then messageboxex(0,"Already hooked!","Error",MB_ICONERROR or MB_OK or MB_APPLMODAL,0)
else begin
H:=SetWindowsHookEx(WH_KEYBOARD,@hooking,Hmod,ThreadID);
ObrProc:=Obrabotka;
if H=0 then messageboxex(0,"Can""t set hook!","Error",MB_ICONERROR or MB_OK or MB_APPLMODAL,0);
end;
result:=H<>0;
end;

function UNHOOKKB:boolean;
begin
result:=UnhookWindowsHookEx(H);
H := 0;
end;

exports HOOKKB, UNHOOKKB;

begin

end.


 
Digitman ©   (2003-11-18 10:46) [4]


> var H:HHOOK


!!!!!!!!!!

вот как ты думаешь, СКОЛЬКО таких "переменных" существует в системе после установки глоб.хука ?


 
KADAN   (2003-11-18 11:16) [5]

ну тогда покажи как


 
Digitman ©   (2003-11-18 11:22) [6]

а статьи соотв-щие почитать на этом сайте для начала ? лень ?


 
KADAN   (2003-11-18 23:09) [7]

>2 Digitman
у меня сложилось впечатление, что все твои ответы сводятся к "читай мануал"... читал, да... очень интересное чтиво... но не помогло :(


 
Игорь Шевченко ©   (2003-11-19 00:01) [8]

KADAN (18.11.03 23:09)

В статьях этот момент очень подробно описан, про то, как и где надо хранить общие для глобального хука переменные, а именно в проекции файла в память.

Два раза попробуй прочитать.


 
Digitman ©   (2003-11-19 11:03) [9]


> KADAN


мне хочется чтобы ты думал) ... понимаешь ? ду-мал ! сам думал ! а не чужой головой) ... толку от этого, поверь, как от козла молока

посему в [4] я задал тебе важный наводящий вопрос, который ты попросту проигнорировал ... проигнорировал ты, видимо, и рекомендацию сравнить пример в статье со своим кодом ... чего ж еще-то хочешь после этого ?


 
jonni ©   (2003-11-19 20:11) [10]

http://www.gajits.com/delphihooks.asp
tut vse est"


 
Digitman ©   (2003-11-20 11:37) [11]


> jonni


все это замечательно, но есть ряд оч важных моментов, не учитываемых и никак не комментируемых там.

1) этот код, будучи использованный не обычным приложением, а NT-сервисом, работать как положено не будет - возникнут серьезные проблемы с CreateFileMapping() с указанными в примере правами доступа к глоб.памяти

2) нет никакой гарантии, что SetWindowsHookEx() вернет хэндл хука в глоб.доступную переменную rHookRec^.HookID РАНЬШЕ чем он будет использован первым же вызовом ф-ции CallNextHookEx().. Результат такой ситуации - непредсказуемый. Следовательно, без глоб.объекта синхронизации доступа к переменной rHookRec^.HookID не обойтись, ибо MSDN никак не комментирует возможность или невозможность такой ситуации.


 
jonni ©   (2003-11-20 16:07) [12]

to Digitman ©

1) kto skazal pro kakoy to servicie??? v chem problema FileMapping dlya NT servica???

2) kak ti sebe predstavlyash situaciyu kogda hook esche ne ustanovlen a uzhe vizivaetsya funkciya hooka gde u tebya CallNextHookEx... absurd :(
vkonce koncov esli eto tak strashno to togda proveryai znachenie svoego HHOOK chtobi podstrahovat"sya... no niukogo takoy problemi nikogda ne voznikalo....
vsegda esli hook stavilsya to HHOOK bila pravil"naya i CallNextHook vsegda rabotal otlichno
nado esche ne zabivat" pri obrabotke v @hooking Code>=0


 
Digitman ©   (2003-11-20 16:48) [13]


> 1) kto skazal pro kakoy to servicie??? v chem problema FileMapping
> dlya NT servica???


я сказал) ... ибо столкнулся с такой ситуацией "в лоб" ... разбираться, правду скажу, не стал - не было времени, решил проблему организации глоб.доступных данных иным образом, без использования MMF ... но суть там была такова : сервис грузил экз-р хук-DLL, в ходе иниц-ции экз-ра успешно вызывалась CreateFileMapping(PAGE_READWRITE), далее устанавливался сам хук, после чего хук-DLL в ходе автовнедрения системой очер.своего экз-ра пыталась проделать тоже самое CreateFileMapping(PAGE_READWRITE), и код иниц-ции экземпляра получал отлуп из-за невозможности получить доступ к MMF ИМЕННО с правами PAGE_READWRITE (успешен был запрос только на PAGE_READ)

и это - факт невозможности перенести код примера работы с MMF "один-в-один" в приложение-сервис, по кр.мере для Win2000


> kak ti sebe predstavlyash situaciyu kogda hook esche ne
> ustanovlen a uzhe vizivaetsya funkciya hooka gde u tebya
> CallNextHookEx... absurd :(


почему "абсурд" ?
смотри сюда)

Предположим, процесс, устанавливающий глоб.хук, имеет пониженный приоритет
Некий код.поток этого процесса вызвал ф-цию
GlobalData^.hHookHandle := SetWindowsHookEx(), (1)

в теле которой (!!) система УЖЕ начинает разворачивать послед-ть действий по внедрению и инициализации экз-ров хук-DLL в существующие GUI-процессы (это происходит в основных кодовых потоках уже тех процессов, в которые очер.экз-р внедряется, и целевые процессы могут иметь значительно более высоций приоритет, нежели процесс, устанавливающий хук).

В какой-то момент времени может случиться так, что очередной внедренный экз-р завершил инициализацию и тут же возможен вызов системой колбек-ф-ции, где тут же вызывается CallNextHookEx(GlobalData^.hHookHandle, ...)

Но !

см.(1) - значение хендла хука будет записано в область памяти GlobalData^.hHookHandle ПОСЛЕ всего этого ! Значит, те процессы, в которые уже внедрена хук-DLL (и иниц-я ее успешно завершилась) имеют все шансы на вызвов системой колбэк-ф-ции, и , соответственно, на обращение к GlobalData^.hHookHandle, значение которой ЕЩЕ НЕ УСТАНОВЛЕНО !



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

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

Наверх




Память: 0.51 MB
Время: 0.008 c
14-83257
Undert
2004-01-04 12:11
2004.01.26
Возможно ли организовать запрос SQL


1-83210
DelphiNew
2004-01-15 14:27
2004.01.26
ColorBox


1-83174
bert
2004-01-15 00:32
2004.01.26
Помогите - RANDOM!


3-83108
dimm
2003-12-29 07:47
2004.01.26
Поиск в БД


1-83205
sbuffoon
2004-01-14 03:26
2004.01.26
работа со звуком