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 файлами помочь не могу 

 Придется тебе ждать еще кого-нибудь.