Разгон USB мыши или Software наносит ответный удар
Эта работа была прислана на наш "бессрочный" конкурс статей и автор получил приз - USB-мышь Logitech MX310.
Введение.
Разгоном мышей на сайте уже занимались, причем аппаратным (см. статью "Модификация мыши: хвостатой, оптической, вибрирующей"). Однако поводом к написанию сего опуса и программы послужила случайно попавшаяся на глаза статья на THG.RU ("Разгоняем мышь: как увеличить частоту USB в четыре раза"). Безусловно, идея разгона правильная, потому что истинная :) и сомнениям подвергаться не может, как бы не злопыхали апологеты номиналов :) Но вот конкретная реализация – только под Windows XP SP2 и путем хака (или патча, кому как больше нравится) системного файла – удовлетворительной признана быть не может.
Краткая теория разгона.
USB мыши, как и любые другие устройства на USB шине, работают согласно стандарту этой самой шины (было бы удивительно, если бы это было не так). Стандарт же сообщает нам, что USB шина – это хост-управляемая поллинговая (опросная) шина с периодом опроса устройств в 1 миллисекунду (по версии USB1.1). Следовательно, максимально достижимая частота опроса USB мышей – 1000 опросов в секунду. Однако стандарт уточняет, что низкоскоростные (Lowspeed) устройства, к которым мыши обычно и относятся, должны запрашивать опрос не чаще, чем раз в 10 командных циклов шины, что они и делают (соблюдая стандарт).
реклама
Внимательный читатель заметит, что 10 командных циклов по 1 миллисекунде каждая даст частоту опроса в 100 раз за секунду. Почему же USB мыши по умолчанию дают частоту опроса 125? Дело в том, что драйвера хост-контроллера, писанные MS, устанавливают частоту опроса устройства по значениям степени двойки, округляя запрошенное устройством (точнее его драйвером) значение в меньшую сторону, причем в диапазоне от 1 до 32. (Стандарт USB шины позволяет запросить интервалы опроса в любое число от 1 до 255). Следовательно, запрошенный период в 10 циклов округляется до 8, что и дает искомые 125 опросов в секунду.
С номиналом функционирования устройства мы разобрались, разберемся теперь, почему возможен разгон. Как уже было сказано выше, желаемый период опроса (сообщаемый устройством) не обязательно равняется устанавливаемому (действительному) для него. Поэтому, заставив драйвер (либо самого устройства, либо хост-контроллера) запросить меньший период опроса, мы тем самым поднимем частоту опроса устройства. Патч, описанный на THG, исправляет драйвер хост-контроллера так, что он для всех низкоскоростных устройств (не только мышей) программирует хост-контроллер в более высокую частоту. Мы же пойдем другим путем – заставим драйвер самого устройства запрашивать нужную нам частоту.
Программа.
Программно драйвера USB мышей реализованы по двухкомпонентной схеме – драйвер для мыши, как HID (Human Input Device) устройства на USB шине, плюс драйвер для мыши, как собственно HID мыши. Нас интересует первый, воплощенный драйвером HIDUSB.SYS. Было бы замечательно, если бы MS реализовала возможность перекрытия частоты опроса USB HID устройств прямо в нем (как она наконец-то полноценно сделала это для PS/2 мышей в WindowsXP – приблизительно через 15 лет :) после появления таких девайсов; кстати, хотелось бы заметить, что "разгон" PS/2 мышей таковым в реальности не является).
Однако ждать милостей от природы мы не можем – надо взять их самим. Поскольку править сам драйвер при отсутствии исходников и разных его версиях в разных версиях OS мы не можем – следовательно, должны придумать другой способ. И такой способ в действительности имеется – написание так называемого Filter Driver, в данном приложении Lower Filter Driver. Суть драйверов-фильтров заключается в перехвате запросов до (Upper) или после (Lower) какого-либо драйвера устройства (Functional Driver) и коррекции их для достижения желаемого результата. Единственной сложностью применения драйверов-фильтров является нестандартность их установки. Но перейдем непосредственно к программе: hidusbf.zip (92 КБ).
Установка и настройка.
Для установки необходимы права локального администратора под NT линейкой.
1. Копирование файлов и установка сервиса (для NT систем).
реклама
Установить (Install) hidusbf.inf из каталога DRIVER. Результатом должен быть скопированный в каталог %windir%/system32/drivers файл HIDUSBF.SYS и установленный под линейкой NT сервис HKLM\SYSTEM\CurrentControlSet\Services\hidusbf
2. Установка Low Filter драйвера.
Способ 1. Практически автоматический.
Определяем наименование HID USB устройства соответствующего мыши. Оно обычно именуется стандартно.
Копируем это наименование в файлы install_9x.bat или install_nt.bat в каталоге INSTALL соответственно вместо "You USB Device Name for Mouse". Примеры файлов для русской и английской NT и для русской 9x линеек есть в этом же каталоге. Затем запускаем соответствующие файлы.
Результатом работы должен быть следующий ключ в реестре:
Внимание! Фильтр будет установлен для ВСЕХ устройств, имеющих одинаковое имя (а это, как правило, все USB HID устройства, например клавиатуры, джойстики и т.д.). Это безопасно (если фильтру нечего делать – он никакого влияния на работу не оказывает), но может разогнать ВСЕ USB HID устройства. Если вам этого не хочется – надо удалить hidusbf из параметра LowFilters для всех таких устройств (если там есть только hidusbf, то можно удалить сам параметр LowFilters). Единственная проблема в том, что под NT ключ HKLM\SYSTEM\CurrentControlSet\Enum\USB\"DevicePNPID"\"DeviceLocation" защищен от записи всех, кроме самой OS. Для его правки необходимо дать права на правку этой ветки реестра какому-либо пользователю или запустить regedit от имени системы, например через: at time /interactive regedit
Вариант – перед запуском install_*.bat отключить все USB HID устройства кроме мыши (с клавиатурой это конечно тяжело сделать). Еще вариант – установить для всех, отключить мышь и удалить (см. ниже как) для всех остальных.
Способ 2. Руками.
Найти вышеописанные ветки реестра для мыши и добавить параметр Lowfilter типа REG_MULTI_SZ руками со значением hidusbf.sys или hidusbf для 9x и NT соответственно. Правда, удобно добавить REG_MULTI_SZ под 2000 можно только через regedt32, а под 9x стандартным regedit это можно сделать, только добавив бинарный параметр, что нетривиально.
Более удобный (точнее просто выполнимый :) ) ручной вариант для 9x – найти параметр "HKLM\SYSTEM\CurrentControlSet\Services\Class\HID\xxxx\NTMPDriver" соответствующий мыши и добавить в него в начало строки hidusbf .sys через запятую, чтобы получилось нечто вроде "hidusbf.sys,hidusb.sys".
3. Особенности установки под XP.
реклама
MS достаточно сильно поменяла реализацию стека USB в WinXP по сравнению со всеми предыдущими версиями. Но скрытой неприятной особенностью нового стека является то, что теперь USBPORT.SYS (классовый драйвер для USB хост контроллеров) стал отказывать для драйверов Lowspeed устройств в установке периода опроса менее 8 тактов шины. Кажется, программисты из MS наконец-то прочитали стандарт на шину, хотя лучше бы они этого не делали :) Однако мы, иначе как антиразгонным, такое поведение драйвера трактовать не можем :( И, к сожалению, простого и документированного способа обойти эти закидоны MS, кроме как патчить драйвер, мне придумать пока не получается. В каталоге XP_SP2_Patched имеется исправленный usbport.sys из второго SP. (У меня он работает на SP1).
Изменения в нем следующие (оригинальный файл/исправленный файл):
00015D01: 08 00 |
00015D09: 00 08 |
Для установки надо скопировать его в %windir%\Driver Cache, затем в %windir%\system32\dllcache, а затем в %windir%\system32\drivers
4. Запуск драйвера.
Для того, чтобы после установки hidusbf загрузился, необходимо либо перегрузиться, либо выдернуть и воткнуть мышь, либо остановить ее в Device Manager, а затем запустить (помните, что запустить ее можно только с клавиатуры, если, конечно, нет второй мыши :) ). Проверить, что драйвер загрузился и работает, можно по изменению частоты мыши. Проверить это можно, например, программой Mouse Rate Checker от Oliver Tscherwitschke. По умолчанию мышь разгоняется до 250 опросов в секунду.
5. Установка различной частоты опроса.
Для выставления другой частоты опроса необходимо завести параметр bInterval типа DWORD в ключах:
Имя ключа xxxx можно узнать в ключе Enum (обведен вторым красным баллоном). Как описывалось выше, разумными значениями bInterval для будут: 1 – 1000 опросов, 2 – 500 опросов, 4 – 250 опросов, 8 – 125 опросов, 16 – 62 опроса. Самое обидное, что под XP без патча для драйвера USBPORT.SYS тормозить мышь можно сколько угодно, а разгонять – ни-ни :( И в качестве примера – тестовая Logitech Premium Optical Wheel Mouse M/N M-BT58 при установке 1 для bInterval дает порядка 700 опросов под 98SE на USB OHCI контроллере, встроенном в NForce2.
6. Удаление драйверов.
Для автоматического удаления необходимо изменить имя устройства в uninstall_nt.bat/ uninstall_9x.bat аналогично, как при добавлении. Вариант попроще – удалить устройство в Device Manager, а затем обнаружить его заново. Сервис драйвера HKLM\SYSTEM\CurrentControlSet\Services\hidusbf под NT можно затем удалить вручную.
7. Протестированные ОС.
Драйвер тестировался под Win98 SE RUS, Win2000 Pro RUS SP2 и WinXP RUS Pro SP1 (последняя с патченным USBPORT.SYS). Интересует правильность работы под WinMe и Win2000 SP4. Win2003 очевидно придется патчить аналогично XP.
Заключение.
Надеюсь, описанная программа будет полезна всем. Отзывы о ней и всех ее глюках просьба сообщать в ветку обсуждения. Копирайт на модуль установки фильтров filtject.dll принадлежит Walter Oney.
P.S. USB мыши у меня пока нет. Тестировался я на заемной. :)
SweetLow
Дополнение 1.
1. Поскольку драйвер вполне заработал не только у меня :) , но и у прочих пользователей и, сознавая некоторую (относительную) сложность процесса, была написана программа установки в графическом интерактивном режиме. Она умеет выполнять следующие действия, описанные в оригинальной статье: установка сервиса и копирование файлов (кнопка "Install Service"), установку и снятие фильтра на мышь (чекбокс "Filter On Device") и изменение частоты опроса (комбобокс "Selected Rate"). Возможность установить фильтр на несоответствующее устройство минимизирована – в списке устройств по умолчанию отображаются только USB мыши. Найти программу можно в обновленном архиве – DRIVER\Setup.exe
2. Аналогично USBPORT.SYS для Windows XP исправлен файл для Windows 2000 SP4. Он нужен для версии Windows 2000 с SP4 или с установленным апдейтом работы с USB2.0. В архиве найти его можно в папке 2000_SP4_Patched. Буду рад отзыву о его работоспособности.
Дополнение 2. Теперь и под x64.
Некоторое время назад (примерно 10 апреля) я пересобрал драйвер под AMD64, выложил в сеть и попросил протестировать (у меня AMD64 системы пока не наблюдается). Наконец нашелся доброволец – Dark_Cloud, участник форумов overclockers.ru и iXBT.com, имеющий нужные железо, софт и желание поработать тестером. Рад сообщить, что тестером ему удалось побыть сразу и альфа-, и бета-, и релиз-, поскольку драйвер HIDUSBF.SYS для AMD64 запустился вполне успешно c первой попытки. Пропатченный же USBPORT.SYS от Windows XP x64 можно найти в каталоге XPx64_SP1_Patched архива.
Кстати, Dark_Cloud же ранее проверил и весьма интересную ситуацию, когда при наличии нескольких HID USB устройств (джойстика и мыши) разгоняться желает только одно из них – идеальная ситуация для применения именно фильтра .
С момента предыдущего дополнения я несколько развил функционал Setup.EXE – теперь он умеет применять изменения частоты "налету" – кнопка "Restart". Правда пока это вроде бы не работает в Windows XP x64. Разобраться лично я пока не могу по вышеуказанным причинам.
Найти обновленный архив по-прежнему можно по адресу, указанному в статье. Ввиду того, что Setup работает вполне удовлетворительно, каталог install c filtject.dll я из архива убрал.
Ждём Ваших комментариев в специально созданной ветке конференции.
Лента материалов раздела
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают