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 файлами помочь не могу
Придется тебе ждать еще кого-нибудь.