Соло драйвер что это
Итак, для начала приведем текст этой несложной программы.
Итак, теперь сначала разберемся, что делает каждая инструкция. Перво-наперво мы подключаем заголовочный файл ntddk.h. Это один из базовых подключаемых файлов во всех драйверах: в нем содержатся объявления типов NTSTATUS, PDRIVER_OBJECT, PUNICODE_STRING, а также функции DbgPrint.
Структура DriverObject содержит множество полей, которые определяют поведение будущего драйвера. Наиболее ключевые из них — это указатели на так называемые вызываемые (или callback) функции, то есть функции, которые будут вызываться при наступлении определенного события. Одну из таких функций мы определяем: это функция UnloadRoutine. Указатель на данную функцию помещается в поле DriverUnload. Таким образом при выгрузке драйвера сначала будет вызвана функция UnloadRoutine. Это очень удобно, когда драйвер имеет какие-то временные данные, которые следует очистить перед завершением работы. В нашем примере эта функция нужна только чтобы отследить сам факт завершения работы драйвера.
Вы можете задуматься, мол ну с первой-то директивой понятно, типа оптимизация и все такое, но зачем мы используем вторую директиву, зачем помечать код как возможный к выгрузке в файл подкачки? Поясню этот вопрос: каждый процесс в системе имеет такой параметр, как IRQL (подробнее читаем по ссылке Interrupt request level ибо это материал отдельной статьи), то есть некоторый параметр, отвечающий за возможность прерывания процесса: чем выше IRQL тем меньше шансов прервать выполнение процесса. Возможности процесса так же зависят от IRQL: чем выше IRQL тем меньше возможности процесса, это вполне логично, т.е. такой подход побуждает разработчиков выполнять только самые необходимые операции при высоком IRQL, а все остальные действия делать при низком. Вернемся к основной теме, о том, почему мы делаем для функции UnloadRoutine возможность выгрузки в файл подкачки: все опять же сводится к оптимизации: работа с файлом подкачки недоступна при высоком IRQL, а процедура выгрузки драйвера гарантированно выполняется при низком IRQL, поэтому мы специально указываем руками что код функции выгрузки драйвера можно поместить в своп.
Ух, вроде как с обсуждением кода этой, казалось бы небольшой программки закончено, теперь разберемся как скомпилировать и запустить наш драйвер.
Теперь последовательность действий: сначала мы пишем два файла, один называется MAKEFILE, с таким содержимым
а второй называется sources и содержит в себе следующее:
Эти файлы нужны для сборки драйвера. Да, забыл сказать, что в WDK нет встроенной среды разработки, поэтому и нужен текстовый редактор, чтобы набирать текст драйверов. Для этой цели можно использовать и Visual Studio (некоторые даже интегрируют возможность сборки драйверов из VS), и любой другой текстовый редактор.
Сохраняем код драйвера в файл TestDriver.c и кладем его в ту же директорию, что и файлы MAKEFILE и souces. После этого запускаем установленный build environment (это командная строка с заданными переменными окружения для компиляции драйвера; она входит в WDK, и запустить ее можно как-то так: «Пуск->Программы->Windows Driver Kits->. ->Build Environments->WindowsXP->Windows XP x86 Checked Build Environment»). Переходим в директорию, куда мы положили файл с драйвером (у меня это C:\Drivers\TestDriver) с помощью команды cd (у меня команда выглядит следующим образом: cd C:\Drivers\TestDriver) и набираем команду build.
Данная команда соберет нам драйвер TestDriver.sys и положит его в папку «objchk_wxp_x86\i386».
Итак, чего же мы достигли: мы написали, скомпилировали и запустили свой первый Windows-драйвер! Добавлю только, что при написании сложный драйверов для отладки используется двухмашинная конфигурация, когда на одном компьтере ведется написание драйвера, а на другом — запуск и тестирование. Это делается из-за того, что неправильно написанный драйвер может обрушить всю систему, а на ней может быть очень много ценных данных. Часто в качестве второго компьютера используется виртуальная машина.
Узнайте, как заряжать и использовать наушники Solo3 Wireless, объединять их в пару с другим устройством, а также сбрасывать их настройки.
Включение и зарядка наушников
Чтобы включить или выключить наушники, нажмите и удерживайте кнопку питания в течение 1 секунды.
Чтобы зарядить наушники, подключите их к источнику питания с помощью прилагаемого кабеля Micro USB. Во время зарядки наушников индикаторы уровня заряда будут мигать. Когда наушники полностью заряжены, все 5 индикаторов горят непрерывно.
Чтобы увидеть индикатор уровня заряда, на котором отображается уровень заряда аккумулятора и состояние зарядки, нажмите и отпустите кнопку питания.
Аккумулятор обеспечивает работу наушников до 40 часов в режиме воспроизведения после 2 часов зарядки и до 3 часов после 5 минут зарядки.
Чтобы сохранить заряд аккумулятора или использовать наушники, когда его ресурс будет выработан, подключите кабель RemoteTalk для использования наушников в проводном режиме.
Объединение наушников в пару с другим устройством
Узнайте, как создать пару между наушниками и вашим устройством.
Объединение в пару с iPhone под управлением ОС iOS 10 или более поздней версии
Если вы используете iPhone с iOS 10 или более поздней версии, выполните следующие действия:
Если настроить наушники таким способом, они автоматически настраиваются на работу с другими вашими устройствами, на которых выполнен вход в iCloud и используется ОС iOS 10 или более поздней версии, macOS Sierra или более поздней версии или watchOS 3 или более поздней версии.
При объединении наушников в пару с iPhone с iOS 10 или более поздней версии наушники будут обновляться автоматически. Если ваши наушники не объединены в пару с iPhone с iOS 10 или более поздней версии, для обновления прошивки можно использовать Beats Updater.
Объединение в пару с компьютером Mac или другим устройством Bluetooth
Если у вас есть другое устройство Bluetooth, выполните следующие действия для его объединения в пару с наушниками.
Создание пары с устройством Android
Если вы используете устройство Android, выполните следующие действия.
Использование наушников
Узнайте, как проигрывать музыку, изменять громкость и отвечать на звонки.
Воспроизведение музыки
Для воспроизведения музыки используйте кнопку «b» на левом амбушюре или центральную кнопку на кабеле RemoteTalk в проводном режиме.
- Чтобы начать или приостановить воспроизведение композиции, нажмите кнопку один раз.
- Чтобы перейти к следующей композиции, нажмите кнопку дважды. Чтобы перейти к предыдущей композиции, нажмите кнопку три раза.
- Чтобы перемотать композицию вперед, нажмите кнопку два раза и удерживайте ее при втором нажатии. Чтобы перемотать композицию назад, нажмите кнопку три раза и удерживайте ее при третьем нажатии.
Регулировка громкости
Для управления громкостью воспроизведения используйте кнопки громкости на левом амбушюре или кабеле RemoteTalk. Для управления громкостью вызова используйте элементы управления громкостью на телефоне.
- Нажмите и отпустите кнопку увеличения громкости или нажмите и удерживайте ее для плавного увеличения громкости звука.
- Нажмите и отпустите кнопку уменьшения громкости или нажмите и удерживайте ее для плавного уменьшения громкости звука.
Прием вызовов
Для ответа на звонки используйте кнопку «b» на левом амбушюре или центральную кнопку на кабеле RemoteTalk.
Управление без помощи рук
Чтобы активировать Siri на устройстве iOS или функцию голосового управления на другом устройстве, используйте кнопку «b» на левом амбушюре или центральную кнопку на кабеле RemoteTalk. Нажмите и удерживайте любую из этих кнопок, пока не раздастся звуковой сигнал. Произнесите запрос.
Сброс настроек
Операция сброса настроек может помочь в случае проблем со звуком, Bluetooth или зарядкой наушников.
Как уважаемый хабрапользователь наверняка знает, «драйвер устройства» — это компьютерная программа управляющая строго определенным типом устройства, подключенным к или входящим в состав любого настольного или переносного компьютера.
Основная задача любого драйвера – это предоставление софтового интерфейса для управления устройством, с помощью которого операционная система и другие компьютерные программы получают доступ к функциям данного устройства, «не зная» как конкретно оно используется и работает.
Обычно драйвер общается с устройством через шину или коммуникационную подсистему, к которой подключено непосредственное устройство. Когда программа вызывает процедуру (очередность операций) драйвера – он направляет команды на само устройство. Как только устройство выполнило процедуру («рутину»), данные посылаются обратно в драйвер и уже оттуда в ОС.
Любой драйвер является зависимым от самого устройства и специфичен для каждой операционной системы. Обычно драйверы предоставляют схему прерывания для обработки асинхронных процедур в интерфейсе, зависимом от времени ее исполнения.
Любая операционная система обладает «картой устройств» (которую мы видим в диспетчере устройств), для каждого из которых необходим специфический драйвер. Исключения составляют лишь центральный процессор и оперативная память, которой управляет непосредственно ОС. Для всего остального нужен драйвер, который переводит команды операционной системы в последовательность прерываний – пресловутый «двоичный код».
Как работает драйвер и для чего он нужен?
Основное назначение драйвера – это упрощение процесса программирования работы с устройством.
Он служит «переводчиком» между хардовым (железным) интерфейсом и приложениями или операционными системами, которые их используют. Разработчики могут писать, с помощью драйверов, высокоуровневые приложения и программы не вдаваясь в подробности низкоуровневого функционала каждого из необходимых устройств в отдельности.
Как уже упоминалось, драйвер специфичен для каждого устройства. Он «понимает» все операции, которые устройство может выполнять, а также протокол, с помощью которого происходит взаимодействие между софтовой и железной частью. И, естественно, управляется операционной системой, в которой выполняет конкретной приложение либо отдельная функция самой ОС («печать с помощью принтера»).
Если вы хотите отформатировать жесткий диск, то, упрощенно, этот процесс выглядит следующим образом и имеет определенную последовательность: (1) сначала ОС отправляет команду в драйвер устройства используя команду, которую понимает и драйвер, и операционная система. (2) После этого драйвер конкретного устройства переводит команду в формат, который понимает уже только устройство. (3) Жесткий диск форматирует себя, возвращает результат драйверу, который уже впоследствии переводит эту команду на «язык» операционной системы и выдает результат её пользователю (4).
Как создается драйвер устройства
Для каждого устройства существует свой строгий порядок выполнения команд, называемой «инструкцией». Не зная инструкцию к устройству, невозможно написать для него драйвер, так как низкоуровневые машинные команды являются двоичным кодом (прерываниями) которые на выходе отправляют в драйвер результат, полученный в ходе выполнения этой самой инструкции.
При создании драйвера для Линукса, вам необходимо знать не только тип шины и ее адрес, но и схематику самого устройства, а также весь набор электрических прерываний, в ходе исполнения которых устройство отдает результат драйверу.
Написание любого драйвера начинается с его «скелета» — то есть самых основных команд вроде «включения/выключения» и заканчивая специфическими для данного устройства параметрами.
И чем драйвер не является
Часто драйвер устройства сравнивается с другими программами, выполняющими роль «посредника» между софтом и/или железом. Для того, чтобы расставить точки над «i», уточняем:
- Драйвер не является интерпретатором, так как не исполняется напрямую в софтовом слое приложения или операционной системы.
- Драйвер не является компилятором, так как не переводит команды из одного софтового слоя в другой, такой же.
Ну и на правах рекламы – вы всегда знаете, где скачать новейшие драйвера для любых устройств под ОС Windows.
Раз уж в нашем предыдущем посте мы пригласили всех желающих поучаствовать в добровольной помощи в разработке очередных версий DRP, сегодня пришла пора рассказать о том, как именно мы создаем немаловажную вещь при работе с большими архивами драйверов (необходимые сис. админам и другим профессионалам, занимающимся «серийной» настройкой компьютеров) — индексы.
У каждого пользователя на локальном компьютере собирается индекс всех драйверов, присутствующих в системе – в том числе и самой операционной системой. Его наличие позволяет ускорять поиск драйверов для установленных устройств, а в дальнейшем – и для их обновления. Другими словами – без индекса нельзя, его создание и дальнейшие обновления критическим образом сказываются на скорости и эффективности работы нашего приложения.
Герои Silicon Valley работают над оптимизацией собственных алгоритмов
Как строится пользовательский индекс драйверов
Для каждого устройства в системе есть свой уникальный номер (DevID).
Он отображается как в установках Windows, так и в программе DriverPack Solution. Уникальный для каждого устройства идентификатор (однозначно характеризующий каждое устройство), используется программой для автоматического «подбора» драйвера к нему.
База данных в программе содержит ID всех устройств, самостоятельно отслеживает версии драйверов для них, сопоставляет их версии и актуальность. В случае наличия в базе более новой версии, программа автоматически предлагает установить для устройства новый драйвер. Можно найти драйвер для конкретного устройства и самостоятельно в интернете, выбрав соответствующий режим поиска драйвера.
Для эффективной работы программы необходимы архивы драйверов (в формате "7z"), а для быстрого поиска по ним, требуется проиндексировать файлы, содержащиеся внутри.
Кроме уже содержащихся (довольно обширных) в программе архивов драйверов, DriverPack Solution предоставляет возможность создания пользовательских драйверпаков. Это актуально как при наличии нестандартного оборудования, так и «привязанности» операционной системы пользователя к некоторым типам (возможно устаревших) драйверов.
Новые драйвера после их разархивации «разбросаны» по папкам, которые содержат массу файлов, на первый взгляд, совершенно «ненужных» пользователю.
Для того, чтобы выбрать «нужные» файлы, требуется в распакованных файлах найти один с расширением *.inf.
Именно он содержит (в секции [SourceDisksFiles]) перечень необходимых файлов, по которому и требуется скопировать список файлов в предварительно созданную пользователем папку.
Примечание: если среди распакованных файлов нет .inf-файла, то автоматическое создание пакета драйверов невозможно. Настоятельно не рекомендуется удалять файлы с расширением *.САТ – сведения о цифровой подписи.
Как было раньше
До 2010 года, пока версий Windows было чуть меньше, нами использовался следующий метод создания индекса к сборке драйверов.
Создается папка D (сокр. от «Drivers»), а драйверы помещаются в любую подпапку внутри директории D.
Имя подпапки (поддиректории) может быть любым, однако рекомендуется использовать максимально короткие имена. Стоит избегать длинных путей к файлам – это может привести к ошибкам и помешать установке.
При создании структуры папок пакета драйверов следует придерживаться определенных общепринятых правил именования. Обязательно должны использоваться только английские названия папок.
В созданных папках драйверы разделяются по производителям, тем самым образуя подпапки.
Названия производителей также рекомендуется максимально сокращать. Например: «NVidia» – «N», «ATi» – «A» и т. д. Внутри папки с именем производителя драйверы располагаются в папках 1-9, при необходимости число папок может быть увеличено. После создания необходимой структуры папок поместите ваши драйверы в соответствующие подпапки (примечание: распакованные файлы, .inf-файлы, но не архивы или программы установки).
Название папки | Английское название | Пояснение |
A | Additions | Дополнения |
B | Broadband | Широкополосные сетевые устройства (*DSL-модемы и им подобные) |
C | Chipset | Наборы системной логики (чипсеты) |
CPU | Central processor unit | Центральный процессор (необходим для AMD K8) |
D | Dial-Up | Модемы |
G | Graphics | Видеоадаптеры (Графические карты) |
L | LAN | Сетевые адаптеры |
M | Mass Storage | Контроллеры жестких дисков |
P | Printers | Принтеры |
S | Sound | Звуковые адаптеры |
VMWare | VMWare | Драйверы для виртуальной машины VMWare |
W | WLAN | Беспроводные адаптеры |
U | USB | USB-устройства (флешки, фотокамеры) |
Y | Misc | Разное (Все что не попало в другие разделы) |
Y | Monitor | Мониторы |
Z | Hid | Устройства ввода (Интелектуальные мыши, клавиатуры тачпады и т.п.) |
Процесс создания (пользовательских) пакетов драйверов
После создания структуры папок с новыми драйверами требуется заархивировать созданную папку (в примере – это папка «D») в соответствии с требованиями программы к архиву.
- Имя архива: «DP_НазваниеПакетаДрайверов_ x86-32_ВерсияПакетаДрайверов.7z»
- Требования: имя архива не должно содержать пробелов. Например, название пакета драйверов версии 9.06 для контроллеров жестких дисков должно быть таким: «DP_MassStorage_x86-32_906.7z.»
- Формат архива: 7z
- Уровень сжатия: «Ultra» (для обеспечения максимальной компрессии, при желании вы можете указать меньший уровень сжатия).
- Метод сжатия: «LZMA» (значение установлено по умолчанию, изменять его не рекомендуется).
- Размер словаря: 32 Mb
Последнее установлено по умолчанию. Можно увеличить или уменьшить значение этого параметра. Увеличение данного параметра позволяет достичь большей компрессии, но требует больше времени для создания архива.
Индексные файлы хранятся в *.txt — формате, и находятся папке «Indexes» а не в «dev_db», как было ранее.
Структуру индексных файлов целесообразно рассмотреть на примере двух драйверов.
Содержимое индексного файла для 1-го:
– «PCI\VEN_8086&DEV_24D5&SUBSYS_680316F3 Audio_w7x64_912.2\ Audio_w7x64_912.2\3\1\Alcwdm18.inf Realtek.NTamd64 06/19/2009,6.0.1.6305 Realtek AC'97 Audio»
Содержимое индексного файла для 2-го:
– «HDAUDIO\FUNC_01&VEN_10DE&DEV_8067 Audio_w7x64_912.2\ Audio_w7x64_912.2\11\1\nvhda.inf VIDIA.NTamd64 11/11/2009,1.00.00.63 NVIDIA High Definition Audio»
Более развернуто объяснение структуры приведено в таблице:
Элементы структуры | Драйвер 1 | Драйвер 2 |
Device ID (идентификатор устройства) | PCI\VEN_8086&DEV_24D5&SUBSYS_680316F3 | HDAUDIO\FUNC_01&VEN_10DE&DEV_8067 |
Путь хранения драйвера в архиве | Audio_w7x64_912.2\Audio_w7x64_912.2\3\1\ | Audio_w7x64_912.2\Audio_w7x64_912.2\11\1\ |
Название inf-файла | Alcwdm18.inf | nvhda.inf |
Тип | Realtek.NTamd64 | NVIDIA.NTamd64 |
Дата выпуска и версия | 06/19/2009,6.0.1.6305 | 11/11/2009,1.00.00.63 |
Название устройства | Realtek AC'97 Audio | NVIDIA High Definition Audio |
Текущие реалии
Сегодня жесткой привязки к структуре индекса нет, что называется, «свободный стиль».
Главное – это использовать маркеры операционных систем. Дополнительно есть маркеры для, практически, всех производителей ноутбуков.
При этом расположение и название папок и подпапок перестало иметь значение, единственное требование – наличие минимально одного маркера системы.
Фактически же маркер – конкретное название папки. Оно видно в названии одного из подкаталогов драйвер-пака: DRP\Drivers\DP_Chipset_14101.7z\Intel\WinAll\Chipset\9.4.0.1007_HECI\
В данном случае «WinAll» значит «все версии Windows».
Версия Windows = маркер (имя подпапки), характеризующий, что драйвер который находится внутри папки-маркера подходит для указанной ОС.
- XP x64 =«5x64»;
- XP x86 =«5x86»;
- Vista x64 =«6x64|NTx64|AllNT|67x64»;
- Vista x86 =«6x86|NTx86|AllNT|67x86»;
- Windows 7 x64 =«7x64|NTx64|AllNT|67x64|78x64|781x64|7819x64»;
- Windows 7 x86 =«7x86|NTx86|AllNT|67x86|78x86|781x86|7819x86»;
- Windows 8 x64 =«8x64|NTx64|AllNT|78x64|All8x64»;
- Windows 8 x86 =«8x86|NTx86|AllNT|78x86|All8x86»;
- Windows 8.1 x64 =«81x64|NTx64|AllNT|781x64|7819x86|All8x64»;
- Windows 8.1 x86 =«81x86|NTx86|AllNT|781x86|7819x86|All8x86»;
- Windows 9 x64 =«9x64|NTx64|AllNT|7819x64|All8x64|81x64»;
- Windows 9 x86 =«9x86|NTx86|AllNT|7819x86|All8x86|81x86»;
- Windows 10 x64 =«10x64|NTx64|AllNT|78110x64|All8x64»;
- Windows 10 x86 =«10x86|NTx86|AllNT|78110x86|All8x86»;
- Все x64 =«Allx64»;
- Все x86 =«Allx86»;
- Все XP =«AllXP»;
- Все Vista =«All6»;
- Все Windows 7 =«All7»;
- Все Windows 8 =«All8»;
- Все Windows 8.1 =«All81»;
- Все Windows 9 =«All9»;
- Все Windows 10 =«All10»;
- Любые Windows =«WinAll»;
Маркеры ноутбуков
Маркер-папка с названием производителя ноутбука = слово, используемое самим производителем для идентификации его ноутбуков
- Acer_nb = acer / emachines / packard*bell / gateway / aspire
- Apple_nb = apple
- Asus_nb = asus
- Dell_nb = dell / alienware / arima / jetway / gericom
- Fujitsu_nb = fujitsu / siemens
- Gigabyte_nb = gigabyte
- HP_nb = hp / compaq
- Lenovo_nb = lenovo / compal / ibm
- LG_nb = lg
- MSI_nb = msi / micro-star
- NEC_nb = nec
- Panasonic_nb = panasonic / matsushita
- Samsung_nb = samsung
- Sony_nb = sony / vaio
- Toshiba_nb = toshiba
- OEM_nb = другие вендоры (benq / clevo / depo / durabook / ecs / elitegroup / eurocom / getac / intel / iru / k-systems / medion / mitac / mtc / nokia / pegatron / prolink / quanta / sager / shuttle / twinhead / rover / roverbook / viewbook / viewsonic / vizio / wistron и т.д.)
Текущий индекс
Если при скачивании с нашего сайта обновленных драйвер-паков их имена файлов совпадают (например, старый и новый файл имеет имя «DP_Chipset_14112.7z»), можно просто заменить старые файлы новыми.
При наличии такого же файла, но с меньшим номером, его можно удалить: скачали «DP_Chipset_14112.7z», но в папке есть «DP_Chipset_14111.7z» — файл с меньшим номером версии «DP_Chipset_14111.7z» можно удалить.
Индексируем новые драйвер-паки (создаем списки поддерживаемых устройств).
Если старые индексы удалены, то при запуске DRP, программа автоматически попросит вас произвести индексацию новых драйвер-паков — например программа для нового драйвер-пака «DP_Chipset_14112.7z» создает файлы-индекса «DP_Chipset_14112_xxx.xxx» в соответствующей папке в «X:\DRP\Indexes\».
Можно также удалить и старые индексы.
В папке «Indexes» необходимо удалить все файлы старого драйвер-пака.
Имени файла индекса соответствуют имя драйвер-пака и найти его легко. Например, вы скачали драйвер-пак «DP_Chipset_14112.7z» а у вас был «DP_Chipset_14111.7z», соответственно удаляем все файлы-индексы «DP_Chipset_14111_xxx.xxx», если же и скаченный и старый драйвер-пак имеют одинаковое имя например «DP_Chipset_14112.7z», то индексы «DP_Chipset_14112_xxx.xxx» также нужно удалить т.к. список поддерживаемых устройств в новой версии драйвер-пака может отличаться.
Если вам лень выискивать нужный для удаления индекс — можно удалить все папку «Indexes» и тогда программа будет создавать индексы для всех драйвер-паков, а не только для нового, что займет больше времени, но результат будет идентичным.
Надеемся, что данное руководство по созданию индекса драйверов будет полезно не только разработчикам DriverPack Solution.
Читайте также: