Форум: "WinAPI";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
ВнизWH_DEBUG. Обработка параметров этой callback функции. Найти похожие ветки
← →
lb0 (2003-04-21 07:44) [0]Здраствуйте.
мне необходимо, при отоброжении в АП клиентского процесса длл, которая будет отлавливать сообщения,
приходящие в очередь других процессов (на которые поставлено WH_keyboard функцию фильтр) обрабатывать данные,
переходящие по нити глобальных хуков.
реализация: обрабатывать WH_debug хуком в callback функции (debugproc) параметры, передаваемые в
lparam. (с использованием указателя на структуру, в которую необходимо помещать параметры универсального типа
longint).
Вот кусок кода функции в которой это осуществляеться:
function DebugProc(ncode : integer; wParam : word; lParam : longint) : longint; stdcall;
var
i: integer;
ddd : ^DEBUGHOOKINFO;
dbg : PDebugHookInfo;
dbginfo : TDEBUGHOOKINFO;
begin
if wparam = WH_KEYBOARD then
begin
{--------------------}
addto("!!!!!!!!!!! new WH_KEYBOARD hook !!!!!!!!!!!!!!");
{}
ddd := Pointer(Lparam);
if ddd^.idThread <> 0 then
addto(".idthread1 = "+inttostr(ddd.idThread));
{}
dbg :=PDebugHookInfo(Lparam);
dbginfo := dbg^;
addto(format(".idthread3 = %d ",[dbginfo.idThread]))
{-------------------}
end else Result:= CallNextHookEx(SysHook, nCode, wParam, lParam);
end;
коментарии:
addto - процедура записи строки в файл.
в моем примере я использую двойной способ извлекания значений параметров, которые
хранит универсальный параметр callback функции lparam.
Я думаю, что я сделал в первом, втором случаях - ясно.
результат как и в первом, так и во втором случаях- одинаковый.
Также я использовал для точки входа в dll способ отображения файла в память.
Проблема: в результате, я вижу приблеженно похожие на нужные процессы, (использующие
wh_keyboard хук), но они к сожалению не верны.
Каким образом сделать так, чтобы у меня были верные результаты ???
Заранее большое спасибо.
← →
lb0 (2003-04-23 08:22) [1]Удалено модератором
Примечание: Offtopic
← →
Nikolai (2003-04-23 09:12) [2]end else Result:= CallNextHookEx(SysHook, nCode, wParam, lParam);
1. А почему бы не пропустить вызов ловушки для WH_KEYBOARD дальше (может просто твоя ловушка не первая, а ты после просмотра параметров первой все цепочку останавливаешь).
2. Результаты не верны: в смысле idThread не совпадает с чем?
видимо должен совпадать с dwThreadId из:
SysHook := SetWindowsHookEx(WH_DEBUG, @SysDebugProc, HInstance, dwThreadId);
так?
← →
lb0 (2003-04-25 08:48) [3]1. А почему бы не пропустить вызов ловушки для WH_KEYBOARD дальше (может просто твоя ловушка не первая, а ты после просмотра параметров первой все цепочку останавливаешь).
в этом ошибке нет, так как это и являеться целью хука.
2. Результаты не верны: в смысле idThread не совпадает с чем?
видимо должен совпадать с dwThreadId из:
SysHook := SetWindowsHookEx(WH_DEBUG, @SysDebugProc, HInstance, dwThreadId);
Вообщем результаты не совпадают с pid"ами настоящих процессов,
вызывавших клавиатурный хук. (idthreadinstaller возможно, но там абсолютнонеправильное число.)
← →
Nikolai (2003-04-25 12:21) [4]!!! что с чем сравниваешь?
> Вообщем результаты не совпадают с pid"ами настоящих процессов
ты имеешь ввиду потоков?
> в этом ошибке нет, так как это и являеться целью хука.
ну, все равно я думаю Result := 1; надо добавить :)
и еще: ты ловушку на все потоки ставишь
SetWindowsHookEx(WH_DEBUG, @SysDebugProc, HInstance, 0);
или на один
SetWindowsHookEx(WH_DEBUG, @SysDebugProc, HInstance, dwThreadId);?
Много гадать приходится, проясни как ставишь ловушку, какие цифирки сравниваешь?!!!
← →
lb0 (2003-04-28 08:57) [5]ты ловушку на все потоки ставишь
да, на все, это естсественно, если бы не на все, то бы результата вообще не было.
SysHook := SetWindowsHookEx(WH_DEBUG, @DebugProc, HInstance, 0);
ну, все равно я думаю Result := 1; надо добавить :)
;))) блин, тогда в конце
Result:= CallNextHookEx(SysHook, nCode, wParam, lParam);
ставлю, чтобы в любом случае, независимо от типа хука, параметры
по нити продвигались...
ты имеешь ввиду потоков?
дада.. я хочу выловить из параметров способом WH_debug, ID
потоков, вызывавших WH_keyboard хук.
Поток, он и являеться первым имеет parend pID процесса, если тебя
интересует модуль, то он имеет OWNER ID = pID процесса.
все что касаеться реализации, тут правильно, скорее всего что-то
не в этом, я думаю даже в delphi.....
поэтому каких либо вопросов по реализации вылавливания - хз.
делал 3мя способами, из них - все показыают одно, но левое значение....
1.* := TDEBUGHOOKINFO(Pointer(LParam)^).idThread;
2.* := Pointer(Lparam);
3.* := PDebugHookInfo(Lparam);
ладно, удачи.
жду ответа ж)
← →
Nikolai (2003-04-28 11:33) [6]Что-то "чем дальше в лес тем толще партизаны"...
да, на все, это естсественно, если бы не на все, то бы результата вообще не было.
Почему результата не было бы?
Ну да не в этом дело... на все так на все.
Короче...
Взял твой код с форума (у меня из своих только случай с установкой на конкретный поток был).
Случай ddd := Pointer(Lparam);
Печатаю idThread (который конечно же совпадает с GetCurrentThreadId).
Нахожу ид потока интересующего окна (например через GetWindowThreadProcessId). Сравниваю - все походит :)
Я что-то пропустил?
Поток, он и являеться первым имеет parend pID процесса, если тебя
интересует модуль, то он имеет OWNER ID = pID процесса.
Как это: ид потока и процесса одинаковы?! А для модулей, на ск-ко я помню (хотя может чего и забыл), есть описатель, а ид - нет.
Проясни...
← →
lb0z (2003-04-29 08:24) [7]сори, что не даю полного ответа - я отключил кукисы,поэтому
полный ответ в попе.
-первый поток ppid = id prоc.
-dll : tlhlp32.pas
две функции проверю...
спасибо за уделенное время..
я думаю ещё будут сообщения в этой ветке
удачи
← →
lb0z (2003-04-29 08:56) [8]-первый поток ppid <> id prоc.
все разабрался,
### Threads ###
1 thrd | Thread ID : 2488 |OwnerProcID : 2492
UsageCount : 0 Priority : 8
Total : 1 threads
я не в ту графу смотрел...
спасибо за усердия...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c