Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Драйвер-фильтр USB мыши.  (Прочитано 9472 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Destiny
Гость
« : 25-10-2005 16:43 » 

Добрый день.
Уважаемые программисты, помогите!!!
Задача: для имеющейся USB мышки надо написать драйвер-фильтр, он будет подсовывать системе события от скрола вместо нажатий кнопок. Т.е. на мыше нажимаем левую кнопку, а на экране у нас идет прокрутка вверх... События от скола и перемещения мыши желательно скрыть вообще.
Вопросы:
1) Как отловить события мыши?
2) Установить этот драйвер и что для этого нужно?
Записан
Destiny
Гость
« Ответ #1 : 26-10-2005 14:11 » 

Доп. вопрос: как узнать DeviceID (ProductID) реального устройства - я как понимаю именно этот код надо исать в инф файле, чтобы его установить на конкретное оборудование...

Ребята, помогите, очень надо....
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 30-10-2005 09:33 » 

Destiny, мышка все равно какая, usb или нет. Пример такого фильтра, только на клавиатуру есть на www.sysinternals.com у Руссиновича.
Я писал такую штуку, правда, имхо, она так и осталась сыроватой Улыбаюсь
Весь код приводить не буду, только некоторые функции.

Здесь мы присоединяемся к устройству
Код:
//----------------------------------------------------------------------
// PulseAddDevice()
// PnP-менеджер каждый раз вызывает эту функцию, когда подключается
// мышь. Мы присоединяемся к каждой.
//----------------------------------------------------------------------
NTSTATUS PulseAddDevice( IN PDRIVER_OBJECT pDriver,
IN PDEVICE_OBJECT pDeviceObject )
{ NTSTATUS status;
PDEVICE_EXTENSION pDevExt;
PDEVICE_OBJECT pDevice;
IO_ERROR_LOG_PACKET errorLogEntry;

// Создаем объект устройства мыши и присоединяем его к стеку

status = IoCreateDevice(pDriver, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_MOUSE, 0, FALSE,
&pDevice);
if (!NT_SUCCESS(status)) return status;

RtlZeroMemory(pDevice->DeviceExtension, sizeof(DEVICE_EXTENSION));
pDevExt = (PDEVICE_EXTENSION)pDevice->DeviceExtension;

status = IoAttachDeviceToDeviceStack(&pDevice, &pDeviceObject);

ASSERT(pDevExt->pTopOfStack);

device->Flags |= (DO_BUFFERED_IO | DO_POWER_PAGABLE);
    device->Flags &= ~DO_DEVICE_INITIALIZING;
    return status;
}

В этой функции обрабатываем IRP_MJ_READ, тот пакет которым читается информация из мышки. Когда пакет будет возвращаться обратно наша установленная callback-процедура перехватит его
Код:
//-----------------------------------------------------------------------
// PulseDispatchRead()
// Здесь устаналиваем callback-функцию для перехвата Irp пакетов
// чтения
//-----------------------------------------------------------------------

NTSTATUS PulseDispatchRead( IN PDEVICE_OBJECT pDeviceObject,
IN PIRP Irp )
{   PDEVICE_EXTENSION   devExt;
    PIO_STACK_LOCATION  currentIrpStack;
    PIO_STACK_LOCATION  nextIrpStack;

    //
    // Инициализируем наши переменные
    //
    devExt = (PDEVICE_EXTENSION) pDeviceObject->DeviceExtension;
    currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
    nextIrpStack = IoGetNextIrpStackLocation(Irp);   

    //
    // Пропускаем пакет ниже, к драйверу класса
    //
    *nextIrpStack = *currentIrpStack;

    // 
    // Здесь устанавливаем свою callback-функцию для того чтобы
// подправить данные мыши
    //    
    IoSetCompletionRoutine( Irp, PulseReadComplete,
                            pDeviceObject, TRUE, TRUE, TRUE );

    //
    // Передаем пакет ниже по стеку
    //
    return IoCallDriver( devExt->TopOfStack, Irp );
}

А вот здесь, та самая callback процедура, которая может изменять данные пакета. В данном случае она отключает среднюю кнопку, но можно делать вообще что хочешь, посмотришь в мсдн.
Код:
//---------------------------------------------------------------------
// PulseReadComplete()
// Получает управление после завершения операции чтения
//---------------------------------------------------------------------
NTSTATUS PulseReadComplete( IN PDEVICE_OBJECT pDevice,
    IN PIRP Irp, IN PVOID pContext )
{ PIO_STACK_LOCATION IrpSp;
PMOUSE_INPUT_DATA pMouseData;
int numMoves;

// Обработка закончена ловим результаты

IrpSp = IoGetCurrentIrpStackLocation(Irp);
if (NT_SUCCESS(Irp->IoStatus.Status))
{ // Отключаем события средней кнопки.
// Просто удаляем их из пакета
pMouseData = Irp->AssociatedIrp.SystemBuffer;
numMoves = Irp->IoStatus.Information/sizeof(MOUSE_INPUT_DATA);

for (i=1;i<numMoves;i++)
{ if (pMouseData[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN)
pMouseData[i].ButtonFlags &= !(MOUSE_MIDDLE_BUTTON_DOWN);
if (pMouseData[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_UP)
pMouseData[i].ButtonFlags &= !(MOUSE_MIDDLE_BUTTON_UP);
}
}

if (Irp->PendingReturned)
IoMarkIrpPending(Irp);

return Irp->IoStatus.Status;
}

А вот по поводу установки inf файлами помочь не могу Жаль Придется тебе ждать еще кого-нибудь.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Destiny
Гость
« Ответ #3 : 31-10-2005 06:20 » new

Большое спасибо, буду разбираться. Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines