Содержание статьи
Возможно, ты уже сталкивался с тем, что программа для работы с подсветкой — это зачастую монструозное поделие, которое постоянно висит в фоне и отжирает драгоценную оперативку. Чтобы избавиться от этой зависимости, энтузиасты делают софт для управления подсветкой девайсов разных производителей. Такой софт легче фирменных утилит и позволяет настраивать и синхронизировать цвет подсветки всей твоей периферии.
Сегодня посмотрим, как управлять подсветкой и, при желании, другими параметрами — например, DPI мыши или назначением клавиш, — обращаясь напрямую к устройствам.
Работа с устройствами в Windows
Возиться с устройствами будем в Винде: в Razer, Logitech и других компаниях не выпускают официальный софт для настройки железа для Linux.
Чтобы записать информацию в устройство, его нужно открыть. Для этого есть функция CreateFile из библиотеки kernel32. (есть еще CreateFile2 и NtCreateFile, но их мы разбирать не будем). Да, в Windows с устройством можно работать как с файлом. Вызов функции выглядит так:
HANDLE CreateFileW( [in] LPCWSTR lpFileName, [in] DWORD dwDesiredAccess, [in] DWORD dwShareMode, [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, [in] DWORD dwCreationDisposition, [in] DWORD dwFlagsAndAttributes, [in, optional] HANDLE hTemplateFile);Буква W в конце имени функции Windows API значит, что она работает со строками в Юникоде, а A — со строками в ANSI. Для современной Винды Юникод — нативная кодировка, так что будем использовать именно его.
Подробно расписывать каждый параметр я не буду, отмечу только один нюанс: при открытии устройства с флагами GENERIC_READ в параметре dwDesiredAccess может возникнуть ошибка доступа — ERROR_ACCESS_DENIED. Причина — монопольный доступ системных драйверов класса (например, kbdclass. или mouclass.), которые защищают устройства ввода от перехвата из пользовательского режима. Но если задать этому параметру значение 0, система позволит открыть устройство с доступом для опроса (Query Access). Этого хватит для отправки команд IOCTL с флагом FILE_ANY_ACCESS — подробнее о нем расскажу дальше.
info
IOCTL (Input/Output Control) — это системный механизм, который позволяет прикладным программам отправлять специальные команды и обмениваться данными напрямую с драйверами устройств и компонентами ядра операционной системы.

Итак, мы открыли устройство и получили его дескриптор (handle). Теперь нужно отправить устройству команду, чтобы изменить цвет. Тут есть несколько вариантов. Первый — вызвать функцию WriteFile из kernel32..
BOOL WriteFile( [in] HANDLE hFile, [in] LPCVOID lpBuffer, [in] DWORD nNumberOfBytesToWrite, [out, optional] LPDWORD lpNumberOfBytesWritten, [in, out, optional] LPOVERLAPPED lpOverlapped);
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
