Создание драйверов

Развертывание драйвера – Windows IoT

Создание драйверов

  • 08/22/2017
  • Чтение занимает 6 мин
    • p
    • o

Развертывание драйвера в Windows 10 IoT базовая с помощью Visual Studio.Deploy a driver on Windows 10 IoT Core with Visual Studio.

Настройте проект драйвера Visual Studio, чтобы можно было компилировать и развертывать драйвер для определенной платформы на этапе разработки драйвера.Configure your Visual Studio driver project so that you can compile and deploy a driver for a specific platform during driver development phase.

В этом упражнении вы можете использовать образец драйвера гпиокмдфдемо.For this exercise you can use the gpiokmdfdemo sample driver.

Если вы хотите добавить драйвер к образу, ознакомьтесь с инструкциями в нашем производственном руководством IOT.If you're looking to add a driver to an image, please visit the instructions in our IoT Manufacturing Guide.

На устройствеOn the device

  • Убедитесь, что на устройстве установлен образ Иоткоре, следуя инструкциям в разделе Приступая к работе.Make sure that your device has an IoTCore image installed by following the Get Started instructions.
  • Подключитесь к устройству с помощью PowerShell.Connect to your device via PowerShell.

На компьютереOn the PC

  • Убедитесь, что установлен Visual Studio 2017.Make sure you have installed Visual Studio 2017.
  • Установите набор драйверов для Windows.Install the Windows Driver Kit. Вам потребуется установить пакет SDK и WDK.You will need to install the SDK and WDK.
  • Установите сертификаты, чтобы правильно подписать драйвер и запустить его на устройстве.Install the certificates so that the driver is signed correctly and can run on your device. В командной строке с повышенными привилегиями выполните команды, перечисленные ниже.From an elevated command prompt execute the commands listed below:
    1. cd c:\Program Files (x86)\Windows Kits\10\Tools\bin\i386
    2. set WPDKContentRoot=c:\Program Files (x86)\Windows Kits\10
    3. InstallOEMCerts.cmd
  • Примените исправление, чтобы включить развертывание F5 из VS.Apply fix to enable F5 deployment from VS. В командной строке с повышенными привилегиями выполните следующие команды:In the elevated command prompt, execute the following commands:
    1. cd %TEMP% (изменит каталог на c:\users\\Appdata\Local\Temp )cd %TEMP% ( will change directory to c:\users\\Appdata\Local\Temp)
    2. md “WdkTempFiles” Создание каталога “Вдктемпфилес” вручную. это обходной путь для ошибки в средствах и должен выполняться на компьютере только один раз .md “WdkTempFiles” Manually create a “WdkTempFiles” directory This is a workaround for a bug in the tooling and requires to be done only once in the PC.

Шаг 2. Инициализация устройства с помощью Visual StudioStep 2: Provision device with Visual Studio

  • Откройте Visual Studio и выберите драйвер > тест > настроить устройства > добавить новое устройствоOpen Visual Studio and select Driver > Test > Configure Devices > Add New Device
    • Если пункт меню драйвер не отображается, проверьте, установлен ли пакет SDK.If the Driver Menu option is not shown, check if SDK is installed.
  • В диалоговом окне Конфигурация устройстваIn the Device Configuration dialog,

    • Введите удобное для пользователя отображаемое имя для целевого устройстваEnter a user-friendly Display Name for your target device
    • Выберите тип устройства = мобильный.Select Device Type = Mobile
    • В отображаемом списке отсортируйте по IP-адресу и найдите адрес для устройства IoT и выберите.In the list displayed, sort by IP address, and find the address for the IoT device and select. Если есть две записи, выберите одну из них с ненулевым идентификатором GUID.If there are two entries, select the one with the non-zero GUID. Убедитесь, что строка выбрана — она должна выделять синим цветом.Make sure the row is selected – it should highlight blue
    • В нижней части диалогового окна находятся два переключателя.At the bottom of the dialog are two radio buttons. Выберите тот, который говорит Device подготавливать устройство, и выберите параметры отладчика.Select the one that says Provision device and choose debugger settings. Щелкните Далее.Select Next
  • На странице Настройка параметров отладчиказадайте соответствующие параметры.On the Configure debugger settings, set the appropriate settings. Следует отметить следующее.Note the following:

    • Минновбоардмакс может использовать сеть для отладки.The MinnowBoardMax can use the network for debugging.
      • Использовать сеть типа подключенияUse connection type Network
      • Выберите порт — по умолчанию можно использоватьSelect some port – default can be used
      • Выберите ключ — по умолчанию можно использоватьSelect some key – default can be used
      • Выберите IP-адрес узла компьютера, на котором работает Visual Studio.Select the host IP of the machine running visual studio. Не используйте адрес аутонет (169.xxx).Do not use the autonet (169.xxx) address.
      • Щелкните Далее.Select Next
    • Raspberry Pi использует последовательное подключение для отладки ядра.The Raspberry Pi uses serial for kernel debugging.
      • Подключите соответствующий кабель последовательной отладки к устройству PI и ведущему компьютеру.Connect the appropriate serial debugging cable to the PI and the host machine
      • Выберите серийный номер для типа подключения.Select Serial for the connection type
      • Заполните остальные параметры, соответствующие Raspberry Pi.Fill out the rest of the parameters as appropriate for the Raspberry Pi.
      • Щелкните Далее.Select Next
  • WDK в Visual Studio теперь будет подготавливать устройство IoT.The WDK, through VS, will now provision the IoT device. ТАЕФ и ВДТФ будут установлены на устройстве, и устройство будет настроено для отладки ядра в соответствии с указанными выше параметрами.TAEF and WDTF will be installed on the device, and the device will be set up for kernel debugging per the settings provided above.

  • По завершении устройство может быть перезагружено.When complete, the device may reboot.

    На экране “ход выполнения” в конфигурации устройства будет отображаться состояние и указано полное, когда устройство Интернета вещей завершило установку.

    The progress screen on the Device Configuration will provide status, and shows complete when the IoT device has completed the installation. Нажмите кнопку Готово.Press Finish.

  • Теперь устройство подготовлено, и в нем отображается состояние конфигурации тестирования устройства , настроенное для тестирования драйверов .The device is now provisioned and the Device test configuration status shows Configured for driver testing

Шаг 3. Настройка проекта драйвера Visual StudioStep 3: Configure Visual Studio driver project

  1. Запустите Visual Studio в режиме администратора и откройте проект драйвера Visual Studio.Launch Visual Studio in the administrator mode and open the visual studio driver project.
  2. Убедитесь, что версия целевой платформы соответствует пакету SDK, установленному на компьютере разработки.

    Make sure the Target Platform Version matches the SDK installed on your development machine. В окне обозреватель решений выберите Свойства проекта.Select Project Properties from the Solution Explorer window.

    В разделе Общие свойства конфигурации убедитесь, что версия целевой платформы соответствует пакету SDK, установленному на компьютере разработчика.Under General Configuration Properties assure that the Target Platform Version matches the SDK installed on your development computer.

    Версию пакета SDK можно проверить с помощью панели управления > программы > программы и компоненты.You can check the version of the SDK from the Control Panel > Programs > Programs and Features.

  3. В разделе проект > добавить новый элемент > Visual C++ > драйвер Windowsвыберите манифест пакета и нажмите кнопку добавить.

    Under Project > Add New Item > Visual C++ > Windows Driver, select Package Manifest and Press Add.

Package.pkg.xml файл будет добавлен в проект.Package.pkg.xml file will be added to the project. В этом файле укажите Теги “владелец”, “платформа”, “компонент” и “подкомпоненты”.In this file, specify the Owner, Platform, Component and SubComponent tags.

  1. Задайте номер версии пакета в свойствах проекта > паккажежен > версии.Set package version number at Project Properties > PackageGen > Version. Обратите внимание, что каждый раз, когда необходимо выполнить установку или переустановку драйвера, этот номер версии должен быть увеличен.Note that every time you need to perform a Install/Reinstall of the driver, this version number has to be incremented.
  1. В разделе Свойства проекта > подписывание драйвера > тестовый сертификат, выберите тестовый сертификат (сертификат изготовителя телефона для проверки).Under Project Properties > Driver Signing > Test Certificate, select test certificate (Phone OEM Test Certificate)
  1. Перейдите к разделу Установка драйвера и выберите развертывание .Go to Driver Install and select Deployment
  • В раскрывающемся списке Target Device Name (имя целевого устройства ) выберите целевой объект, созданный выше в процессе подготовки.From the Target Device Name dropdown, select the target created above in the provisioning process. Обратите внимание на два варианта установки, переустановки и быстрой переустановки.Notice the two options for Install / Reinstall and Fast Reinstall. Выберите параметр и нажмите кнопку ОК.Choose an option and Click Ok.
  • Для первоначальной установки драйвера на целевой сервер используется Установка и повторная установка.Install / Reinstall is used for the initial installation of a driver to the target. Он устанавливает пакет драйверов с помощью стека обновлений Windows и может занять несколько минут.This installs the driver package using the Windows update stack and can take several minutes. Этот параметр должен использоваться при каждом изменении INF-файла.This must be used every time the INF file is changed.

Совет

Каждый раз, когда этот параметр используется для установки драйвера после первоначальной установки, номер версии пакета должен быть увеличен.Every time this option is used to install a driver after the initial installation, the package version number must be incremented.

  • Быстрая переустановка может быть использована после установки драйвера, и в INF-файле Drivers отсутствуют последующие изменения, влияющие на реестр.Fast Reinstall can be used once a driver has been installed, and there are no subsequent changes to the drivers INF file, which affect the registry. Этот метод обходит процесс установки, завершает работу всех девнодес, связанных с драйвером, копирует драйвер и перезапускает девноде.This method bypasses the install process, shuts down all devnodes associated with the driver, copies the driver over, and restarts the devnode. Это займет несколько (

Источник: https://docs.microsoft.com/ru-ru/windows/iot-core/learn-about-hardware/driverdeployment

Создание пакета драйверов

Создание драйверов

Данная статья описывает самостоятельное создание пакетов драйверов, для автоматической установки вместе с операционной системой. Руководство рассчитано на применение совместно с официальным интегратором пакетов от Bashrat the Sneaky DriverPacks BASE (доступен для загрузки по этой ссылке) или с аддоном «Интеграция драйверов» от Boa Soft (последняя версия доступна по этой ссылке).

Первая редакция статьи представляла собой точный перевод руководства, которое написал Bashrat the Sneaky. Сообщение на форуме, послужившее основой вышеупомянутого руководства и его обсуждение доступны по адресу: http://forum.driverpacks.net/viewtopic.

php?pid=5 (EN). Вашему вниманию предлагается вторая редакция статьи. В ней Артем Васьков, изначально выполнивший перевод руководства, делится уже собственным опытом создания пакетов драйверов. Тем не менее, руководство является частью данной статьи.

Введение

Использование пакетов драйверов является наиболее удобным и универсальным способом автоматической установки драйверов, вместе с операционной системой. Однако, «официальные» пакеты Bashrat the Sneaky и его команды не могут охватить всего многообразия компьютерного оборудования. Основными причинами самостоятельного создания пакета драйверов может служить следующее:

  • Для Вашей специфической железки еще никто не сделал пакета драйверов (хотя в этом случае я бы все-таки рекомендовал внимательно ознакомиться с этой темой).
  • У Вас в наличии более свежая версия драйвера, чем в существующих пакетах (о сложностях использования неподписанных драйверов читайте ниже.)

Тогда данное руководство для Вас!

Как Вы сможете убедиться далее, собственно подготовка пакета драйверов не представляет из себя ничего сложного. Основные сложности сосредоточены в интеграции драйверов в дистрибутив операционной системы. Однако, почти всю рутинную работу по интеграции проделает за Вас интегратор DriverPacks BASE или аддон «Интеграция драйверов».

Примечание. Данный способ действителен только для драйверов, которые не требуют чего-то специфичного. Другими словами, все, что требуется для установки таких драйверов – это скопировать их на системный раздел и добавить необходимые значения в файл winnt.sif или реестр.

1. Загрузка драйверов

Для начала Вам нужно обзавестись необходимыми драйверами. Начните с сайта производителя Вашего оборудования. Если искомый драйвер там не обнаружен, попытайтесь отыскать его при помощи поисковой системы (например, Google).

2. Распаковка драйверов

Теперь мы должны извлечь драйверы из инсталлятора или архива. Лично я предпочитаю 7-zip, но Вы можете использовать любой (ну или почти любой) архиватор, способный это сделать.

Правой кнопкой мыши щелкните по архиву с драйверами или по файлу программы установки и выберите пункт меню Распаковать (Extract files…), или что-то подобное.

Выберите папку для распаковки и разархивируйте файлы.

Следующий раздел может испугать некоторых начинающих пользователей, однако в конце все будет подробно разъяснено.

Вместо того, чтобы использовать все файлы, которые мы распаковали, мы должны выбрать только необходимые файлы, или другими словами убрать мусор.

Как же это сделать? В 95% случаев работает следующий способ: откройте INF-файл Вашего драйвера, найдите секцию [SourceDisksFiles] и убедитесь в том, что Вы сохранили все файлы, перечисленные в ней!

Примечание. Для того чтобы сохранить сведения о цифровой подписи, не удаляйте сопутствующие CAT-файлы! CAT-файлы могут отсутствовать, если драйвер не имеет цифровой подписи.

Примечание. Редактирование inf-файла делает цифровую подпись недействительной. Поэтому если вы каким-либо образом изменили содержимое INF-файла из него можно удалить строку CatalogFile=имя_файла_цифровой_подписи.cat, а также одноименный CAT-файл из каталога с драйвером.

3. Создание пакета драйверов

Это очень просто! Создайте папку D и поместите ваши драйверы в любую подпапку внутри ее. Имя подпапки может быть любым, но я рекомендую использовать для этих подпапок максимально короткие имена.

В противном случае значение параметра OemPnPDriversPath в файле может оказаться слишком длинным (максимум 4096 знаков, а для установки при помощи winnt.exe/winnt32.exe только 1024 знака) и помешать успешной установке.

После создания необходимой структуры папок поместите ваши драйверы в соответствующие подпапки (распакованные файлы, INF-файлы, но не архивы или программы установки, помните?).

Например, создайте следующую структуру:

Пример с реальными названиями

Примечание. Ранее папка D\3\ для неофициальных (создаваемых самостоятельно) пакетов драйверов не являлось обязательным условием. При использовании интегратора от Bashrat версии 6.05 и выше данное требование является обязательным для обеспечения функциональности KTD с неофициальными пакетами драйверов. Для аддона «Интеграция драйверов» это условие необязательно.

При создании структуры папок пакета драйверов следует придерживаться следующих соглашений.
Название папкиСодержимое
Английское названиеПояснение
AAdditionsДополнения
BBroadbandШирокополосные сетевые устройства (*DSL-модемы и им подобные)
CChipsetНаборы системной логики (чипсеты)
CPUCentral Processor UnitЦентральный процессор (необходимо для AMD K8)
DDial-UpМодемы
GGraphicsадаптеры (графические карты)
LLANСетевые адаптеры
MMass StorageКонтроллеры жестких дисков
PPrintersПринтеры
SSoundЗвуковые адаптеры
VMWareVMWareДрайверы для виртуальной машины VMWare
WWLANБеспроводные адаптеры
UUSBUSB-устройства (флэшки, фотокамеры)
XMiscРазное (все, что не попало в остальные разделы)
YMonitorМониторы
ZHIDУстройства ввода (интеллектуальные мыши, клавиатуры, тачпады и т. п.)

Жирным выделены названия, использующиеся в официальных пакетах. Безусловно, Вы должны использовать английские названия папок.

Далее в перечисленных выше папках драйверы разделяются по производителям. Названия производителей также рекомендуется максимально сокращать. Например: NVidia – N, ATi – A и т. д.

Внутри папки с именем производителя разные драйверы, как правило, располагаются в папках 1-9.

Это почти все! Правой кнопкой мыши щелкните по папке с пакетом драйверов и выберите Добавить к архиву… (Add files to archive…). Выберите следующие параметры архивации:

  • Имя архива: DP_НазваниеПакетаДрайверов_wnt5_x86-32_ВерсияПакетаДрайверов.7z, причем имя архива не должно содержать пробелов! Например, название пакета драйверов версии 6.08 для контроллеров жестких дисков будет таким: DP_MassStorage_wnt5_x86-32_608.7z
  • Формат архива: 7z.
  • Уровень сжатия: Ultra (для максимально сжатия, при желании Вы можете указать меньший уровень сжатия).
  • Метод сжатия: LZMA (это значение по умолчанию, не изменяйте его).
  • Размер словаря: 32 MB Это значение, установленное по умолчанию, требует 369 MB памяти, т. е. объем вашего ОЗУ + файл подкачки должны быть не менее 369 MB. Вы можете увеличить или уменьшить значение этого параметра. Увеличение данного параметра позволят достичь большей компрессии, но требует больше времени для создания архива. Я использую значение 64 MB, для которого требуется 673 MB памяти!
  • Размер слова: 256.

Рисунок 1 – Создание архива

Можно также создать архив при помощи командной строки, а также включить данную команду в состав пакетного файла. Для этого необходима консольная версия архиватора 7-zip. Команда будет следующей:

7za a DP_Название_пакета_драйверов_wnt5_x86-32_RP.7Z D\* -m0=BCJ2 -m1=LZMA:d25:255 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3 -mx

4. Использование неподписанных драйверов

Возможно, вы захотите использовать в своем пакете драйверы без цифровой подписи (в каталоге с драйвером нет CAT-файлов).

Несмотря на то, что и в официальном интеграторе DriverPacks BASE и в аддоне «Интеграция драйверов» содержится утилита, блокирующая проверку цифровой подписи, проблема с неустановкой неподписанных драйверов решена лишь частично. При установке драйверов ОС Windows использует следующий приоритет (по убывающей):

  1. Новый подписанный драйвер из пакета драйверов.

  2. Старый подписанный из дистрибутива Windows.

  3. Новый неподписанный драйвер из пакета драйверов.

Таким образом, мы видим, что если в дистрибутиве содержится более старый подписанный драйвер для конкретного устройства, чем пакете в драйверов, то будет установлен драйвер из дистрибутива, а файлы из пакета драйверов будут проигнорированы.

Поэтому рекомендуется максимально возможно использовать подписанные драйверы (именно такой подход и использует Bashrat the Sneaky, избегая бета-версий и используя несертифицированные драйверы только в случае отсутствия прямых аналогов).

Обходным путем решения проблемы является удаление старых драйверов из дистрибутива системы. Упрощенно говоря, большая часть драйверов содержится в файлах DRIVER.CAB и SP2.CAB, а сжатые INF-файлы находятся в директории I386.

Поэтому необходимо распаковать данный файл удалить, ненужные драйверы и запаковать файл обратно, а также удалить соответствующие INF-файлы из папки I386 и ссылки на них.

Хотя теоретически можно выполнить это вручную, на практике это весьма трудоемко и может грозить многочисленными ошибками при установке.

Автоматизировать эту операцию поможет скрипт RusUpdatePack от участника конференции OSZone.net Petya V4sechkin. Данный скрипт поддерживает использование аддонов для удаления ненужных компонентов из дистрибутива ОС.

Уже созданы аддоны для удаления драйверов от видеокарт и сетевых адаптеров. По сути аддон «Удаление компонентов» представляет собой список удаляемых файлов.

Дальнейшую работу по перепаковке дистрибутива и удалению ссылок на удаленные файлы автоматически проделывает скрипт.

Следует помнить, что если, например, удалить все встроенные драйверы модемов, в дальнейшем при установке нового модема к нему не будет фирменных драйверов, система не сможет его опознать даже в качестве стандартного модема. Поэтому следует удалять драйверы только для тех устройств, которые присутствуют в пакете драйверов. Ну и разумеется, не забывать использовать пакет драйверов после удаления встроенных драйверов.

5. Автоматическая установка дополнений (панелей управления и т. д.) к драйверам

Дополнениями являются различные программы от производителей оборудования или сторонних разработчиков, предоставляющие пользователям возможность дополнительной настройки оборудования и таким образом являются пользовательским расширением драйверов. При установке дополнений мы сталкиваемся с двумя проблемами:

  1. Тихая установка.

  2. Зависимость установки конкретной программы от типа установленного оборудования.

Если с решением первой проблемы нам поможет разобраться раздел Приложения, то вторую проблему рассмотрим подробнее здесь.

В официальных пакетах, а также при интеграции, рассчитанной на использование интегратора DriverPacks BASE, для установки дополнений служит программа DPFinisher.exe. За документацией к ней рекомендую обратиться на «сайт производителя» www.driverpacks.net.

В аддоне BoaSoft установкой обновлений занимается командный файл Panels.cmd. Рассмотрим его работу на примере:

REM Проверяем наличие инсталлятора контрольной панелиIF EXIST %C%\ATI\CCP\Setup.exe (

REM Проверяем наличие установленного драйвера

IF EXIST %DRV%\ati2mtag.sys (

REM Если оба условия верны пишем сообщение в лог и переходим к установке

ECHO. >> %LOG%ECHO %DATE% %TIME% >> %LOG%ECHO Old Ati driver found >> %LOG%ECHO Install Ati control panel >> %LOG%

REM Запускаем установку панели управления с ключами тихой установки

START /WAIT %C%\ATI\CCP\Setup.exe -s -f1 %C%\ATI\CCP\shortcut.iss))

REM Переходим к проверке наличия следующего драйвера и установке следующих панелей

Таким образом, чтобы добавить собственные дополнения, необходимо внести в файл Panels.cmd секцию по образу и подобию вышеприведенной. Разумеется не забывайте изменять пути, имена файлов и ключи для тихой установки.

6. Использование пакета драйверов

Напоследок несколько слов об использовании Вашего пакета. Фактически этот абзац добавлен шутки ради. Все и так просто.

Нужно поместить Ваш пакет драйверов в папку DriverPacks интегратора DriverPacks BASE (или в соответствующую папку аддона).

После этого остается лишь запустить пакетный файл, выбрать метод интеграции драйверов и все! Не нужно больше вносить изменения в файлы winnt.sif и txtsetup.sif. Вообще больше ничего не нужно делать!

Источник: http://www.oszone.net/4085

§ .18 Программирование драйверов: Пишем первый драйвер. Часть 1

Создание драйверов

Дмитрий Иванов, 18 Ноября 2008 года
Статья доработана и обновлена 14 мая 2014

Файлы к статье скачать
Имя: PS018.zip (ZIP архив)
Размер: 19 КБ

Ну вот мы и добрались до самого интересного – сейчас будем писать драйвер. Итак, приступим.

Для удобства выполнения, всю последовательность действий по написанию драйвера я распишу по пунктам.

1. Создание директории проекта

Установив DDK, на Вашем компьютере в директории C:\WINDDK\2600.1106\ должны появиться файлы DDK. В этой директории создадим папку, в которой будут храниться наши проекты. Назовем ее, например, MyDrivers.

В папке MyDrivers создадим папку FirstDriver – тут будет находится наш первый проект драйвера.

2. Подготовка файлов проекта

В папке FirstDriver создайте пустой текстовый файл и переименуйте его под именем FirstDriver.c

При попытке переименовки со сменой расширения файла, появляется следующее предупреждение:

Не обращаем внимания на это предупреждение, и нажимаем Да. При этом наш файл примет вид:

Если же никакого предупреждения не было и переименованный файл так и остался текстовым с именем FirstDriver.c и расширением .txt, то в настройках своийств папки, которые можно найти в Пуск-> Настройка-> Панель управления-> Свойства паки уберите галочку напротив пункта “Скрывать расширения для зарегестрированных типов файлов”. Попробуйте еще раз и все должно быть в порядке.

Теперь нам надо добавить еще два очень важных файла в наш проект, без которых драйвер нам не сделать. Они называются makefile и sources (обратите внимание, у них нет расширения). Их можно создать самим, но мы сделаем проще: скопируем готовые из какого либо примера проекта драйвера из DDK.

Например, возьмем их из C:\WINDDK\2600.1106\src\general\cancel\sys\. Итак, копируем из указанной директории эти два файла и вставляем их в нашу папку проекта FirstDriver. Эти файлы управляют процессрм компиляции драйвера.

Файл makefile оставляем без изменений, а вот sources надо подредактировать.

Открываем этот файл с помощью блокнота, и удаляем из него все что там есть и вставляем туда текст, представленный ниже. Сохранияем файл.
TARGETNAME=Port TARGETPATH=c:\WINDDK\2600.1106\MyDrivers\FirstDriver TARGETTYPE=DRIVER SOURCES=FirstDriver.c

Первым параметром идет TARGETNAME, которому мы присвоили Port. Это значит, что когда DDK откомпилирует наш код и создаст драйвер, имя этого файла будет Port.sys Следующем параметром идет TARGETPATH, которому мы указали путь к папке нашего проекта.

Если Вы устанавливали DDK в другое место, или создали пупку проекта в другой директории, здесь Вам надо это поправить на тот путь, который у Вас. Параметр TARGETTYPE пока оставлю без комментариев. В параметре SOURCES указываем, из каких файлов будет компилироваться драйвер.

У нас это файл FirstDriver.c, вот мы его и указали.

3. Код драйвера

Всю подготовительную работу мы сделали. Можно приступать к самой содержательной части – коду драйвера. Писать мы будем его на Си.

Еще раз напомню решаемую нами задачу: надо написать драйвер под Windows 2000, XP с помощью которого можно будет работать с портами компьютера (читать и писать данные) .

Рассмотрим код, представленный ниже. Серым цветом обозначены те участки кода, которые являются как бы шаблонными для большинства драйверов, а зеленым – код, который относится именно к нашему текущему драйверу.

#include “ntddk.h” #define NT_DEVICE_NAME L”\\Device\TName” #define WIN32_DEVICE_NAME L”\\DosDevices\\MYDRIVER” #define IOCTL_READ CTL_CODE (FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_WRITE CTL_CODE (FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) NTSTATUS CtlCreate(IN PDEVICE_OBJECT, IN PIRP); NTSTATUS CtlClose(IN PDEVICE_OBJECT, IN PIRP); NTSTATUS CtlDispatch(IN PDEVICE_OBJECT,IN PIRP); VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject); NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath) { PDEVICE_OBJECT pDeviceObject; UNICODE_STRING uniNtName; UNICODE_STRING uniWin32Name; RtlInitUnicodeString(&uniNtName, NT_DEVICE_NAME); RtlInitUnicodeString(&uniWin32Name, WIN32_DEVICE_NAME); IoCreateSymbolicLink(&uniWin32Name, &uniNtName); IoCreateDevice(pDriverObject,0,&uniNtName,FILE_DEVICE_UNKNOWN,0,FALSE,&pDeviceObject); pDriverObject->MajorFunction[IRP_MJ_CREATE]=CtlCreate; pDriverObject->MajorFunction[IRP_MJ_CLOSE]=CtlClose; pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=CtlDispatch; pDriverObject->DriverUnload = UnloadOperation; return STATUS_SUCCESS; } NTSTATUS CtlCreate(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp) { Irp->IoStatus.Status=STATUS_SUCCESS; Irp->IoStatus.Information=0; IoCompleteRequest(Irp,IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS CtlClose(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp) { Irp->IoStatus.Status=STATUS_SUCCESS; Irp->IoStatus.Information=0; IoCompleteRequest(Irp,IO_NO_INCREMENT); return STATUS_SUCCESS; } VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject) { PDEVICE_OBJECT deviceObject = pDriverObject->DeviceObject; UNICODE_STRING uniWin32NameString; RtlInitUnicodeString( &uniWin32NameString, WIN32_DEVICE_NAME ); IoDeleteSymbolicLink( &uniWin32NameString ); IoDeleteDevice( deviceObject ); return; } NTSTATUS CtlDispatch(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp) { PIO_STACK_LOCATION pIrpStack; PUSHORT pIOBuffer; USHORT Port; USHORT ValueToPort; pIrpStack=IoGetCurrentIrpStackLocation(Irp); pIOBuffer=Irp->AssociatedIrp.SystemBuffer; switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_READ: Port=pIOBuffer[0]; pIOBuffer[0]=READ_PORT_UCHAR((PUCHAR)Port); Irp->IoStatus.Information=2; break; case IOCTL_WRITE: Port=pIOBuffer[0]; ValueToPort=pIOBuffer[1]; WRITE_PORT_USHORT((PUSHORT)Port,(USHORT)ValueToPort); Irp->IoStatus.Information=0; break; } Irp->IoStatus.Status=STATUS_SUCCESS; IoCompleteRequest (Irp,IO_NO_INCREMENT); return STATUS_SUCCESS; }

Представленный код – есть код простейшего драйвера, который может только записать данные в порт и прочесть их от туда. Выглядит страшновато? Ни чего, в следующей статье будем разбираться с тем что в нем понаписано.

© Дмитрий Иванов 18 ноября 2008 года

http://www.kernelchip.ru

Источник: https://kernelchip.ru/pcports/PS018.php

Пишем свой первый Windows-драйвер

Создание драйверов
Итак, после моей предыдущей статьи я понял что тема про программирование драйверов Windows интересна хабровчанам, поэтому продолжу.

В этой статье я решил разобрать простую программу-драйвер, которая делает только то, что пишет отладочное сообщение «Hello world!» при старте драйвера и «Goodbye!» при завершении, а также опишу те средства разработки, которые нам понадобятся для того, чтобы собрать и запустить драйвер. Итак, для начала приведем текст этой несложной программы.

  1. // TestDriver.

    c

  2. #include
  3. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
  4. VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject);
  5. #pragma alloc_text(INIT, DriverEntry)
  6. #pragma alloc_text(PAGE, UnloadRoutine)
  7. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  8. {
  9.   DriverObject->DriverUnload = UnloadRoutine;
  10.   DbgPrint(«Hello world!»);
  11.   return STATUS_SUCCESS;
  12. }
  13. VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject)
  14. {
  15.   DbgPrint(«Goodbye!»);
  16. }

* This source code was highlighted with Source Code Highlighter.

Итак, теперь сначала разберемся, что делает каждая инструкция. Перво-наперво мы подключаем заголовочный файл ntddk.h. Это один из базовых подключаемых файлов во всех драйверах: в нем содержатся объявления типов NTSTATUS, PDRIVER_OBJECT, PUNICODE_STRING, а также функции DbgPrint.

Далее идет объявление двух функций: DriverEntry и UnloadRoutine. Расскажу о первой поподробнее.

Итак, как уважаемые читатели знают, в каждой программе есть точка входа, в программах на языке C это функция main или WinMain.

В драйвере роль точки входа выполняет функция DriverEntry, которая получает на вход указатель на структуру DriverObject, а также указатель на строку реестра, соответствующую загружаемому драйверу.

Структура DriverObject содержит множество полей, которые определяют поведение будущего драйвера. Наиболее ключевые из них — это указатели на так называемые вызываемые (или callback) функции, то есть функции, которые будут вызываться при наступлении определенного события. Одну из таких функций мы определяем: это функция UnloadRoutine.

Указатель на данную функцию помещается в поле DriverUnload. Таким образом при выгрузке драйвера сначала будет вызвана функция UnloadRoutine. Это очень удобно, когда драйвер имеет какие-то временные данные, которые следует очистить перед завершением работы.

В нашем примере эта функция нужна только чтобы отследить сам факт завершения работы драйвера.

Для того, чтобы выводить отладочные сообщения мы используем функцию DbgPrint, которая имеет синтаксис, аналогичной функции printf из пользовательского режима (userspace).

В этом простом примере мы использовали также директивы #pragma alloc_text(INIT, DriverEntry) и #pragma alloc_text(PAGE, UnloadRoutine).

Объясню что они означают: первая помещает функцию DriverEntry в INIT секцию, то есть как бы говорит, что DriverEntry будет выполнена один раз и после этого код функции можно спокойно выгрузить из памяти.

Вторая помечает код функции UnloadRoutine как выгружаемый, т.е. при необходимости, система может переместить его в файл подкачки, а потом забрать его оттуда.

Вы можете задуматься, мол ну с первой-то директивой понятно, типа оптимизация и все такое, но зачем мы используем вторую директиву, зачем помечать код как возможный к выгрузке в файл подкачки? Поясню этот вопрос: каждый процесс в системе имеет такой параметр, как IRQL (подробнее читаем по ссылке Interrupt request level ибо это материал отдельной статьи), то есть некоторый параметр, отвечающий за возможность прерывания процесса: чем выше IRQL тем меньше шансов прервать выполнение процесса. Возможности процесса так же зависят от IRQL: чем выше IRQL тем меньше возможности процесса, это вполне логично, т.е. такой подход побуждает разработчиков выполнять только самые необходимые операции при высоком IRQL, а все остальные действия делать при низком. Вернемся к основной теме, о том, почему мы делаем для функции UnloadRoutine возможность выгрузки в файл подкачки: все опять же сводится к оптимизации: работа с файлом подкачки недоступна при высоком IRQL, а процедура выгрузки драйвера гарантированно выполняется при низком IRQL, поэтому мы специально указываем руками что код функции выгрузки драйвера можно поместить в своп.

Ух, вроде как с обсуждением кода этой, казалось бы небольшой программки закончено, теперь разберемся как скомпилировать и запустить наш драйвер. Для этого нам понадобится:

  • WDK или DDK
  • Текстовый редактор
  • Программа DbgView — бесплатная программа для просмотра отладочных сообщений, получаемых от драйверов, ее можно найти на сайте sysinternals
  • Программа KmdManager — бесплатная программа для регистрации, запуска и тестирования драйвера, ее можно найти на сайте wasm.ru

Теперь последовательность действий: сначала мы пишем два файла, один называется MAKEFILE, с таким содержимым

################################################## # DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source # file to this component. This file merely indirects to the real make file # that is shared by all the driver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV)\makefile.def ##################################################

а второй называется sources и содержит в себе следующее:

################################################## TARGETNAME=TestDriver TARGETTYPE=DRIVER SOURCES=TestDriver.c ##################################################

Эти файлы нужны для сборки драйвера. Да, забыл сказать, что в 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».

Теперь нам нужно запустить программу DbgView чтобы увидеть сообщения, которые будет выдавать драйвер. После запуска данной программы нам нужно указать, что мы хотим просматривать сообщения из ядра (Capture->Capture Kernel).

Теперь запукаем программу KmdManager, указываем путь к нашему драйверу (файл TestDriver.sys) нажимаем кнопку Register, затем Run. Теперь драйвер зарегистрирован в системе и запущен. В программе DbgView мы должны увидеть наше сообщение «Hello World!». Теперь завершаем работу драйвера кнопкой Stop и убираем регистрацию драйвера кнопкой Unregister. Кстати, в DbgView дожна появиться еще одна строка. Итак, чего же мы достигли: мы написали, скомпилировали и запустили свой первый Windows-драйвер! Добавлю только, что при написании сложный драйверов для отладки используется двухмашинная конфигурация, когда на одном компьтере ведется написание драйвера, а на другом — запуск и тестирование. Это делается из-за того, что неправильно написанный драйвер может обрушить всю систему, а на ней может быть очень много ценных данных. Часто в качестве второго компьютера используется виртуальная машина.

Источник: https://habr.com/ru/post/40466/

Создание драйверов. Часть 1

Создание драйверов

В данной статье мне хотелось бы показать, как создавать драйвера, если Вам необходима теоретическая информация то советую прочесть книгу Дэвида Соломона и Марка Руссиновича «Внутреннее устройство Microsoft Windows 2000».

Для начала мы сделаем простой драйвер для Windows 2000, который послужит нам каркасом для дальнейших экспериментов.

Для работы понадобится «Windows 2000 Driver Development Kit», именно с помощью данного пакета создаются драйвера, в его состав входят компилятор, линкер, заголовочные файлы, lib-файлы, документация, полезные инструменты и конечно множество примеров.

Для написания и редактирования исходных текстов драйверов можно воспользоваться редактором, входящим в состав MS Visual Studio или Блокнотом, незаменимым инструментом программиста.

Для просмотра объектов операционной системы понадобиться программа WinObj, автором которой является Марк Руссинович, программу можно найти на сайте http://www.sysinternals.

com/, так же с этого адреса можно скачать программу DebugView, которая позволяет просматривать диагностические сообщения, посылаемые функциями OutputDebugString и DbgPrint.

Начнем, создайте на диске С:\ папку и назовите её «MyFirstDriver», затем в ней папку «sys» и «loader», это нужно для того чтобы легче было работать с путями к бинарным файлам. В папке «sys» создайте три файла, с именами «makefile», «sources» и «MyFirstDriver.c». В файле «makefile» напишите следующее:

!INCLUDE $(NTMAKEENV)\makefile.def

Этот файл нужен для работы программы Build. В файле «sources» напишите следующее:

TARGETNAME=MyFirstDriverTARGETTYPE=DRIVERTARGETPATH=objSOURCES=MyFirstDriver.c

Этот файл нужен для настройки процесса компиляции:TARGETNAME – имя драйвера;TARGETTYPE – тип бинарного файла, который мы хотим создать, может иметь следующие значения: DRIVER, GDI_DRIVER, MINIPORT, LIBRARY, DYNLINK (for DLLs).TARGETPATH – путь для папки с временными файлами;

SOURCES – путь к файлу с исходным текстом драйвера.

Теперь переходим к исходному файлу «MyFirstDriver.c», в нем напишите следующее:

#include “ntddk.h” /*————————————————————–*/ NTSTATUS MyFirstDriverCreate (IN PDEVICE_OBJECT fdo, IN PIRP irp); NTSTATUS MyFirstDriverClose (IN PDEVICE_OBJECT fdo, IN PIRP irp); NTSTATUS MyFirstDriverControl (IN PDEVICE_OBJECT fdo, IN PIRP irp); VOID MyFirstDriverUnload (IN PDRIVER_OBJECT fdo); /*————————————————————–*/ NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { NTSTATUS status; PDEVICE_OBJECT fdo; UNICODE_STRING devName; UNICODE_STRING devLink; #if DBG DbgPrint(“in DriverEntry”); #endif DriverObject->DriverUnload = MyFirstDriverUnload; DriverObject->MajorFunction[IRP_MJ_CREATE] = MyFirstDriverCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyFirstDriverClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyFirstDriverControl; RtlInitUnicodeString(&devName,L”\\Device\\MyFirstDriver”); status = IoCreateDevice(DriverObject,sizeof(PDEVICE_OBJECT),&devName,FILE_DEVICE_UNKNOWN,0,FALSE,&fdo); if(!NT_SUCCESS(status))return status; #if DBG DbgPrint(“IoCreateDevice status ok”); #endif RtlInitUnicodeString(&devLink,L”\\??\\MyFirstDriver”); status = IoCreateSymbolicLink(&devLink,&devName); if(!NT_SUCCESS(status)) { IoDeleteDevice( fdo ); return status; } #if DBG DbgPrint(“DriverEntry STATUS_SUCCESS”); #endif return STATUS_SUCCESS; } /*————————————————————–*/ NTSTATUS MyFirstDriverCreate(IN PDEVICE_OBJECT fdo, IN PIRP irp) { #if DBG DbgPrint(“Run MyFirstDriverCreate”); #endif irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS MyFirstDriverClose(IN PDEVICE_OBJECT fdo, IN PIRP irp) { #if DBG DbgPrint(“Run MyFirstDriverClose”); #endif irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS MyFirstDriverControl (IN PDEVICE_OBJECT fdo, IN PIRP irp) { #if DBG DbgPrint(“Run MyFirstDriverControl”); #endif irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } VOID MyFirstDriverUnload(IN PDRIVER_OBJECT fdo) { UNICODE_STRING deviceLink; RtlInitUnicodeString(&deviceLink,L”\\??\\MyFirstDriver”); IoDeleteSymbolicLink(&deviceLink); IoDeleteDevice(fdo->DeviceObject); #if DBG DbgPrint(“Run MyFirstDriverUnload – delete link”); #endif }

Как Вы видите драйвер очень прост и имеет основные функции:DriverEntry – данная функция есть в каждом драйвере и является точкой входа.Параметры:IN PDRIVER_OBJECT DriverObject – адрес объекта драйвера;IN PUNICODE_STRING RegistryPath – путь в реестре, где содержится информация о драйвере.

Тип возвращаемого значения NTSTATUS, на самом деле это просто тип LONG, может принимать следующие значения:STATUS_SUCCESS – успешно;STATUS_N – где, N – номер ошибки.

В функции DriverEntry происходит заполнение полей структуры DriverObject:DriverUnload – здесь регистрируется функция выгрузки драйвера;MajorFunction[IRP_MJ_CREATE] – здесь регистрируется функция обработки запросов открытия драйвера;MajorFunction[IRP_MJ_CLOSE] — здесь регистрируется функция обработки запросов закрытия драйвера;

MajorFunction[IRP_MJ_DEVICE_CONTROL] — здесь регистрируется функция обработки IOCTLзапросов. Так же в DriverEntry создается символьная ссылка и устройство. Для вывода отладочной информации с помощью функции DbgPrint мы используем возможности условной компиляции, то есть конструкция:

#if DBG DbgPrint(“”);

#endif

будет присутствовать только в версиях Checked.Для компиляции запустите «Checked Build Environment»,

Появится консольное окно, далее с помощью команды «cd» перейдите в папку с файлами драйвера и наберите команду build –cZ
Теперь драйвер готов, следующим шагом будет создание программы, которая будет динамически загружать наш драйвер с помощью SCM (Service Control Manager), подробно о нем написано в MSDN`е. Для этого создайте обыкновенную консольную версию программы и поместите все файлы проекта в папку «loader», в исходнике загрузчика напишите следующее: #include #include #include using namespace std; void ErrorView(); int main() { cout

Источник: http://blagin.ru/sozdanie-drajverov-chast-1/

Основы разработки драйверов устройств в операционных системах Windows

Создание драйверов

В предыдущих главах этой книги  для управления  различными  устройствами  мы использова ли свободно распространяемое программное обеспечение, куда входил драйвер PortTalk.sys и программа allowio.exe.

В этой главе мы рассмотрим вопросы создания собственных драйве ров устройств в операционных  системах Windows, а также создадим драйвер для управления аналого цифровым преобразователем, подключенным к параллельному порту ПК.

Разработка  драйверов  для Windows (как,  впрочем,  и для других операционных  систем) окутана неким мистическим ореолом таинственности и считается чем то из разряда «черной магии».

Большинство программистов  и пользователей полагают, что это чрезвычайно  труд ное занятие и доступно далеко не каждому.

В определенном смысле это действительно так, если вы собираетесь разработать, например, драйвер звуковой или видеокарты.

Тем не менее, разработать несложный драйвер для обычного устройства из разряда до машней или лабораторной электроники может даже пользователь средней руки, достаточно хорошо владеющий основами программирования  на языке C (поскольку все драйверы разра батываются с использованием языка  C) и имеющий хорошее представление о принципах организации  операционных  систем Windows. При разработке  драйверов  следует всегда по мнить, что они работают в режиме ядра и при неправильном функционировании мгновенно могут привести операционную систему к краху («синий экран  смерти»).

Напомню, что драйверу ядра доступны все аппаратные и программные  ресурсы операци онной системы, которые могут быть разрушены неправильно работающим программным ко дом.

Если вы захотите модифицировать приведенный  в этой главе программный код драйве ров или написать собственный  драйвер, то тщательно изучите документацию по разработке драйверов, дабы избежать беспощадного разрушения системы.

Для разработки драйверов мы будем применять стандартное свободно распространяе мое программное  средство, выпущенное фирмой Microsoft  – Windows DDK (Driver Develop ment Kit). Этот программный  пакет можно  закачать  с сайта Microsoft.  В его состав включена обширная документация вместе с примерами разработок драйверов.

Сразу хочу оговориться,  что мы не будем вникать во все аспекты разработки драйверов, поскольку это очень обширная и сложная тема, да это и не нужно.

Для большинства устройств пользователя, описанных в этой книге, и многих других, которые несложно разработать, дос таточно иметь самые простые драйверы устройств, в которых используются только основные приемы техники программирования драйверов.

Все аспекты создания и функционирования драйверов  мы  будем рассматривать  применительно  к операционным  системам  Windows

2000/XP/2003/Vista.

Начнем с того, что определим, что собой представляет драйвер устройства, и как  он вза имодействует с операционной системой. В упрощенном виде такую схему взаимодействия можно представить следующей схемой (рис. 7.1):

Рис. 7.2

Ошибка программы при попытке записи

в параллельный порт

Команды ассемблера in и out являются «привилегированными» инструкциями процессора Intel и могут выполняться только программами, работающими на уровне ядра системы, поэто му пользовательская программа и завершается аварийным образом.

К ресурсам системы напрямую могут обращаться некоторые системные программы  и большинство драйверов устройств.

Для того чтобы пользовательская программа могла рабо тать с привилегированными  инструкциями процессора и обращаться напрямую к аппарат ным ресурсам системы, нужно дать ей доступ на уровне ядра, сняв бит защиты в контексте процесса.  Эти функции для примеров  в предыдущих главах выполняли драйвер PortTalk.sys и программа allowio.exe.

Есть и другой путь для работы с устройствами пользователя – написать самому драйвер устройства и обращаться к нему из программы  пользователя.  Именно этот путь и будет здесь описан. Для того чтобы реализовать такую возможность  нужно сделать два шага:

1)   написать драйвер устройства;

2)   написать программу, которая бы обращалась к драйверу устройства для выполнения операций ввода вывода.

Прежде чем реализовать подобный проект, нужно изучить некоторые ключевые аспекты взаимодействия программы пользователя и драйвера устройства, а также базовые принци пы разработки драйверов устройств.

Источник:  Магда Ю. С. Компьютер  в домашней лаборатории.  – М.: ДМК Пресс, 2008. – 200 с.: ил.

Источник: http://nauchebe.net/2012/03/osnovy-razrabotki-drajverov-ustrojstv-v-operacionnyx-sistemax-windows/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.