Хуки и порты

  • Автор темы lamez
  • Дата начала
L

lamez

#1
WINDOWS. Задача такая. Висит приложение в бэке (используем хук соотв), колбачит нажатие клавы. Нажалась кнопочка - установка даты на LPT и холодный неон завис в свете на 200мс.
Для задержки в свете неона - между выводами в порт числа ставим Sleep(200). Дело в том, что в самой функции CALLBACK KeyboardProc нельзя ставить эти операции, ибо клава будет тормозить, как и сама система. То есть так нельзя:
[codebox]LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode)
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
if(lParam>0)
{
Outb(888,1);
Sleep(200);
Outb(888,0);
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}[/codebox]
ТАК НЕЛЬЗЯ.
Я ламер и я решил запустить подпроцесс, или как он там называется))). CreateThread вобщем сделать)) и в этом подпроцессе следить за внешней переменной, которая бы устанавливалась в вышевыложенном колбаке. Ну и по условию в подпроцессе вывести в порт с задержкой.
Тоесть:
[codebox]
extern bool boleano_mego_alko_variable;

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode)
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
if(lParam>0)
{
boleano_mego_alko_variable = true;
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}

DWORD WINAPI thproc(LPVOID lpParam){
while(1){
if(boleano_mego_alko_variable){
Out32(BASEPORT, 1);
Sleep(200);
Out32(BASEPORT, 0);
mego_alko_variable = false;
}
Sleep(10);
}
}

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
if(!hi){
hi = hModule;
Out32(BASEPORT,0);

CreateThread( NULL, 0, thproc, NULL, 0, NULL);
}
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

[/codebox]
ОТНЮДЬ! Это тоже неправильно))). Подпроцесс не выполняется, [CENSORED], в таком случае на всех окнах, приложениях, а выполняется только тогда, когда я общаюсь с терминалом)).
ПОМОГИТЕ!!! Как мне еще можно выйти из этой ситуации.
 
L

lamez

#2
А, скажем, если я создаю AfxBeginThread(MyThreadFunc,NULL,THREAD_PRIORITY_NORMAL,0,0); То никакой реакции не вызывает.
 
Z

zubr

#3
Хмм.. Возникает ряд вопросов.
1. Что от любой кнопочки должен зажигаться неон?
2. Зачем проверять lParam>0

Чтобы клавиатура не зависала, можно сделать так:
Код:
DWORD WINAPI thproc(LPVOID lpParam){
Outb(888,1);
Sleep(200);
Outb(888,0);
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode)
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
if(lParam>0)
{
CreateThread( NULL, 0, thproc, NULL, 0, NULL);
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}
 
L

lamez

#4
Хмм.. Возникает ряд вопросов.
1. Что от любой кнопочки должен зажигаться неон?
2. Зачем проверять lParam>0
Возникает ряд ответов
1. Да, именно, от любой))). Я в одном кабинете сижу, а подчиненный - в другом, так я буду видеть то, что он печатает)), не отдыхает))
2. Эмм.. Я ламер), точно не знаю, но в статье написано, что в таком случае будет проверяться только нажатие.

Спасибо, проблема решена. Теперь всё работает. Вот только я не пойму почему всё так вышло, особенно с консолью)) Мистика).
 
Z

zubr

#5
Да, именно, от любой))). Я в одном кабинете сижу, а подчиненный - в другом, так я буду видеть то, что он печатает)), не отдыхает))
Хмм... Странный способ отслеживать подчиненных. А если он в чате общается, при этом быстро тиская на клавиатуру, или в игрушку какую играет... Ну и потом легко сделать программульку, которая будет имитировать нажатие клавиш. Уж лучше просто через штатные средства удаленного администрирования контролировать подчиненных (если есть возможность вторкнуть какую то хрень в LPT-порт, то наверно можно и сетевой кабель вторкнуть). На худой конец можно кейлоггер поставить на комп подчиненного, чтобы он логи писал нажатия клавиш - подчиненный ушел домой, открыл лог, посмотрел по времени какие клавиши нажимал.
 
L

lamez

#6
Хмм... Странный способ отслеживать подчиненных. А если он в чате общается, при этом быстро тиская на клавиатуру, или в игрушку какую играет... Ну и потом легко сделать программульку, которая будет имитировать нажатие клавиш. Уж лучше просто через штатные средства удаленного администрирования контролировать подчиненных (если есть возможность вторкнуть какую то хрень в LPT-порт, то наверно можно и сетевой кабель вторкнуть). На худой конец можно кейлоггер поставить на комп подчиненного, чтобы он логи писал нажатия клавиш - подчиненный ушел домой, открыл лог, посмотрел по времени какие клавиши нажимал.
Ну с неоном - это сделано просто для прикола)). А на самом деле, правда я еще это не сделал)), будут отслеживаться приложения(активные окна тем же хуком) и время их запуска, записываться нажатие клавиш в лог и отправляться мне)), думаю даже в реалтайме слежку устроить)). Почитал сетевое программирование, посмотрим что получится.