У тебя есть необходимость зарегистрировать DLL файл(ы) или файл драйвера в системе Windows, и ты не знаешь, как это сделать? Тогда эта статья для тебя! Мы поможем подробно разобраться как же зарегистрировать в системе нужный для файла.
Зачем может понадобиться регистрировать dll файл с помощь командной строки?
Не все драйвера просто так готовы установиться с помощь стандартной процедуры «инсталляции». Многие из нас привыкли нажать install и ждать пока драйвер или программа установиться и покорно вынесет нам ярлык на рабочей стол. Но это происходит далеко не со всеми программами, приложениями и драйверами.
Для каких программ может понадобиться регистрация dll с помощью командной строки?
- Регистрация драйвера эквайринга от сбербанка. Для того что бы терминал оплаты картой заработал в Pos системе frontol или 1c сначала нужно зарегистрировать нужные библиотеки, такие как sbrf.dll и sbrfcom.dll. Для многих версий программы, кроме того, что просто зарегистрировать эти библиотеки, нужно поместить эти *.dll файлы в корень папки bin платформы 1с предприятие, и зарегистрировать их оттуда, только тогда их определить драйвер торгового оборудования.
- Регистрация драйвера электронных весов от Штрих-м. Большинство весов, подключенных по usb и ethernet кабелю тоже капризны в плане установки драйвера, для большинства из них отечественный производитель пишет небольшое приложения для настройки и теста и присылает файлик в формате scale.dll который нужно зарегистрировать для того что бы весы заработали.
- Регистрация dll для игр и их «патчей». Мы живем в эру пиратства, большинство людей не хочет покупать лицензионные игры, а подростки и дети — попросту не в состоянии купить дорогую игру. Поэтому многие прибегают к скачанным с торрента «крякнутым» играм и программам, взломщики которых часто требуют провести аналогичную процедуру с dll файлами.
- Регистрация dll различных программ. На самом деле регистрация dll используется повсеместно и может быть применена для программы любого назначения.
Как же зарегистрировать DLL в системе? (Инструкция)
Шаг №1 (открываем командную строку)
Для того что бы открыть командную сроку в большинстве операционных систем нужно попасть в меню пуск. Далее найти ту саму командную строку в списке служебных программ или воспользоваться встроенным поисковиком в меню пуск или командой выполнить. Задать поисковый запрос «cmd» после того как ярлык командной строки появиться в поиске не спешите кликать по нему мышкой. Для начала прицельтесь 🙂 нажмите по ней правым кликом мышки и запустите командную строку от имени администратора.
Шаг №2 (копируем путь к файлу dll)
После того как мы открыли командную строку, нам следует скопировать путь к файлу dll. К примеру, это будет sbrf.dll или scale.dll. Мы заходим в нужную нам папку с файликом dll, выделяем путь к этой папке, нажимаем копировать и получаем стройку формата C:\papka-s-dll-faylom.
Шаг №3 (Прописываем команду regsvr для регистрации dll)
Завершающий этап. В командной строке пишем команду regsvr32 в независимости от битности (разрядности) вашей операционной системы. После этого нам нужно вставить скопированный нами путь из Шага №2. Но не всё так просто, у командной строки cmd (досовской программы) и буфера обмена Windows — разные запоминалки, и для того что бы скопировать что-то из Windows в досовское окно нужно нажать правой кнопкой по рамке окна cmd — изменить — вставить. Перед тем как вставить не забудьте отступить 1 пробел. В некоторых случая dll не пропишется если вы в пути файла не укажите кавычки. В конце пути файла нужно положить еще один слеш «\». После слеша нужно написать название файла.dll и закрыть кавычки, нажать enter.
0
(6 votes, average: 5.00 out of 5)
An average of 46% of buyers interviewed by Forter in 2023 are willing to spend more with vendors they trust. Boost customers’ trust by showing your users that your drivers are authentic (i.e., published by you) and unmodified. Follow our step-by-step instructions to learn how to use SignTool to sign your drivers
In today’s digital world, driver signing has become a “must-have” tool for your toolbox. Threats are lurking around every corner. In the first half of 2023, S21Sec Cyber Solutions by Thales reports that ransomware attacks have increased by an astonishing 43% compared to the previous six months. The AV-TEST Institute reports that nearly 9 million new malware and unwanted applications are identified every month. And what better way to prevent someone from tampering with your software files than to digitally sign them before release?
If you’re a software developer or a vendor who’s trying to figure out how to digitally sign a driver that meets the industry’s new code signing requirements, then search no more; we’re here to help.
This step-by-step tutorial will walk you through how to digitally sign a driver with a code signing certificate.
Getting Started – What Do You Need to Sign a Driver for Windows?
Here is the essential checklist of the five actions to carry out before signing a driver:
Essential Tools For Signing Windows Drivers | Description |
1. Install SignTool.exe on the Windows device you’ll use to sign your driver. | The SignTool is a command-line tool embedded in Windows SDK that lets you sign, timestamp, and verify Microsoft Authenticode-supported file formats such as .exe, .cat, .cab, .jar, and of course, drivers (i.e., .sys, .dll files). |
2. Purchase a code signing certificate issued by a publicly trusted certificate authority (CA). | A standard certificate, like the one used in this guide, works in many cases. However, in some cases, you may need to sign using an extended validation (EV) code signing certificate (more details in the following sections). |
3. Set up the hardware security token sent to you by the CA. | This reflects the new industry criteria requiring, since June 2023, that all code signing certificates’ keys are stored on cryptographically secure hardware (e.g., USB tokens). |
4. Download and install the authentication client provided by the CA. | This is the software you utilized to set up your secure token when you received it. In this tutorial, we’ll use the SafeNet Authentication client. |
5. Get administrator permissions. | The SignTool.exe will work only with admin permissions. Contact your IT department if you don’t have admin access on your device. |
Did you check all the five points? Well done. We can now move on to the next section and discover the steps to sign a driver. Let’s get the party started!
How to Sign an Unsigned Driver With Microsoft’s SignTool
Got your driver to sign at hand? Good. In our demonstration, we’ll sign a user-mode driver (e.g., a .dll file). However, the same process can be used to sign kernel-mode drivers (e.g., .sys files) and driver packages (e.g., .cat files). Ready? C’mon, it’s driver-signing time, baby!
1. Connect Your Hardware Token and Open the Authentication Client
This is the first thing you’ll have to do each time you must sign a file or software. Should you forget about it and try to do it later in the process, it won’t work.
2. Open a Command Prompt Window (CMD) as Administrator
If you’re already logged in as an admin, click the CMD app icon. If you aren’t, search for “cmd” using the Windows search box. Under the Command Prompt App icon, select Run as administrator. Enter your admin password when prompted.
3. Switch to the Directory Containing Microsoft’s SignTool
To change directories after you’ve installed Windows SDK in the default folder (i.e., .bin), use the command below.
cd C:\Program Files (x86)\Windows Kits\10\bin\YourSDKversion\x86
Replace “YourSDKversion” with the correct version number installed on your machine (in our example, shown in the screenshot, it’s 10.0.22621.0).
If SDK has been installed in a different directory, adapt the script to reflect the specific file path and folder name:
cd C:\your filepath\your folder
Did you have to log in as an admin when you first opened the CMD? Jump to step four.
Were you already logged into your device as an admin? After executing the cd command illustrated above, in the same window, type “c:” and hit enter.
4. Sign (and Timestamp) Your Windows Driver
OK. Now, this is the part when you get to really sign your driver. This section will walk you through how to add an optional timestamp to your digital signature. Wondering why you should do that if Windows policies don’t require it? Because doing so is generally a good idea.
In a way, a timestamp is like a free extended warranty. When applied, it’ll keep your signature valid, even when your code signing certificate expires. This means no ugly warnings will be displayed to the users when they attempt to install your driver. Yeah!
So, how can you sign and timestamp your driver in one go? All you have to do is type the command below in the command line. Get your CA’s timestamp’s server information (which is usually available on their support page) and replace the “CAtimestamp.server.com” bit with it. Double-check you’ve also entered the correct driver’s file path and name.
signtool sign /tr http://CAtimestamp.server.com /td SHA256 /fd SHA256 /a "C:\filepath\Mydriver.dll"
Here’s what it looks like for us when using the DigiCert timestamp server:
Once you hit enter, a pop-up will prompt you to type your Authentication client password (as shown below).
Once the password has been entered, click on the OK button. That’s all, folks! If you did everything correctly, you should see a message like the one displayed in our screenshot below:
Want to sign without timestamping? Use this command instead:
signtool sign /td SHA256 /fd SHA256 /a "C:\filepath\Mydriver.dll"
Last but not least, regardless of whether you signed your driver with a timestamp, take the time to verify your signature was applied successfully. As the Scottish historian and philosopher Thomas Carlyle said: “One must verify or expel his doubts, and convert them into the certainty of yes or no.”
5. Verify Your Signed Driver
Two scripts can be used to verify your signature in CMD. The verbose one (shown below) will provide:
- Highly detailed information about the signature;
- The code signing certificate used; and, if applied
- The timestamp data.
Want to use it? In the same CMD window type:
signtool verify /pa /v “C:\filepath\Mydriver.dll”
A plethora of juicy details will be displayed, like in the following example:
You didn’t add a timestamp? You’ll still get an exhaustive list, down to the fine points. SignTool’s verification information will also clearly state that the driver comes without a timestamp:
Would you rather get a more concise summary? Use this script instead:
signtool verify /pa “C:\filepath\Mydriver.dll”
Et voila’. The results boil it down to covering only the most essential information.
At last, we can confirm that we’ve signed the driver correctly. Do you want to sign a driver package (e.g., a .cat file)? Follow the same process.
Are you planning to distribute the driver through the Windows Update program? Then you’ll have to follow some additional steps. And this isn’t the only case. Let’s find out more about these different situations.
Additional Steps to Follow for Kernel Mode Release Drivers, Driver Packages Signing, and Other Exceptions
Before the advent of Windows 10 version 1607, the code signing process we’ve just described was the only requirement to release any kind of Windows driver. As time passed, cybercriminals’ attacks got more sophisticated. As a result, organizations had to beef up their security measures, and so did Microsoft’s driver signing policy.
Now, the Windows Driver Signature Enforcement requirements are more strict:
- Kernel-mode drivers can no longer be signed with a standard certificate. All drivers “talking” directly to operating systems’ cores (i.e., kernel-mode drivers, usually indicated by the .sys extension) must be signed with the more secure EV code signing certificate. The standard code signing certificate can still be used to sign user-mode drivers (i.e., those running separately from the core operating system).
- An additional signature is required. Did you develop a kernel or user mode driver, or a driver package that’ll be distributed through the Windows Update program or other MS-supported distribution mechanisms? On top of creating the digital signature you’ve just learned to apply, you must:
- Create an account using the Windows Hardware Developer Center Dashboard portal (Dev Portal),
- Ensure your public release driver undergoes testing using the Windows Hardware Certificate Program testing kits (e.g., WHLK for Windows 10, 11, and Windows Server 2016 or later; WHCK for Windows 8.1 and earlier; and WLK for Windows Server 2008 and older), and
- Create a driver submission package (i.e., .hlkx/.hckx or .cab for WLK hardware) for a Windows Hardware Certification Program (WHCP) digital signature in the Dev portal. If successful, your submission will return a WHCP-signed .cat file.
- To access the Dev Portal, you’ll need an EV certificate. If your code must also be certified and signed by Microsoft, as explained above, you’ll have to register with the Dev Portal. And guess what? You’ll need an EV code signing certificate to do that.
Moreover, Microsoft’s Windows driver signing tutorial specifies:
“The mandatory kernel-mode code-signing policy applies to all kernel-mode software for x64-based systems that are running on Windows Vista and later versions of Windows. However, Microsoft encourages publishers to digitally sign all kernel-mode software, including device drivers (user-mode drivers included) for 32-bit systems as well. Windows Vista and later versions of Windows, verify kernel-mode signatures on 32-bit systems. Software to support protected media content must be digitally signed even if it is 32-bit.
User-mode drivers, like the Printer driver will install and work in an x64-based computer. A dialog will appear to the user during installation asking for approval to install the driver. Beginning in Windows 8 and later versions of Windows, installation will not proceed unless these driver packages are also signed.”
Does the driver you’ve just signed fall into one of these examples? If this is the case, to complete the process and get it ready for release, follow the above-mentioned Microsoft tutorial.
Pro tip: If you want to sign a driver package, don’t forget to individually sign your driver (e.g., SYS or DLL) and the .cat file. If you don’t, Windows will still consider the package as unsigned.
Looking to sign other file types? You can do that using the same code signing certificate. Discover how by exploring our compelling guides:
- Sign and timestamp JAR file.
- Sign MSI installer files and packages.
- Sign EXE files using a code signing certificate.
Final Thoughts About How to Digitally Sign a Driver for Windows
Cryptographically signing Windows drivers isn’t too much of a headache, provided that you have the right tools (e.g., an EV certificate for kernel-mode drivers or those you’ll distribute through Windows update) and a good, comprehensive step-by-step tutorial to follow. We hope this guide serves as a useful tool you’ll want to share with friends or colleagues who want to understand how to digitally sign an unsigned driver for Windows systems.
The digital world is a tough place for organizations and users alike. However, you can offer your customers a much more enjoyable and secure experience by signing your drivers. What’s in it for you? Among all the benefits, it’ll boost customers’ trust in your brand and software, which can help expand your potential buyers’ pool.
Gone are the times when users blindly trusted what they were downloading from the internet. In this day and age, to be successful, learning how to sign drivers and software is something that no developer or software vendor can forgo.
Чтобы Windows могла взаимодействовать и корректно обращаться к физическому оборудованию компьютера, в операционной системе должны быть установлены соответствующие драйвера. В этой статье мы рассмотрим, как вручную установить драйверы устройств в Windows 10/11 и Windows Server 2016-2025.
Содержание:
- Автоматический поиск драйверов в Windows
- Поиск драйверов для неизвестных устройств
- Ручная установка драйвера с помощью INF файла в Windows
- Экспорт и импорт драйверов в Windows
Автоматический поиск драйверов в Windows
В образ современных версий Windows включены базовые драйвера для распространенных типов устройств. После подключения устройства к компьютеру, Windows попытается выбрать наиболее подходящий драйвер из локального хранилища драйверов. Кроме того, Windows может автоматически установить драйвера некоторых устройств, которые опубликованы в каталоге Microsoft Update:
- Попробуйте выполнить автоматический поиск подходящих драйверов через диспетчер устройств. Откройте Device Manager (
devmgmt.msc
), щелкните по устройству, для которого отсутствует драйвер, и выберите Update Driver -> Search automatically for updated driver software. - Если драйвер не найден, диспетчер оборудования предложит выполнить автоматический поиск драйвера через Windows Update. Нажмите на ссылку Search for updated drivers on Windows Updates или перейдите: Settings -> Windows Update -> Check for Updates.
Для брендовых (OEM) устройств, все необходимые драйвера обычно можно найти по названию модели компьютера на сайте производителя. Если компьютер собран из разных комплектующих, искать и устанавливать драйвера скорее всего придется по отдельности.
Если Windows не смогла автоматически подобрать подходящие драйвера, их придется установить вручную.
Поиск драйверов для неизвестных устройств
Начать нужно с определения производителя и модели оборудования подключенного устройства. Если для устройства отсутствует драйвер, он отображается в диспетчере оборудования Windows с желтой восклицательной иконкой.
- Откройте свойства неизвестного устройства и перейдите на вкладку Details
- В выпадающем списке выберите свойство Идентификаторы оборудования (Hardware IDs)
- Скопируйте идентификатор. В нашем примере это VID_2357&PID_010C
В идентификаторе оборудования указан ID производителя (VID) и ID продукта (PID). В нашем случае VID=2357 и PID=010C. Затем на сайте https://devicehunt.com/ определите название устройства по его VID и PID. В этом примере это внешний USB сетевой адаптер TP-Link (TL-WN722N v2/v3 [Realtek RTL8188EUS])
Теперь перейдите на сайт вендора и по модели оборудования найдите драйвер для вашей версии Windows. В моем случае это драйвер для Windows 10/11 (TL—WN722N_V4_190409_Win10/11). Скачайте драйвер.
Категорически не рекомендуем скачивать драйвера с любых сайтов, кроме официальных сайтов производителей.
Ручная установка драйвера с помощью INF файла в Windows
В нашем примере драйвер упакован в ZIP архив, который содержит автоматический установщик setup.exe. Он используется для автоматической установки драйвера, а также различных дополнительных программ и утилит от вендора (в этом примере мы не будем использовать установку драйверов через такой инсталлятор).
Если же распаковать содержимое архива, можно найти в нем папку, в которой хранятся только файлы драйвера. В каталоге драйвера обязательно должен быть INF файл (текстовый файл с конфигурацией драйвера, описанием зависимых файлов, правилами установки и т.д.), а также CAT и DAT, SYS, DLL файл(ы) (опционально).
Драйвер из INF файла можно установить несколькими способами.
Установка драйвера из Device Manager.
- Щелкните по вашему устройству в диспетчере оборудования и выберите Update Driver
- Выберите Browse my computer for driver software
- Нажмите кнопку Browse и укажите путь к распакованной папке с драйвером. Включите опцию Include subfolders для автоматического сканирования вложенных папок на наличие драйверов
- Нажмите Next, чтобы продолжить установку драйвера.
Также можно вручную добавить любой драйвер в хранилище драйверов Windows. Для этого щелкните правой кнопкой по INF файлу драйвера в проводнике и выбрать Install.
Или можно установить драйвер из командной строки с помощью утилиты pnputil.
pnputil /add-driver c:\drivers\windows_10_64bit\netrtwlanu.inf
Можно рекурсивно установить все драйвера хранящиеся в каталоге (включая подпапки) с помощью команды:
pnputil /add-driver C:\Drivers\*.inf /subdirs /install
Это также добавит драйвер в хранилище драйверов Windows (
C:\Windows\System32\DriverStore\FileRepository
). Осталось выбрать пункт Update Driver в диспетчере задач, и драйвер для вашего устройства автоматически будет установлен из локального хранилища драйверов.
После того, как устройство корректно определилось в Device Manager, можно перейти к следующему устройству, для которого отсутствуют драйвера.
Оптимально использовать такой
порядок установки драйверов в Windows
: в первую очередь нужно установить драйвера чипсета и контроллеров материнской карты. Драйвера сетевого адаптера, затем драйвера для видео и аудио карт, и в последнюю очередь для внешних устройств (драйвера принтера, сканера, проектора, других USB устройств).
Экспорт и импорт драйверов в Windows
Можно вывести все сторонние драйвера (кроме встроенных), которые установлены в хранилище драйверов Windows:
DISM /online /get-drivers /format:table
Чтобы удалить любой драйвер из хранилища, нужно указав его INF файл в формате oemxx.inf. Например:
pnputil /delete-driver oem46.inf /uninstall /force
Если у вас есть несколько однотипных компьютеров, вы можете экспортировать все установленные драйвера на одном компьютере, а затем импортировать их на другом.
Выгружаем все установленные в Windows драйвера в каталог C:\Drivers:
dism /online /export-driver /destination:C:\Drivers
Теперь папку Drivers нужно скопировать на другой компьютер и установить (импортировать) все драйвера одной командой:
pnputil.exe /export-driver * c:\drivers
Также можно предварительно интегрировать эти драйвера в установочный образ Windows. В этом случае все оборудование компьютера будет определено автоматически сразу после установки, а ручная установка драйверов не понадобиться.
Очевидно, что у каждого пользователя персонального компьютера, время от времени возникает необходимость подключить к своей станции какое-либо устройство. Причина, по которой это происходит, нас сейчас не сильно то и интересует, это может быть и хорошо знакомый многим апгрейд (в целях увеличения производительности отдельных узлов, и как следствие общей производительности системы), это может быть и просто добавление нового оборудования для расширения функционала существующей конфигурации, как, например, в случае с подключением нового игрового манипулятора, это может быть и потребность в использовании данных с флеш-накопителя. Вне зависимости от того, каким именно образом мы подключаем новое устройство, операционная система Windows вынуждена реагировать на появление нового оборудования, производя определенные манипуляции для обеспечения поддержки нового оборудования на программном уровне. Во многих операционных системах для обеспечения программного взаимодействия с устройствами используются интерфейс между оборудованием и программным слоем под названием драйвер.
Драйвер (Driver) — программное обеспечение, при помощи которого операционная система и работающие в её составе программные модули, получают доступ к аппаратному или логическому устройствам.
Именно поэтому операционная система пытаемся всеми доступными ей методами обеспечить функционирование устройства в своей среде, для этого производится попытка установки для вновь подключаемого устройства соответствующего драйвера, дабы тем самым предоставить функции нового устройства для доступа программам пользовательского режима и коду режима ядра, ведь без этого самого пресловутого драйвера оборудование в системе работать попросту не сможет.
Я не случайно упомянул в определении логические устройства, поскольку существует отдельная категория драйверов, которые не занимаются обслуживанием аппаратного обеспечения, а интегрируются для расширения реализации (расширения, дополнения) функциональных особенностей различных модулей системы. Но кого сейчас удивишь установкой драйверов? Этот процесс настолько уже хорошо знаком всем пользователям ПК по многолетней практике, что некоторые, я уверен, могут делать это с закрытыми глазами Но задумывались ли мы о деталях этого процесса, размышляли ли когда-нибудь над алгоритмом установки драйвера? Задавались ли вопросом, какие именно действия выполняет операционная система в момент подключения нового устройства и инсталляции драйверов?
Согласитесь, что с точки зрения пользователя процесс установки драйвера в Windows, в большинстве случаев, выглядит достаточно прозаично. В системном трее появляется привычный анимированный значок мастера установки, и система через некоторое время может выдать отчет об успешном, либо неудачном завершении процедуры инсталляции в системе драйвера нового устройства. Более того, зачастую мастер установки кроме этой самой иконки в трее вовсе не выдает никаких визуальных подтверждений о попытках инсталляции нового устройства, при этом «тихо» добавляя новое оборудование в список устройств и (в случае неудачи) маркируя его специальным значком в диспетчере устройств, предлагая пользователю в ручном режиме продолжить конфигурирование оборудования. Все эти внешние процессы, хорошо уже знакомые как Вам так и мне, в той или ином виде присутствуют во всех версиях операционных систем Windows практически с момента появления этой операционной системы, незначительно отличаясь между собой лишь в деталях. Они стали настолько знакомыми и привычными, что я даже никогда и не задумывался, а что же происходит «по ту сторону экрана», в недрах операционной системы, что скрывается под этой мнимой простотой? Как Вы увидите далее, установка драйвера Windows для физического либо логического устройства скрывает под собой довольно сложные и чрезвычайно интересные процессы. Алгоритм установки драйвера в Windows можно разбить на перечисленные ниже ключевые глобальные задачи:
- Копирование двоичного файла драйвера в соответствующий каталог в системе;
- Регистрация драйвера в системе Windows с указанием метода загрузки;
- Добавление необходимой информации в системный реестр;
- Копирование/установка связанных вспомогательных компонентов из пакета драйвера;
Помимо основных задач, выполняемых в рамках алгоритма установки драйвера в Windows, неплохо было бы классифицировать и условия, по которым стартует процесс установки драйвера Windows:
- Пользователь инсталлирует в выключенный компьютер новое устройство. В этом случае, сам процесс обнаружения нового устройства и инсталляции драйвера начинается уже на этапе загрузки операционной системы.
- Пользователь с правами локального администратора, при помощи оснастки «Диспетчер устройств» инициирует установку либо обновление драйвера для какого-либо уже установленного устройства.
- Пользователь «на ходу» подключает к работающему компьютер новое устройство. В этом случае речь идет об определенной категории устройств, которые могут подключаться «на лету», таких как устройства с внешним интерфейсом
eSata
,USB
и прч. Ведь Вы же не будете инсталлировать внутреннюю видеокарту, когда питание подано на слотыPCIe
? Я лично такого пока еще не вытворял - Пользователь самостоятельно запускает программу установки комплекта пакета драйвера из-под учетной записи с правами локального администратора. Такой способ может использоваться как для установки драйверов для физических устройств, которые поддерживают стандарт Plug and Play, так и для установки не-PnP (legacy) драйверов, драйверов логических устройств, которые не могут быть автоматически обнаружены системой и которые не могут быть проинсталлированы иначе как в ручном режиме. Характерным примером могут быть антивирусы или виртуальные машины, которые инсталлируют свои драйвера (логических устройств) в систему.
- Пользователь щелкает правой кнопкой мыши на .inf-файле в директории с драйвером и выбирает пункт Установить из-под учетной записи с правами локального администратора.
Но что представляет из себя сам пакет драйвера? Ведь, как мы неоднократно видели, это целый набор файловом абсолютно различного, на первый взгляд, назначения. Без более углубленного обзора структуры инталляционного пакета установки драйвера нам будет сложно понять и сам алгоритм установки драйвера, поэтому приведем общие составляющие:
- .inf-файл(ы). Ключевой компонент установочного пакета драйвера — файл, описывающий процесс инсталляции драйвера. inf-файл разделен на секции и состоит из инструкций, указывающих системе на то, как именно устанавливается драйвер: они описывают устанавливаемое устройство, исходное и целевое местонахождение всех компонентов драйвера, различные изменения, которые необходимо внести в реестр при установке драйвера Windows, информацию о зависимостях драйвера и прочее. .inf-файлы связывают физическое устройство с драйвером, контролирующим данное устройство.
- Двоичный файл(ы) драйвера. Пакет, как минимум, должен содержать .sys— или .dll-файл ядра драйвера. Фактически один-единственный .sys-файл (в крайнем случае) может быть установлен (с оговорками) в ручном режиме через правку реестра.
- Исполняемые файлы установки. Обычно это всем хорошо уже знакомые утилиты инсталляции, которые имеют имена setup.exe, install.exe и некоторые другие.
- Исполняемые файлы удаления. Обычно это утилиты деинсталляции, которые имеют имена uninstall.exe.
- Файл(ы) дополнительных процедур и библиотек. Обычно это вспомогательные библиотеки формата .dll, соинсталляторы.
- .cat-файл(ы). Файл каталога, подписанный цифровой подписью. Данные файлы содержат цифровые подписи каталогов и играют роль сигнатуры для файлов пакета, с помощью которой пользователь может определить происхождение пакета и проверить целостность файлов пакета драйвера. Требуются в 64-битных версиях Windows, начиная с Vista и более поздних и рекомендуются для всех остальных.
- Модули управления пользовательского режима. Обычно это различные командные апплеты, работающие в пользовательском режиме, такие как ATI Catalist Control Center, VIA HD Audio Desk, Realtek HD Audio Control Panel и аналогичные.
- Файлы справок. Куда же без них то?
Термины и определения
В данной статье я приведу описание только одного метода установки, который, в любом случае, описывает практически все этапы алгоритма установки драйвера в Windows, которые применимы и к другим способам. И разговор у нас сейчас пойдет о ситуации, когда пользователь вставляет во внутренний разъем выключенного компьютера новое оборудование, например видеокарту. Но для начала введем некоторые, необходимые нам в процессе изучения алгоритма установки драйвера, определения.
Менеджер (диспетчер) Plug and Play (PnP Manager, PnP Менеджер) — облако кода режима ядра и пользовательского режима, отвечающее за добавление, распознавание, удаление устройств в системе. Блок режима ядра взаимодействует с остальными компонентами системы в процессе загрузки/установки программного обеспечения, необходимого для обслуживания имеющихся в системе устройств. Блок пользовательского режима (%Windir%\System32\umpnpmgr.dll, запускается в контексте главного системного процесса svchost.exe
) отвечает за взаимодействие с пользователем в ситуациях, требующих установки новых драйверов или настройки рабочих параметров в уже инсталлированных. Отвечает за назначение и последующее распределение аппаратных ресурсов, таких как прерывания (IRQ), порты ввода-вывода, каналы прямого доступа к памяти (DMA) и адреса памяти. Имеет функционал определения драйвера, требуемого для поддержки определенного устройства и функционал загрузки/инсталляции данного драйвера. Умеет распознавать новые устройства, реагировать на их подключение и отключение. Является частью кода исполнительной подсистемы Windows.
Перечисление устройств
Целиком стадию загрузки с самого ее начала описывать смысла нет, и мы начнем с только с интересующего нас этапа, на котором модуль Winload(.efi)
загружает ядро операционной системы Windows 7 из файла ntoskrnl.exe. Ядро запускает PnP менеджер, являющийся частью исполнительной подсистемы. PnP менеджер стартует процесс перечисления устройств с корневого устройства, драйвера виртуальной шины под названием ROOT
(Корень), который олицетворяет собой всю систему и представляет из себя драйвер шины вообще для всех PnP- и не-PnP-устройств, а так же HAL
(уровня аппаратных абстракций). HAL
на этом этапе функционирует как драйвер шины, который перечисляет устройства, напрямую подключенные к материнской плате. Однако, HAL
вместо фактического перечисления полагается на описание оборудования, уже присутствующее в реестре. Цель HAL
на данном этапе — обнаружить первичные шины, такие как PCI
. Драйвер первичной шины PCI, в свою очередь, перечисляет устройства, подключенные к данной шине, находит другие шины, для которых PnP менеджер тут же загружает драйвера. Эти драйвера шин, в свою очередь, обнаруживают уже устройства на своих шинах. Данный рекурсивный процесс перечисления, загрузки драйверов и последующего перечисления, продолжается пока все устройства в системе не будут обнаружены и сконфигурированы. В процессе перечисления PnP менеджер строит дерево устройств (device tree), которое однозначно описывает отношения между всеми устройствами системы. Узлы этого дерева, именуемые devnodes
(сокр. от «узлы устройств»), содержат информацию об объекте устройства, который, в свою очередь, подробно описывает устройство.
Записи всех устройств, которые были обнаружены с момента инсталляции системы, хранятся в кусте реестра HKLM\SYSTEM\CurrentControlSet\Enum. Подключи этого куста описывают устройства в следующем формате:
HKLM\SYSTEM\CurrentControlSet\Enum\ Enumerator\ DeviceID\ InstanceID |
где:
Enumerator
— наименование драйвера шины. Может принимать значения: ACPI, DISPLAY, HDAUDIO, HID, HDTREE, IDE, PCI, PCIIDE, Root, STORAGE, SW, UMB, USB, USBSTOR и другие;DeviceID
— уникальный идентификатор для данного типа устройств;InstanceID
— уникальный идентификатор различных экземпляров одного и того же устройства.
Дело в том, что драйвер шины, к которой подключено устройство, запрашивает у устройства различные параметры (идентификатор производителя, устройства, ревизии и прч) и формирует так называемый аппаратный идентификатор (HardwareID
), который однозначно описывает устройство и представляет из себя строку параметров, разделенных знаками & и состоящую из следующих частей:
- Префикс, описывающий шину, к которой подключено устройство.
- Идентификатор устройства. Состоит из нескольких частей, таких как идентификатор производителя, идентификатор продукта (модели), ревизия устройства.
HardwareID — идентификационная строка, зависящая от параметров устройства (производитель, модель, ревизия, версия и прч), которую Windows использует для сопоставления устройства с .inf-файлом драйвера.
Типичная структура HardwareID
:
PCI\VEN_10DE&DEV_1341&SUBSYS_2281103C&REV_A2
Помимо HardwareID
, устройству назначается параметр(ы) CompatibleID
, который имеет схожий формат, однако содержит лишь более общие значения, не содержащие специфичных для какого-либо устройства параметров (некоторые идентификаторы устройства) и необходимый для инициализации более широкого круга совместимых устройств.
Идентификаторы HardwareID и CompatibleID используются кодом исполнительной подсистемы Windows для поиска драйвера устройства.
Обнаружение драйверов
Если на этапе перечисления устройств и загрузки драйверов, функциональный драйвер шины, на которую подключено новое устройство, информирует PnP менеджер об изменениях в подключенных дочерних устройствах. PnP менеджер режима ядра проверяет, сопоставлен ли с устройством драйвер, для этого он запрашивает драйвер шины, на которую подключено новое устройство, и получает идентификаторы HardwareID
и, опционально, CompatibleID
устройства. PnP менеджер режима ядра специальным событием информирует PnP менеджер пользовательского режима о том, что данное устройство требует инсталляции, передавая ему полученные идентификаторы. PnP менеджер пользовательского режима сначала пробует автоматически установить устройство без вмешательства пользователя. Для этого PnP менеджер пользовательского режима запускает утилиту rundll32.exe
для запуска мастера установки драйверов устройств (%Windir%\System32\Newdev.dll).
Мастер установки драйверов устройств инициирует поиск подходящего для устройства драйвера по информации из всех inf-файлов системы, расположенных в следующих доверенных системных расположениях:
- Хранилище драйверов;
- Центр обновления Windows;
- Системный каталог INF-файлов;
Для вышеописанных целей поиска и установки драйвера используются функции библиотек setupapi.dll (функции поддержки инсталляции) и cfgmgr32.dll (менеджер конфигурации). В процессе поиска используются полученные уже на данный момент идентификаторы HardwareID
и (опционально) CompatibleID
, значения которых описывают все возможные варианты идентификации оборудования в файле инсталляции драйвера, то есть inf-файле. Значения идентификаторов устанавливаемого устройства сравниваются с теми, что описаны в секциях Models
зарегистрированных в системе inf-файлов. Списки идентификаторов упорядочены, поэтому более специфичные описатели оборудования представлены в списках первыми. Если совпадения идентификаторов были найдены в нескольких inf-файлах, более точное совпадение считается предпочтительным по отношению к менее точному совпадению, подписанные inf-файлы предпочитаются неподписанным, и подписанные позднее inf-файлы предпочитаются подписанным ранее. Если совпадение на основе HardwareID
не найдено, то используются CompatibleID
, в случае наличия, конечно же. Если совпадение не найдено на основе CompatibleID
, мастер установки оборудования может вывести приглашение на указание местоположения свежего драйвера оборудования. Давайте более подробно рассмотрим все указанные источники информации о драйверах.
Хранилище драйверов
Мастер установки драйверов пытается обнаружить подходящий inf-файл в системном хранилище драйверов, располагающемся в каталоге %Windir%\System32\DriverStore, который содержит все без исключения драйвера системы, входящие в состав дистрибутива Windows, полученные через службу «Windows Update», либо инсталлированные в систему пользователем.
Хранилище драйверов — защищенное системное расположение, каталог, предназначающийся для хранения всех пакетов драйверов, которые когда-либо инсталлировались в системе.
Хранилище драйверов было впервые введено в Windows Vista. Перед установкой любого драйвера в систему, сначала специализированный код проверяет цифровую подпись драйвера, затем синтаксис inf-файлов драйвера, затем привилегии текущего пользователя, только после этого помещает все компоненты драйвера в системное хранилище драйверов. А вот затем уже драйвер, находящийся в хранилище драйверов, может быть использован для установки устройств в системе. Поскольку процедура помещения драйвера в хранилище достаточно проработана, хранилище драйверов и является самым доверенным источником информации о драйверах.
Системный каталог INF-файлов
Параллельно система ищет драйвер в системном расположении, описываемом значением параметра DevicePath
, находящемся в ветке реестра HKLM\Software\Microsoft\Windows\CurrentVersion. Обычно параметр имеет значение %SystemRoot%\inf, что в большинстве систем эквивалентно местоположению C:\Windows\inf.
INF-файл
Хотелось бы сделать небольшое отступление и отдельно поговорить об информационных файлах пакета драйвера. inf-файл является одним из ключевых компонентов комплекта драйверов. В нем хранится последовательность операций по установке и удалению драйвера, описанная специальными директивами, указывающими на расположение файлов функционального драйвера. Файл содержит команды, которые добавляют в реестр информацию, отвечающую за перечисление (Enum) драйвера и его класса (Class), и могут содержать указания для мастера установки оборудования по запуску так называемых основных установщиков (Class Installer, Установщик класса) и дополнительных установщиков (CoInstaller, Cоинсталлятор) для класса устройств и непосредственно устройства. Дополнительно inf-файл определяет тип, производителя, модель устройства, класс драйвера, необходимые файлы и ресурсы.
Соинсталлятор (по структуре обычная DLL) — дополнительный инсталлятор, вызываемый на этапе инсталляции, который выполняет специфичные для подкласса или устройства шаги установки, такие как подготовка инфраструктуры для работы драйвера в системе (например, установка пакета NET.Framework), вывод конфигурационных диалоговых окон, которые позволяют пользователю указать настройки для конкретного устройства.
Немаловажная особенность соинсталляторов заключается в том, что они, в случае необходимости выполняют привязку экземпляров нового устройства к требуемым для работы протоколам. Это, к примеру, может касаться разного рода коммуникационных устройств, которым требуются для работы различные протоколы и транспорты, такие как ndis
, pppoe
, tcpip
, tcpip6
, smb
, netbt
.
В .inf-файле дополнительно описываются операции распаковки, копирования, запуска, переименования файлов, добавления и удаления ключей в реестре и многое другое.
Однако вернемся к главному алгоритму установки драйвера в Windows. В случае, когда установщик драйверов устройств не нашел подходящих драйверов в перечисленных выше локациях, система маркирует устройство как неопознанное.
При этом пользователю предлагается самостоятельно продолжить установку устройства через апплет Диспетчер устройств. После того как пользователь самостоятельно выбирает устройство и указывает местоположение файлов драйвера, алгоритм установки драйвера продолжает свою работу и следующим этапом у него стартует проверка цифровой подписи драйвера.
Проверка цифровой подписи драйвера
Дело в том, что драйвер как часть кода режима ядра, является достаточно критичным компонентом операционной системы, и любые ошибки, допущенные разработчиком в коде драйвера, легко могут привести к серьезным сбоям (BSOD) в системе. С некоторого времени Microsoft достаточно трепетно относится к качеству кода драйверов, и в связи с этим в операционные системы Windows были введены такие механизмы как цифровая подпись драйвера и системная политика подписи драйверов.
Цифровая подпись драйвера — строка данных переменной длины, которая в определенной мере является гарантом того, что код драйвера был создан надежным источником и не подвергался несанкционированным модификациям.
Следующим шагом часть кода PnP менеджера, работающая в пользовательском режиме, проверяет системную политику подписания драйверов. Если системная политика предписывает коду ядра блокировать или предупреждать об инсталляции неподписанных драйверов, то PnP менеджер парсит inf-файл драйвера на предмет наличия директивы CatalogFile
, указывающей на файл каталога (файл с расширением .cat), содержащий цифровую подпись пакета драйвера.
Файл каталога (.cat) — специальный файл, который играет роль цифровой подписи для всего пакета драйвера, потому как отдельно каждый файл, входящий в комплект пакета драйвера, не подписывается. Исключение составляют лишь двоичные файлы драйверов ядра этапа загрузки, но их проверяет отдельный код ядра.
Для тестирования драйверов и их подписания была сформирована лаборатория Microsoft Windows Hardware Quality Lab (WHQL
), обстоятельно тестирующая драйвера, поставляемые с дистрибутивами Windows, а так же драйвера от крупных поставщиков оборудования. Для всех остальных разработчиков драйверов предусмотрены процедуры получения возможности самостоятельно подписывать драйвера на платной основе. Когда драйвер проходит все тесты WHQL
, он становится «подписанным». Это означает, что для драйвера WHQL формирует хэш, или уникальную сигнатуру, однозначно идентифицирующую файлы драйвера, и затем подписывает ее с применением криптографических алгоритмов при помощи специального закрытого ключа Microsoft, используемого для подписания драйверов. Подписанный хэш помещается в каталоговый файл (.cat-файл), который размещается непосредственно в директории пакета драйвера.
В процессе инсталляции драйвера, PnP менеджер пользовательского режима извлекает сигнатуру драйвера из .cat-файла, расшифровывает сигнатуру используя публичный ключ Microsoft и сравнивает результирующий хэш с хэшем файла инсталлируемого драйвера. Если хэши совпадают, драйвер маркируется как прошедший WHQL тестирование. Если сигнатуру не удается проверить, PnP менеджер действует в соответствии с настройками системной политики подписи драйверов, либо запрещая инсталляцию драйвера, либо все же позволяя инсталлировать драйвер.
Создание резервной копии
Довольно неплохая стратегия Windows создавать точку восстановления перед добавлением в систему драйверов нового устройства. Связано это, в первую очередь, с тем, что драйвер режима ядра, содержащий ошибку, может являться причиной полной неработоспособности системы, и как потом с этой системой быть? Даже не смотря на все подписи и проверки, пользователь должен иметь возможность отката конфигурации в случае, например, когда ему что-то после установки не понравилось.
Инсталляция драйвера
На этом этапе пакет драйвера стороннего разработчика развертывается в системное хранилище драйверов. Затем, система выполняет фактическую инсталляцию драйвера из хранилища драйверов, которая производится посредством утилиты %Windir%\System32\drvinst.exe. На этом этапе происходят следующие события:
- inf-файл драйвера копируется в специализированную папку %Windir%/inf. Для драйверов сторонних разработчиков характерно переименование файла в
OEMx.inf
, гдеx
— порядковый номер inf-файла в директории. - Код операционной системы фиксирует факт инсталляции inf-файла в реестре.
- Создается узел устройства (devnode) в реестре по пути HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\<Enumerator>\<device id>\<instance id>, который содержит подробную информацию об устройстве.
- Двоичные файлы драйвера копируются в целевую папку %Windir%\System32\DRIVERS и, возможно, другие целевые папки. Обновляются разделы реестра.
- Формируется ключ реестра, соответствующий драйверу: HKLM\SYSTEM\CurrentControlSet\Services\имя_драйвера. Формируются параметры ключа.
- Формируется ключ реестра, отвечающий за логгирование событий драйвера, размещающийся в ветке HKLM\SYSTEM\CurrentControlSet\Services\EventLog\System\имя_драйвера.
- PnP менеджер вызывает процедуру
DriverEntry
для каждого установленного только что драйвера. Затем PnP менеджер режима ядра пытается «запустить» драйвер, подгружая его в память и вызывая процедуруAddDevice
драйвера для информирования самого драйвера о присутствии устройства, для которого он был загружен.
Расположение информации о драйверах
Помимо описания самого алгоритма установки драйвера в Windows, хотелось бы выделить отдельный раздел и посвятить его описанию возможных мест размещения информации о драйверах в файловой системе и реестре. С практической точки зрения информация эта призвана упростить ручное редактирование в случае возникновения каких-либо фатальных сбоев. Ниже перечислены местоположения, в которых можно заметить следы присутствия информации о драйверах.
Общие журналы драйверов
В системе присутствует некоторое количество журналов, которые могут помочь с различными проблемами относительно драйверов.
- %Windir%\setupact.log — содержит сообщения отладки от инсталлятора драйверов режима ядра, который представляет собой Win32 DLL, сопровождающую процесс установки устройства;
- %Windir%\inf\setupapi.app.log — содержит сообщения процесса инсталляции приложений;
- %Windir%\inf\setupapi.dev.log — содержит сообщения процесса инсталляции устройств;
Журнал драйвера
Если Вы используете Диспетчер пакетов (Package Manager, pkgmgr) для инсталляции/деинсталляции пакета, который (в свою очередь) инсталлирует, обновляет, либо деинсталлирует драйвер, то у Вас есть возможность включить (с целью отладки) создание специального лог-файла drivers.log, который будет содержать только ошибки, специфичные для конкретного драйвера. Для создания этого журнала, создайте/задайте следующий ключ реестра, и затем запустите pkgmgr
снова. После этого, в директории, откуда был запущен pkgmgr
, будет создан файл drivers.log.
Ветка: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Device Installer
Ключ: DebugPkgMgr
Тип: DWord
Значение: 1
%Windir%\inf
В этом каталоге хранятся всё inf-файлы. Как было уже сказано выше, после установки стороннего драйвера в систему, его inf-файл переименовывается в OEMx.inf, поэтому в директории можно увидеть целую серию подобных файлов. Код операционной системы запоминает факт инсталляции inf-файла в реестре.
%Windir%\System32\DRIVERS
Это директория в файловой системе Windows, где размещаются непосредственно файлы драйверов. В современных операционных системах, а я говорю сейчас о Windows Vista и более поздних, драйвера в данной директории имеют расширения .sys в подавляющем своем большинстве, реже встречаются dll-файлы, однако общего смысла это не меняет, поскольку, вне зависимости от расширения, все они идентичны по структуре .dll-файлам. В более ранних операционных системах встречались такие форматы как .drv
и .vxd
.
%Windir%\System32\DriverStore
Системная коллекция драйверов, которая предназначается для размещения всех без исключения драйверов, которые проходили через Вашу систему. Используется начиная с Windows Vista. Перед установкой любого драйвера в операционную систему, сначала специализированный код проверяет подпись драйвера, затем синтаксис файлов inf-файла драйвера, затем привилегии текущего пользователя, только после этого добавляет все компоненты драйвера в системную коллекцию. И только после этого драйвер может быть использован в системе для инсталляции устройств без какого-либо вмешательства пользователя.
HKLM\SYSTEM\CurrentControlSet\Enum
Куст реестра, содержащий информацию об устройствах, имеющихся в системе. PnP менеджер создает здесь ключ для каждого устройства в формате HKLM\SYSTEM\CurrentControlSet\Enum\Enumerator\deviceID. где Enumerator — это описанный выше в статье идентификатор шины, полученный на этапе перечисления устройств, deviceid — идентификатор типа устройств. Ключ содержит следующую информацию: описание устройства, аппаратные идентификаторы (Hardware ID), идентификаторы совместимых устройств (Compatible ID) и требования к ресурсам. Куст зарезервирован для использования исключительно кодом операционной системой, поэтому пользовательским приложениям и драйверам не рекомендуется напрямую взаимодействовать с ним, предлагается использовать документированные системные функции.
HKLM\SYSTEM\CurrentControlSet\Control
Куст реестра, содержащий информацию о разных параметрах конфигурации драйверов на этапе запуска операционной системы. Содержит такие важные ключи как:
Class
содержит информацию о классах инсталляции устройств, которые используются для группировки устройств, конфигурируемых и устанавливаемых схожим образом. Для каждого класса инсталляции в составе этого ключа имеется ключ, имя которого совпадает с именем GUID соответствующего класса инсталляции.CoDeviceInstallers
содержит информацию о соинсталляторах классаDeviceClasses
содержит информацию об интерфейсах устройств, зарегистрированных в системе. любой драйвер, который хочет взаимодействовать в системе с программами режима пользователя, должен предоставить интерфейс. Класс интерфейса устройства предоставляет функциональные возможности устройства и его драйвера другим системным компонентам и приложениям режима пользователя.
HKLM\SYSTEM\CurrentControlSet\Services
Куст реестра, который используется для размещения информации обо всех сервисах (драйверах) в системе. Каждый системный драйвер размещает достаточно важную глобальную информацию о себе в подключах вида HKLM\SYSTEM\CurrentControlSet\Services\<Имя_драйвера>, которая используется драйвером в процессе инициализации на этапе загрузки системы. Куст активно используется PnP менеджером для передачи параметров при вызове процедуры инициализации драйвера.
В этом кусте размещаются такие элементы:
ImagePath
— содержит полный путь в двоичному файлу (образу) драйвера. программа инсталляции заполняет это значение на основе данных из inf-файла пакета драйвера;Parameters
— хранит индивидуальную информацию драйвера, заполняется на основе данных, размешенных в inf-файле пакета драйвера;Performance
— информация для мониторинга производительности устройства, контролируемого драйвером. Указывает имя DLL мониторинга производительности и имена функций, экспортируемых данной DLL. Заполняется на основании данных, полученных из inf-файла;
HKLM\SYSTEM\CurrentControlSet\HardwareProfiles
Куст реестра, который содержит информацию об аппаратных профилях системы и предназначен для поддержки данной технологии. Аппаратный профиль это всего-лишь набор изменений в стандартной аппаратной конфигурации и конфигурации сервисов (original configuration), загружаемых при старте системы. Содержит специфические изменения исходного, основного профиля оборудования, сконфигурированного в двух разделах реестра: HKLM\SOFTWARE и HKLM\SYSTEM.
Windows 10, 8.1 и Windows 7 позволяют отключить обязательную проверку цифровой подписи драйверов и установить неподписанный драйвер, однако если в последних версиях ОС это нужно сделать на постоянной основе, изменение опций с помощью bcdedit не помогает. Однако, может помочь самостоятельная подпись драйвера и его последующая установка, о чем и поговорим.
В этой инструкции подробно о том, как самостоятельно подписать драйвер для Windows 10, 8.1 или Windows 7 x64 или 32-бит (x86) для последующей установки в системе на постоянной основе без отключения проверки цифровой подписи драйверов, избежав при этом ошибок наподобие «INF стороннего производителя не содержит информации о подписи».
Что потребуется для подписи драйвера
Для того, чтобы выполнить все описанные далее шаги, скачайте и установите следующие инструменты с сайта Майкрософт:
- Microsoft Windows SDK for Windows 7 https://www.microsoft.com/en-us/download/details.aspx?id=8279
- Windows Driver Kit 7.1.0 https://www.microsoft.com/en-us/download/details.aspx?id=11800
Из первого набора достаточно будет установить Tools, из второго (представляет собой ISO-образ с установщиком, с которого нужно запустить KitSetup.exe) — выбрать Build Environments и Tools.
Обратите внимание: это не последние версии наборов инструментов, но они в равной степени подойдут для самостоятельной подписи драйверов для последующей установки во всех ОС от Windows 10 до Windows 7, при этом в инструкции не потребуется вдаваться в некоторые дополнительные нюансы.
Процесс самостоятельной подписи драйвера
В процессе для того, чтобы подписать драйвер самостоятельно, нам потребуется: создать сертификат, подписать драйвер этим сертификатом, установить сертификат в системе и установить драйвер. Начнем.
- Создайте в корне диска C какую-либо папку (так к ней проще будет обращаться в дальнейшем), например, C:\cert, где мы будем работать с сертификатами и драйверами.
- Запустите командную строку от имени администратора (нужны для 18-го шага). Далее используем следующие команды по порядку. Файлы драйвера пока не потребуются. Во время выполнения второй команды вас попросят ввести пароль, я использую password в окне запроса и далее в командах, вы можете использовать свой.
-
cd "C:\Program Files\Microsoft SDKs\Windows\v7.1\bin"
-
makecert -r -sv C:\cert\driver.pvk -n CN="remontka" C:\cert\driver.cer
-
cert2spc C:\cert\driver.cer C:\cert\driver.spc
-
pvk2pfx -pvk C:\cert\driver.pvk -pi password -spc C:\cert\driver.spc -pfx C:\cert\driver.pfx -po password
- До этого этапа всё должно пройти как на скриншоте ниже, командную строку не закрываем.
- В папке C:\cert создайте вложенную папку, например, drv и поместите туда свои файлы драйвера. Но: если вам требуется драйвер только для x64, не копируйте .inf файл для x86 систем в эту папку и наоборот.
В командной строке используем следующие команды:
-
cd C:\WinDDK\7600.16385.1\bin\selfsign\
-
inf2cat.exe /driver:"C:\cert\drv" /os:7_X64 /verbose
- В предыдущей команде для драйвера 32-бит укажите X86 вместо X64. Если будет предложено скачать .NET Framework, согласитесь, установите, а затем заново выполните команду. В идеале вы должны будете получить сообщение об успешном создании .cat файла для подписи. Однако, возможны ошибки, о наиболее частых — следующие два пункта. После исправления ошибок повторите команду из пункта 10.
- DriverVer set to incorrect date — возникает при дате в файле драйвера до 21 апреля 2009 года. Решение: откройте файл .inf из папки drv в текстовом редакторе (можно в блокноте) и в строке DriverVer установите другую дату (формат: месяц/день/год).
- Missing AMD64 CatalogFile entry (для 64-бит) или Missing 32-bit CatalogFile entry. Решение: откройте файл .inf из папки drv в текстовом редакторе и в разделе [Version] добавьте строку CatalogFile=catalog.cat
- В итоге вы должны получить сообщение: Catalog generation complete с указанием пути к файлу каталога, в моем случае – C:\cert\drv\catalog.cat. Далее используем следующие команды (требуется подключение к Интернету).
-
cd "C:\Program Files\Microsoft SDKs\Windows\v7.1\bin"
-
signtool sign /f C:\cert\driver.pfx /p password /t http://timestamp.verisign.com/scripts/timestamp.dll /v C:\cert\drv\catalog.cat
- Результат подписи файла драйвера без ошибок на скриншоте ниже. Следующий шаг — добавить самоподписанный сертификат в список доверенных в системе, сделать это можно следующими двумя командами по порядку
-
certmgr.exe -add C:\cert\driver.cer -s -r localMachine ROOT certmgr.exe -add C:\cert\driver.cer -s -r localMachine TRUSTEDPUBLISHER
- В результате вы должны получить сообщение «CertMgr Succeeded». Если Failed или certmgr.exe не является внутренней или внешней командой — убедитесь, что командная строка запущена от имени администратора, а вы находитесь в нужной папке (см. 15 шаг).
И вот теперь можно закрыть командную строку и установить драйвер из папки C:\cert\drv с помощью диспетчера устройств, или нажав правой кнопкой по .inf файлу и выбрав пункт «Установить». Потребуется подтвердить установку драйвера в окне «Не удалось проверить издателя этих драйверов» — нажать «Все равно установить этот драйвер».
Обратите внимание, что возможные ошибки в диспетчере устройств, отображаемые для устройства с самостоятельно подписанным драйвером обычно не имеют отношения непосредственно к процессу подписи (та же ошибка для них будет появляться и без подписи, при простом отключении проверки цифровой подписи драйверов в особых вариантах загрузки). Т.е. искать причину в этом случае нужно в чем-то ещё и читать подробную инструкцию по использованию драйвера (например, в случае драйверов для FlashTool).