Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Наверно все не так просто 03.03.05 12:45 Число просмотров: 3254
Автор: ValEG Статус: Незарегистрированный пользователь
|
> Можно и без inf-а обойтись
> Просто прописаться в подветке > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class > для этих классов в UpperFilters
Наверно все не так просто. Где-то в инете была программка ctrl2cap, там именно так инсталлировался драйвер меняющий клавишу caps на ctrl. Когда я переделал ту программку для инсталляции kbfilter из DDK, то ничего не заработало (то есть ctrl2cap использующий IRP_MJ_READ работает, а kbfilter использующий ServiceCallback нет).
Заработало только когда я установил через диспетчер устройств для клавиатуры свой драйвер, взяв kbfiltr.inf из DDK.
Я посмотрел что изменилось в реестре после kbfiltr.inf:
в подветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318} в UpperFilters ничего не добавилось,
появилась подветка HKEY_LOCAL_MACHINE\CurrentControlSet\Control\CriticalDeviceDatabase\*pnp0baad
(*pnp0baad прописан в kbfiltr.inf) в этой подветке есть параметры:
ClassGUID - {4D36E96B-E325-11CE-BFC1-08002BE10318}
Service - i8042prt
UpperFilters - kbfilter
Еще появилась подветка HKEY_LOCAL_MACHINE\ CurrentControlSet\Enum\ACPI\PNP0303\<номер>
в этой подветке тоже есть параметры:
ClassGUID - {4D36E96B-E325-11CE-BFC1-08002BE10318}
Service - i8042prt
UpperFilters - kbfilter
В подветке HKEY_LOCAL_MACHINE\ CurrentControlSet\Services\kbfilter есть раздел Enum содержащий параметр со значением <номер> из ветки описанной выше.
Устанавливать через SetupAPI - надо долго разбираться.
Для установки той части драйвера что работает с мышью сделал так, как написал leo:
> Если делать через inf-файлы, то нужно два inf-файла > параметры InstallService должны быть одинаковые.
Изменил в moufiltr.inf параметры InstallService и через диспетчер устройств установил для мыши свой драйвер. В реестр добавились аналогичные ветки, только ClassGUID другой. После чего работает только часть драйвера, отвечающая за блокировку мыши. Если в диспетчере устройств удалить драйвер для мыши, то нормально начинает работать часть драйвера отвечающая за блокировку клавиатуры.
Попробовал сделать тоже самое на другой машине, сначала через диспетчер устройств установил драйвер для клавиатуры (kbfiltr.inf), за тем для мыши (moufiltr.inf) В реестре все аналогично, единственное отличие - наличие раздела Security на первой машине в ветке HKEY_LOCAL_MACHINE\ CurrentControlSet\Services\kbfilter, на второй машине он не появился.
Получилось наоборот блокировка клавиатуры работает, а блокировка мыши нет курсор двигается, хотя вроде не должен и на первой машине после блокировки он не двигается. Единственное, что в момент блокировки перестают запускаться программы с рабочего стола по двойному щелчку, а в Far-e мышь полностью работает.
MouFilter_ServiceCallback у меня выглядит так:
VOID
MouFilter_ServiceCallback(
IN PDEVICE_OBJECT DeviceObject,
IN PMOUSE_INPUT_DATA InputDataStart,
IN PMOUSE_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
{
PCOMMON_DATA commonData;
PMOUSE_INPUT_DATA MouseData;
ULONG l_inputDataConsumed = 0;
*InputDataConsumed = 0;
commonData = GET_COMMON_DATA(DeviceObject->DeviceExtension);
for(MouseData = InputDataStart; MouseData < InputDataEnd; MouseData++)
{
if( Globals.LockFlag ) { //если клавиатура и мышь заблокирована
*InputDataConsumed = *InputDataConsumed + 1;
}
else { // клавиатура и мышь не заблокирована
if( MouseData->Buttons != 0) { //есть нажатые кнопки?
cnt_tick = lock_tick; //заново устанавливаем счетчик тиков до блокировки
}
l_inputDataConsumed = 0;
(*(PSERVICE_CALLBACK_ROUTINE) commonData->UpperConnectData.ClassService)(
commonData->UpperConnectData.ClassDeviceObject,
MouseData,
MouseData+1,
&l_inputDataConsumed);
if ( l_inputDataConsumed==0 ) return;
*InputDataConsumed += l_inputDataConsumed;
}
}
}
Короче теперь вообще не знаю, что я делаю не так?
|
|
|