Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.006 c
11-97564
Alexei Dragoner
2002-07-25 17:16
2003.06.30
А можно создавать/убирать statusbar налету?


14-97806
Gimer
2003-06-10 17:08
2003.06.30
Голубое окно смерти Windows


14-97829
Alex_x
2003-06-11 15:51
2003.06.30
неменяется значение RadioButton


14-97824
BaRToV
2003-06-02 02:43
2003.06.30
HTML Help WorkShop 4.74


1-97586
Reanimator
2003-06-18 22:20
2003.06.30
Или глюк с TShellTreeView или я чегото не понимаю.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский