Программное обеспечение



Скачать 180.51 Kb.
Pdf просмотр
Дата28.11.2016
Размер180.51 Kb.
Просмотров84
Скачиваний0

© 2006, CTA Тел (495) 234 0635 Факс (495) 232 1653 СТА 2/2006
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
ДРАЙВЕРЫ
www.cta.ru
В
ВЕДЕНИЕ
Современный уровень аппаратных средств, используемых в автоматизации, давно размыл чёткую границу между компьютерами верхнего уровня и контроллерами полевого уровня, сточки зрения используемого системного программного обеспечения. Аппаратные ресурсы современных контроллеров позволяют использовать на них не только оптимизированные к минимальным аппаратным требованиям операционные системы, например, но и стандартные ОС класса Windows или Кроме того, из встраиваемых, но более ресурсоёмких операционных систем,
всё более активно применяющихся на рынке автоматизации отечественной промышленности, можно назвать Windows XP, общая структурная организация которой во многом схожа с организацией стандартного (офисного) варианта. Возможность конструирования разработчиком образа этой ОС из большого числа компонентов не влияет на основные принципы общей организации
ОС в части затрагиваемых в этой статье вопросов, поэтому рассматриваемые здесь возможности написания драйверов уровня ядра применимы и для этой ОС. На текущий момент доминирующее положение среди стандартных ОС Windows в сфере автоматизации занимают ОС Windows
2000/XP, поэтому дальнейшее изложение материала касается именно этих
ОС. Использование стандартных ОС
позволяет максимально использовать опыт программирования, накопленный специалистами, привыкшими работать со знакомым набором API
(Application Programming Interface интерфейс прикладного программирования. В числе решаемых программистами задач, кроме собственно написания прикладной программы, может возникнуть необходимость в написании драйвера, например, если по каким либо причинам драйверы под
ОС Windows не поставляются (например, платы ввода вывода в формате фирмы Octagon Systems или) или речь идёт оплате собственной разработки. Несмотря на большое количество технической литературы, посвящённой программированию в ОС Windows, проблемы написания драйверов практически не освещаются. Безусловно, этот вопрос достаточно специфичен для программистов общего плана, но для специалистов, работающих в сфере автоматизации производства, эта тема представляет большой интерес. Даже если программисту не придётся непосредственно заниматься написанием драйверов,
более глубокое понимание функционирования этой подсистемы ОС даст более чёткое представление о возможностях функционирова
Основы написания
драйвера уровня ядра
для ОС Windows 2000,
XP и XP Embedded
Статья посвящена практическим аспектам написания драйверов уровня ядра в операционных системах семейства NT — Windows 2000/XP (XP Для понимания работы подсистемы ввода вывода, составляющим звеном которой являются драйверы, дано краткое описание структурной организации ОС в целом.
Приводится рабочий пример простейшего драйвера уровня ядра.
Валерий Яковлев ния ОС в целом. Это позволяет трезво оценивать временные возможности стандартных драйверов и при необходимости получения лучших временных показателей проектируемой системы в целом написать свой, возможно менее функциональный, но более быстрый драйвер. Тема драйверов достаточно обширна и не укладывается в рамки одной статьи, поэтому мы ограничимся минимально необходимым общим материалом по структуре 2000/XP и затем решим прикладную задачу – напишем простейший драйвер, осуществляющий доступ к регистрам платы, установленной в слот ISA (пусть это будет модуль 5 фирмы Fastwel). Выбор устройства на шине ISA обусловлен более простой схемой программного взаимодействия с таким устройством,
на самом деле это может быть и плата,
установленная в слот PCI, или любой другой системный ресурс, обращение к которому на уровне регистров запрещено из программ режима пользователя. При этом усложняется алгоритм взаимодействия с устройством, но принцип доступа через порты ввода вывода остаётся. Драйвер напишем на языке ассемблера, который наиболее эффективно используется именно при написании драйверов, где требования к минимизации кода и, как следствие,
малое время исполнения объективно необходимы.

© 2006, CTA Тел (495) 234 0635 Факс (495) 232 1653 НЕОБХОДИМЫЕ ИНСТРУМЕНТЫ
ПРОГРАММИРОВАНИЯ
Для решения поставленной задачи используем пакета также комплект разработки драйверов 2000 Driver Development Kit,
DDK), который можно бесплатно скачать с сайта Microsoft (www.micro soft.com/ddk/). К сожалению, фирма пакет DDK для ОС Windows
XP не выкладывает для свободного доступа, предлагая его получить по почтена носителе. И хотя при этом оплачивается только доставка,
получение пакета затруднительно. В
комплект DDK входят документация
(папка help), являющаяся наиболее полным источником информации о внутренних структурах данных и внутрисистемных функциях используемых драйверами устройств, включаемые файлы (*.inc) из папки примеры реализаций драйверов устройств (папка src), утилиты (папка tools). Главное, в DDK входит набор библиотечных файлов (*.lib), необходимых при компоновке законченных драйверов и нашего простейшего драйвера в том числе. Весть два комплекта этих файлов — checked build и free build, нам необходим free build (папка libfre) для окончательной версии Windows, называемой свободным выпуском. Функции из библиотечных файлов (папка libchk) отладочной версии (checked build) отличаются более строгой проверкой ошибок. Но, увы, не всё так хорошо для прямого использования включаемых файлов, содержащих определения прототипов функций, а также необходимых структур, символьных констант и макросов. Есть одна проблема, заключающаяся в том, что все описания в DDK даны из расчёта использования языка Св то время как мы хотим воспользоваться великими могучим ассемблером. Если ещё
есть утилиты, позволяющие автоматизировать получение inc файлов для имеющихся lib файлов, то формирование файлов, содержащих структуры и константы это в основном ручной труд. Эту работу в необходимом объёме придётся проделать самостоятельно. Она не из категории творческих, нов Интернете совершенно бесплатно можно найти достаточно полные версии конвертированных для использования с ассемблером inc файлов, и таким образом можно начать нес нуля КРАТКИЙ ОБЗОР
АРХИТЕКТУРЫ
W
INDOWS
В Windows 2000/XP существует чёт кое разграничение двух областей в оперативной памяти и режимов процессора для исполняемого кода 1) область исполняемого кода в непривилегированном режиме работы процессора (пользовательском режиме) для приложений пользователя и части компонентов ОС, и область исполняемого кода операционной системы в привилегированном режиме процессора (режиме ядра. Под областью исполняемого кода надо понимать области загрузки (диапазон адресов) в оперативной памяти вычислительной системы. Windows 2000/XP — 32 разрядная ОС (существующую 64 битовую версию этой ОС в данной статье не рассматриваем, и поэтому всем приложениям доступно до 4 Гбайт линейного адресного пространства. Чаще всего в системе установлен существенно меньший объём физической памяти, но тем не менее для работающих программ это незаметно. Специальные системные механизмы обеспечивают возможность виртуального присутствия Гбайт памяти в системе. Деление Гбайт виртуального (или не виртуального, если Вы можете себе это позволить) адресного пространства между пользовательскими приложениями и системными программами осуществляется поровну первые Гбайт пользовательские, остальное системное адресное пространство. К ограничению свободы трудно привыкнуть, но, как ив наличии законов в стране, в этом есть элемент вековой мудрости, накопленной человече
П РОГ РАМ МН О Е ОБЕСПЕЧЕН И ЕД РАЙ ВЕРЫ СТА 2/2006
www.cta.ru
ством. Исполняемый код в пользовательском режиме имеет ограничения на доступ к системным ресурсам, в частности, на прямой доступ к оборудованию. Это связано с желанием обеспечить более устойчивое функционирование системы при наличии ошибок в программах пользователей. Надо учитывать, что Windows проектировалась как многозадачная и многопользовательская система, поэтому крах одного приложения не должен приводить к краху ОС и, следовательно, к краху других пользовательских приложений, запущенных на исполнение в этой системе. Приложения ОС и другие программы, исполняющиеся в режиме ядра, имеют полный доступ ко всем ресурсам системы. Упрощённая схема архитектуры Windows [2] приведена на рис. 1. Как уже отмечалось, в режиме пользователя функционируют не только прикладные программы пользователя,
но и часть процессов самой ОС.
К компонентам операционной системы, работающим в режиме пользователя, относятся:

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

пользовательские приложения. На текущий момент они бывают шести типов Win32, Win64 (в 64 битовой
Процессы поддержки системы
Процессы сервисов
Пользовательские приложения
Подсистемы окружения всех систем
Ядро
Драйверы устройств
Исполнительная система
Уровень абстрагирования от оборудования
Поддержка окон и графики
Пользовательский
режим
Режим ядра
Рис. 1. Упрощённая схема архитектуры Windows

© 2006, CTA Тел (495) 234 0635 Факс (495) 232 1653 http://www.cta.ru версии ОС, Windows 3.1, MS DOS,
POSIX и подсистемы окружения. Это часть операционной системы (программные оболочки, предоставляющая приложениям пользователя опреде лённый для конкретной подсистемы набор функций. Windows обеспечивает работу стремя подсистемами окружения Win32, POSIX и OS/2.
Windows 2000 поставляется с двумя подсистемами, а в Windows кроме Win32, не поставляются другие подсистемы окружения. К компонентам ОС, работающим в режиме ядра, относятся:

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

ядро, которое содержит обобщённый набор функций ОС, скрывающий различия между аппаратными платформами (на разных этапах развития
ОС NT поддерживались не только процессоры Intel, но и MIPS, Alpha
AXP, Motorola PowerPC). Ядро предоставляет процедуры/функции и базовые объекты, используемые исполнительной системой и драйверами для реализации структур и функций более высокого уровня. К таким функциям относятся планирование потоков, диспетчеризация прерываний, синхронизация процессов и т.д.;

драйверы устройств;

уровень абстрагирования от оборудования набор низкоуровневых функций (около 92), обеспечивающий стандартный интерфейс взаимодействия с аппаратно зависимыми элементами для функций, вызываемых компонентами ядра, драйверов и исполнительной системы, позволяющий абстрагироваться оттого, на какой конкретно элементной базе (чипе контроллера прерывания, контроллера ПДП) реализовано выполнение доступа к шине, таймеру и т.д.; подсистема поддержки окон игра фики.
Драйверы устройств в Windows, вот личие от DOS, для поддержки переносимости не обращаются к оборудованию напрямую, а используют функции, предоставляемые HAL. Драйверы устройств режима ядра делятся наследующие основные категории:

драйверы файловой системы (например сетевые редиректоры и серверы).
Не стоит понимать буквально, что речь идёт только о файловой системе
ОС. На самом деле многие физические устройства (например порты) представляются в системе как файлы, и обращение к ним осуществляется посредством вызова функций, как к обычным файлам, но со специфическими параметрами.
Далее уже драйверы файловой системы, получившие запрос на ввод вывод, определяют, о каком устройстве идёт речь, и вызывают соответствующие физическому устройству драйверы следующего уровня;

драйверы с поддержкой Plug and
Play (PnP) и ACPI (advanced configu ration power management interface усовершенствованный интерфейс управления конфигурацией и энер гопотреблением);

драйверы, не поддерживающие спецификации и ACPI (например драйверы протоколов TCP/IP,
IPX/SPX и т.д.), которые расширяют функциональность системы, предоставляя доступ из режима пользователя к системным сервисам и драйверам режима ядра. В свою очередь, в каждой из категорий есть группы драйверов, которые различаются в зависимости от модели устройства и места драйверов в цепочке обработки запроса на обслуживание операций ввода вывода.
Начиная сбыла введена поддержка PnP и энергосберегающих технологий (ACPI), что привело к расширению модели драйверов, называемой (напомню, что речь идёт о линейке модель драйверов WDM ранее реализована в Windows 98 и Windows
Millennium Edition. ОС Windows 2000 и более поздние версии ОС линейки поддерживают итак называемые унаследованные драйверы (NT4), естественно, с некоторой потерей функциональности. Модель WDM предусматривает существование трёх типов драйверов:

драйвер шины. Интересным моментом является то, что, в отличие от ОС, Windows 2000 и выше, позволяют реализовать поддержку новых типов шин, не поддерживаемых самой
ОС, не путём создания своего HAL
(DLL), а всего лишь добавлением своего драйвера шины. Это крайне существенно для поставщиков оборудования;

функциональный драйвер;

драйвер фильтра.
В рамках обобщения понятия устройства в Windows существует понятие класса устройств. Введение этого уровня абстрагирования сопровождается неизбежным появлением типа драйверов, отвечающих за обслуживание устройств одного класса (например CD
ROM), и драйверов, отвечающих заре шение того или иного уровня взаимодействия с конкретным оборудованием. В рамках этого деления существуют драйверы:

классов устройств;

порт драйверы;

минипорт драйверы.
Драйверы устройств в ОС Windows могут работать как в режиме ядра, таки в пользовательском режиме. К последним относятся:

драйверы виртуальных устройств
(VDD);

драйверы принтеров.
Важнейшим компонентом исполнительной системы, отвечающим за связь с устройствами, является подсистема ввода вывода. Построение подсистемы ввода вывода, как и других компонентов ОС Windows призвано обеспечить максимальную устойчивость ОС в целом. Поэтому в соответствии с общей доктриной разделения ответственности, связанной с режимами работы в ОС Windows, приложения пользователя не могут обращаться к устройствам (читай — драйверам) напрямую, а лишь через посредников в лице диспетчеров. Некоторые компоненты подсистемы и диспетчеры, как, например, диспетчер and Play, работают как в пользовательском режиме, таки в режиме ядра, нов целом вся подсистема ив частности, её главный компонент диспетчер ввода вывода работает в режиме ядра. В некотором промежуточном положении (сточки зрения доступности из разных режимов) оказываются и cat файлы (хранят цифровые подписи, удостоверяющие аттестацию лаборатории Microsoft
WHQL — Microsoft Windows Hardware
Quality Lab) и реестр. Диспетчер ввода вывода не только обеспечивает взаимосвязь между приложениями пользователя и драйверами устройств,
но также предоставляет общий для драйверов код, используемый при обработке запросов, что существенно влияет на минимизацию кода самих драйверов. Он также обеспечивает управление буферами запросов ввода вывода и при необходимости вызовы
70
СТА ПРОГРАММНОЕ ОБЕСПЕЧЕН И ЕД РАЙ ВЕРЫ Тел (495) 234 0635 Факс (495) 232 1653 http://www.cta.ru одним драйвером других драйверов для организации обработки запроса по цепочке. Упрощённая схема организации подсистемы ввода вывода изображена на рис. 2. Подсистема ввода вывода Windows проектировалась с целью обеспечения максимальной гибкости, как сточки зрения возможности её расширения драйверами специфических устройств, таки с учётом поддержки максимального абстрагирования устройств для прикладных приложений. Важными моментами обеспечения подобной функциональности являются возможности динамической загрузки (явной или на основе перечисления) ивы грузки драйверов, обобщённый вид формируемых структур запросов на ввод выводи диспетчеризация. Одним из инструментов регистрации,
запуска, останова и выгрузки драйверов служит механизм управления сер висами.
С
ЕРВИСЫ
Сервисы (Services), или службы, являются процессами, предоставляющими дополнительную функциональность в системе, независящую от интерактивных действий пользователя.
То есть это приложения, запускаемые без учёта того, зарегистрировался ли в системе какой либо пользователь или нет, и довольно часто запуск самого сервиса происходит до момента появления окна регистрации пользователя.
В части взаимодействия с системой сервисы используют языки функционально состоят из трёх компонентов application — сервисное приложение (или драйвер control program (SCP) программа управления сервисом Control Manager (SCM) диспетчер управления сервисом.
Весь необходимый API для реализации механизма диспетчеризации функции) сервисов сосредоточен в системной DLL библиотеке (Advanced Сервисное приложение — это драйвер или обычное Windows приложение
(чаще всего реализуемое как консольное приложение, имеющее дополнительный блок кода, обеспечивающий обработку команд от SCP и возврат ему определённой статусной информации стандартное Windows приложение, использующее для управления сервисом функции из набора функций. В основном SCP приложение предназначено для запуска,
останова и конфигурирования сервиса, иногда это приложение расширяет политику управления сервисом по отношению к реализуемой функции. В рамках ОС Windows существуют встроенные SCP, но для увеличения возможностей конфигурирова ния сервиса разработчик может написать свою собственную программу, возможно, даже не реализуя её
как отдельное приложение, а встраивая её функции в основное приложение, использующее сервис. Сервисные приложения только косвенно взаимодействуют с SCP, изменяя свою статусную информацию в процессе выполнения команд от SCM. Перед использованием SCM функций необходимо установить канал связи с (используется функция. Важным моментом является то, что при установке любого приложения, в рамках которого предполагается использование сервиса,
необходимо предварительно зарегистрировать сервис, вызвав функцию (реализована в. На основании параметров вызова этой функции SCM созда
ёт для каждого сервиса индивидуальный раздел в ветке реестра (основная информационная база SCM, или database), куда помещается как параметр вновь созданного раздела реестра информация о месте расположения на диске исполняемого файла соответствующего сервиса, его параметры при старте и конфигурационные настройки (эти настройки помещаются в подраздел Parameters созданного для сервиса раздела.
SCM отвечает за загрузку как серви сов, таки драйверов, поэтому неудивительно, что значения некоторых параметров явным образом указывают на контекст текущего приложения. Общий термин (Services), используемый для обозначения как служб,
так и драйверов устройств (они действительно во многом схожи по стилю работы и характеру выполняемых функций, часто вызывает путаницу в понимании программной документации. Наиболее важные для нашей прикладной задачи параметры созданного раздела реестра и их возможные значения для драйверов и сервисов показаны в таблице Наконечном этапе загрузки ОС
системный процесс Winlogon (перед появлением диалогового окна с при
П РОГ РАМ МН О Е ОБЕСПЕЧЕН И ЕД РАЙ ВЕРЫ СТА 2/2006
www.cta.ru
сервисы
Windows
Диспетчер родительского режима
PnP
Диспетчер электропитания
Пользовательский
режим
Режим ядра
Устанавливаемые компоненты , CAT файлы,
реестр
Процедуры
WDM, Приложения пользователя
Диспетчер
PnP
Диспетчер ввода вывода
Драйверы
Подсистема ввода вывода
Уровень абстрагирования от оборудования (Приложения пользователя
Рис. 2. Компоненты подсистемы ввода вывода

© 2006, CTA Тел (495) 234 0635 Факс (495) 232 1653 http://www.cta.ru глашением к регистрации) запускает, который в созданной внутренней базе данных сервисов SCM ищет записи драйверов и сервисов с параметром, имеющим значение, и запускает их. Далее рассмотрим пример реализации на языке ассемблера
(листинг 1). Минимально необходимый материал, позволяющий понять правила и нотацию для оформления программ на этом языке, можно найти в [3]. Действия программы заключаются в следующем. Устанавливается канал связи с SCM. Если при установлении канала связи происходит ошибка, выводится сообщение “Attempt of connection with SCM has failed!” и программа завершается. В случае установления канала регистрируем драйвер. Если происходит ошибка регистрации, выводим соответствующее сообщение и, закрыв дескриптор, завершаем программу. В случае успеха регистрации драйвера запускаем драйвер, удаляем его, закрываем дескриптор драйвера, закрываем дескриптор SCM, завершаем программу. В этой программе драйвер запускается один рази поэтому его действия носят характер, только подтверждающий факт его работы. Теперь более подробно.
Для вызова SCM функций SCP должна установить канал связи с SCM, используя функцию Прототип функции выглядит следующим образом:
OpenSCManager proto
lpMachineName:LPSTR,
lpDatabaseName:LPSTR,
wDesiredAccess:DWORD
lpMachineName
Указатель на строку, завершающуюся нулём, содержащую имя компьютера. Устанавливая этот параметр в, мы устанавливаем связь с локальным SCM (на этом компью тере).
lpDatabaseName
Указатель на строку, завершающуюся нулём, содержащую имя открываемой базы. Устанавливая этот параметр в NULL, мы устанавливаем связь с локальной, активной в текущий момент базой данных –
SERVICES_ACTIVE_DATABASE.
dwDesiredAccess
Права доступа, запрашиваемые при открытии канала. Могут быть следующие значения (устанавливаются по умолчанию, параметр доступ для внесения в базу данных записи о новом драйвере полный доступ).
Если эта функция возвращает не (NULL говорит об ошибке, то мы получаем дескриптор активной базы данных. Следующий шаг — это регистрация нашего драйвера путём вызова функции CreateService, прототип функции выглядит так:
CreateService proto
hSCManager:HANDLE,
lpServiceName:LPSTR,
lpDisplayName:LPSTR,
dwDesiredAcces:DWORD,
dwServiceType:DWORD,
dwStartType:DWORD,
dwErrorControl:DWORD,
lpBinaryPathName:LPSTR,
lpLoadOrderGroup:LPSTR,
lpdwTagId:LPDWORD,
lpDependencies:LPSTR,
lpServiceStartName:LPSTR,
lpPassword:LPSTR
hSCManager
Дескриптор базы данных SCM.
lpServiceName
Указатель на строку, завершающуюся нулём, содержащую имя драйвера сервиса. Длина до 256 символов.
Соответствует имени подраздела в реестре.
lpDisplayName
Указатель на строку, завершающуюся нулём, содержащую экранное имя драйвера/сервиса. Длина до 256 символов. Соответствует значению параметра в реестре.
dwDesiredAcces
Запрашиваемый тип доступа. Могут быть значения (полный доступ SERVICE_START (доступна запуск драйвера/сервиса);
72
СТА ПРОГРАММНОЕ ОБЕСПЕЧЕН И ЕД РАЙ ВЕРЫ Таблица 1

Основные параметры при регистрации сервиса/драйвера и их возможные значения
Параметр
Значение
Описание
Start
SERVICE_BOOT_START
(0)
Драйвер загружается Ntldr или Osloader, то есть в период загрузки самой ОС
SERVICE_SYSTEM_START
(1)
Драйвер загружается после загрузки и инициализации драйверов со значением
SERVICE_AUTO_START
(2)
Драйвер или сервис запускается SCM автоматически после запуска SCM процесса (Драйвер или сервис запускается SCM по требованию
SERVICE_DISABLED
(4)
Драйвер или сервис не загружается и не инициализируется
ErrorControl
SERVICE_ERROR_IGNORE
(0)
Код ошибки, возвращаемый драйвером или сервисом, игнорируется Если драйвер или сервис возвращает код ошибки, выводится предупреждение
SERVICE_ERROR_SEVERE
(2)
Если драйвер или сервис возвращает ошибку и ещё не использовалась последняя удачная конфигурация, то используется последняя удачная конфигурация. Если используется именно она, то загрузка продолжается.
SERVICE_ERROR_CRITICAL
(3)
Если драйвер или сервис возвращает ошибку и ещё не использовалась последняя удачная конфигурация , то используется последняя удачная конфигурация. Если используется именно она, то выводится BSOD Синий экран смерти. Драйвер устройства режима ядра
SERVICE_FILE_SISTEM_DRIVER
(2)
Драйвер файловой системы Путь к исполняемому файлу
Путь к исполняемому файлу драйвера или сервиса. По умолчанию файл ищется в папке Имя сервиса
Имя сервиса. По умолчанию имя его разделав реестре.

© 2006, CTA Тел (495) 234 0635 Факс (495) 232 1653 http://www.cta.ru
SERVICE_STOP (доступна останов драйвера/сервиса); DELETE (доступна удаление драйвера/сервиса изба зы SCM).
dwServiceType
Тип сервиса, в нашем случае. Соответствует значению параметра в реестре.
dwStartType
Тип запуска, в нашем случае. Соответствует значению параметра в реестре. Характер контроля ошибок, в нашем случае. Соответствует значению параметра в реестре.
lpBinaryPathName
Указатель на строку, завершающуюся нулём, содержащую полный путь к файлу загружаемого драйвера. Соответствует значению параметра в реестре.
lpLoadOrderGroup
Указатель на строку, завершающуюся нулём, содержащую имя группы,
в случае если загружаемый драйвер является членом группы. В противном случае значение NULL или указатель на пустую строку.
lpdwTagId
Указатель на переменную, содержащую уникальное значение тега,
идентифицирующее группу. В противном случае NULL.
lpDependencies
Указатель на массив имен драйверов или групп драйверов, загрузка которых должна быть осуществлена доза пуска текущего драйвера. Массив заканчивается двумя нулями, имена драйверов или групп разделяются одним нулём. Если запуск драйвера не связан с предварительным запуском других драйверов, значение NULL.
lpServiceStartName
Указатель на строку, завершающуюся нулём, содержащую имя учётной записи (account), с правами которой запускается текущий драйвер. В случае типа сервиса параметр содержит имя объекта драйвера. Если используется имя объекта драйвера, присвоенное подсистемой ввода вывода, то NULL.
lpPassword
Указатель на строку, завершающуюся нулём, содержащую пароль учётной записи, с правами которой запускается текущий драйвер. В случае значение этого параметра игнорируется.
П РОГ РАМ МН О Е ОБЕСПЕЧЕН И ЕД РАЙ ВЕРЫ СТА 2/2006
www.cta.ru
Листинг 1
; Пример простой программы управления сервисом (SCP)
.386
.model flat, stdcall
option casemap:none
include D:\masm32\INCLUDE\kernel32.inc
include D:\masm32\INCLUDE\user32.inc
include D:\masm32\INCLUDE\advapi32.inc
include D:\masm32\INCLUDE\windows.inc
includelib D:\masm32\LIB\kernel32.lib
includelib D:\masm32\LIB\user32.lib
includelib D:\masm32\LIB\advapi32.lib
.data
hSCManager dd 0
hService dd 0
ALIGN 4
CardUNIODriverPath db "D:\masm32\BIN\CardUNIO.sys",0
ALIGN 4
ErrMsg1 db "Attempt of connection with SCM has failed!",0
ALIGN 4
DrvName db "CardUNIO.sys",0
ALIGN 4
ErrMsg2 db "Attempt to register the driver has failed!",0
ALIGN 4
DrvName1 db "CardUNIO",0
ALIGN 4
DispNameDrv db "MyDriver",0
.code
start proc
; Устанавливаем канал связи с SCM
invoke OpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE
.if eax != NULL
mov hSCManager, eax
; Регистрируем драйвер
invoke CreateService, hSCManager, offset DrvName1, \
offset DispNameDrv, \
SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, \
SERVICE_DEMAND_START, \
SERVICE_ERROR_IGNORE, addr CardUNIODriverPath, \
NULL, NULL, NULL, NULL, NULL
.if eax != NULL
mov hService, eax
DeleteService,_hService_;_Закрываем_дескриптор_драйвера'>; Запускаем драйвер
invoke StartService, hService, 0, NULL
; Удаляем драйвер
invoke DeleteService, hService
; Закрываем дескриптор драйвера
invoke CloseServiceHandle, hService
.else
; Если не удалось зарегистрировать сервис, выводим об этом сообщение
invoke MessageBox, NULL, offset ErrMsg2, NULL,
MB_ICONSTOP
.endif
; Закрываем канал связи с SCM
invoke CloseServiceHandle, hSCManager
.else
; Сообщение в случае невозможности установить связь с SCM
invoke MessageBox, NULL, offset ErrMsg1, NULL, MB_ICONSTOP
.endif
invoke ExitProcess, 0
start endp
end start

© 2006, CTA Тел (495) 234 0635 Факс (495) 232 1653 Остальные функции — StartService,
DeleteService и CloseServiceHandle запускают, удаляют и закрывают дескриптор нашего драйвера. Далее приводятся прототипы функций и описания их параметров.
StartService proto
hService:HANDLE,
dwNumServiceArgs:DWORD,
lpServiceArgVectors:LPSTR
hService
Дескриптор драйвера/сервиса.
dwNumServiceArgs
Количество аргументов, передаваемых сервису. Драйверу не передаются аргументы, поэтому значения
NULL.
lpServiceArgVectors
Указатель на массив указателей,
ссылающихся на строки, завершающиеся нулём. В строках содержатся передаваемые службе аргументы. В нашем случае аргументы отсутствуют, поэтому значение
NULL.
DeleteService proto hService:HANDLE
hService
Дескриптор удаляемой службы.
CloseServiceHandle proto
hSCObject:HANDLE
hSCObject
Дескриптор закрываемого сервиса, драйвера. ПРОТОТИП ДРАЙВЕРА
РЕЖИМА ЯДРА
Рассмотрим шаблон простейшего драйвера (листинг Неправда ли, если Вы знакомы с динамически подключаемой библиотекой, то приведённый пример во многом напомнит Вам структуру простейшей динамической библиотеки. Надо сказать, что между драйверами и DLL очень много общего. После загрузки драйвера операционная система передаёт управление на его точку входа. Предполагается, что выполняемая функция программы, которой передано управление сразу после загрузки драйвера, — это инициализация структур и переменных, необходимых для дальнейшей работы драйвера, и отчёт перед ОС о выполненной задаче (“DriverEntry is the first routine called after a driver is loaded, and is responsible for initializing the driver”, — читаем мы в MSDN). Точкой входа является метка, указанная после директивы End, то есть в нашем случае это EntryDriverUNIO (у Вашего драйвера может быть другое имя. В
нашем примере после передачи управления на точку входа происходит формирование перехода изв на одном из выходов FPGA1 платы UNIOXX 5 СТА ПРОГРАММНОЕ ОБЕСПЕЧЕН И ЕД РАЙ ВЕРЫ базовый адрес FPGA1 UNIOxx 5 при поставке

MyDelay equ 100h
STATUS_IO_DEVICE_ERROR equ 0C0000185h
.code
ShortDelay proc ValDelay:DWORD
push cx
mov cx, ValDelay
@@delay:
dec cx
jnz @@delay
pop cx
ret
ShortDelay endp
EntryDriverUNIO proc DriverObject:PDRIVER_OBJECT, \
RegistryPath:PUNICODE_STRING
push cx
push dx
xor al,al
inc al
mov dx, UNIO_FPGA1_BaseAdrr
; в контрольном регистре устанавливаем BANK = 1
cli
out dx,al
sti
invoke ShortDelay, MyDelay
; в регистрах маски каналы 0 23 на вывод
inc dx
mov al,0ffh
cli
out dx,al
sti
invoke ShortDelay, MyDelay
xor al,al
dec dx
; в контрольном регистре устанавливаем BANK = 0
cli
out dx,al
sti
invoke ShortDelay, MyDelay
inc dx
; формируем импульс на 0 7 выходах
Cli
Out dx,al
invoke ShortDelay, MyDelay
mov al,0ffh
out dx,al
invoke ShortDelay, MyDelay
xor al,al
out dx,al
; возвращаем системе сообщение о неудачной
; инициализации драйвера
mov eax, STATUS_IO_DEVICE_ERROR
pop dx
pop cx
ret
EntryDriverUNIO endp
End EntryDriverUNIO
Листинг 2

© 2006, CTA Тел (495) 234 0635 Факс (495) 232 1653 используется стандартная прошивка g00). Реальность отработки драйвера можно наблюдать, подключив осциллограф или светодиод к соответствующему выходу платы. Естественно,
для визуализации работы драйвера можно было обойтись и без платы,
например, вывести какое либо сообщение, или озвучить это событие на динамике ПК. Затем в регистр eax загружается возвращаемый параметр, тем самым системе сообщают об ошибке.
На этом работа (и жизнь ) драйвера завершается. Так как текущий пример является только шаблоном драйвера,
каких либо конструктивных действий в драйвере не производится. Код ошибки выбран произвольно, его использование имело целью сообщить системе о том, что работа драйвера не может быть продолжена и его необходимо выгрузить, что операционная система и сделает. Но главного мы добились Совершенно корректно, используя все джентльменские правила поведения в ОС Windows, мы получили полный доступ в святая святых к системным ресурсам ОС,
имея нулевой уровень привилегий для исполняемого кода. Просто жуть бе рт, если представить, что можно натворить, бездумно воспользовавшись открывшимися возможностями.
Можно свободно читать и записывать любые данные из внешних портов операторами IN и OUT, что было так привычно в DOS, записывать данные в любые адреса памяти, но одним неподходящим оператором или некорректным значением, записанным в портили операцию память,
можно получить синий экран смерти) на Вашем мониторе.
Большие возможности прежде всего предполагают и большую ответственность. Вот уж где поговорка Семь раз отмерь, один раз отрежь очень актуальна. Рассмотрим прототипу нас это процедура EntryDriverUNIO).
DriverEntry proto
DriverObject:PDRIVER_OBJECT,
RegistryPath:PUNICODE_STRING
DriverObject
Указатель на объект созданного драйвера. Если говорить проще, то речь идёт о структуре типа, описанной в файле NTDDK.h DDK. Часть полей в этой структуре необходимо заполнить загруженному драйверу, именно по этой причине ему и передаёт ся указатель на эту структуру. В нашем примере мы не занимались этой работой, так как не задерживаемся надолго. В полнофункциональном драйвере эту работу при дётся проделать.
RegistryPath
Указатель на структуру типа, содержащую указатель на UNICODE строку, в которой содержится имя разделав реестре с параметрами инициализации драйвера.
Надо особо подчеркнуть, что, в отличие от пользовательского режима, в режиме ядра ОС работает только со строками типа UNICODE_STRING. Теперь несколько слово компиляции и компоновке драйвера. Строка компиляции достаточно традиционна и, если мы работаем с masm32, выглядит следующим образом:
ML /nologo /c /coff CardUNIO.asm
Опции компоновщика, естественно,
отличаются от опций для стандартного исполняемого файла:
LINK /nologo /driver /base:0x1000
/out:CardUNIO.sys /subsistem:native
CardUNIO.obj
/driver
Выходной файл – драйвер.
/base:0x1000
Предопределённый адрес загрузки драйвера.
/out:CardUNIO.sys
Выходной файл драйвера должен иметь соответствующее расширение
(по умолчанию — .exe). Тип подсистемы, необходимый для работы выходного файла. Этого вопроса мы кратко касались в данной статье, в части, посвящённой обзору архитектуры Windows. Напомню,
что речь шла о существовании трёх подсистем окружения Win32,
POSIX и OS/2. Параметр Native говорит о том, что нет необходимости нив одной из этих подсистем. Драйвер работает в родной или естественной среде, то есть использует базовый самой ОС К сожалению, в статье из за ограничений по объёму нет возможности привести и прокомментировать листинг ntddk.inc для создания простейшего драйвера. Файл будет выложен на сайте журнала СТАЗ АКЛЮЧЕНИЕ,
ИЛИ
Ч
ТО ВПЕРЕДИ
В статье изложен минимально необходимый материал, для того чтобы обозначить основные направления развития темы написания драйверов в
ОС Windows. Следующим шагом в создании полнофункционального драйвера должно быть создание объекта
«устройство» функцией IoCreateDevice в фазе инициализации драйвера (в рамках процедуры EntryDriverUNIO) и достаточно полное изучение структуры. Многие поля структуры — это просто указатели на процедуры обработки различных пакетов запросов на ввод вывод (формируемых диспетчером ввода вывода на основании вызовов из приложений режима пользователя соответствующих функций или внутрисистемных запросов. Нет необходимости сразу пытаться реализовать всевозможные процедуры. Минимально необходимые процедуры, обеспечивающие обработку IRP, формируются на основании вызовов приложением пользователя функций CreateFile (открытие созданного драйвером устройства) и DeviceIoControl (задание устройству посредством драйвера опреде лённых команд на выполнение. Учитывая, что ОС Windows XP в любых её
ипостасях является одной из ведущих операционных систем на рынке автоматизации, есть смысл глубже изучить вопрос строения этой ОС и овладеть техникой написания драйверов для не. Удачи Вам ЛИТЕРАТУРА. В. Пирогов. Ассемблер для Windows. —
3 е изд. — СПб. : БХВ Петербург, 2005.
2. М. Руссинович, Д. Соломон. Внутреннее устройство Microsoft Windows: Windows
Server 2003, Windows XP, Windows 2000. —
4 е изд. — М. : Русская Редакция, Питер. Валерий Яковлев. Написание пользовательской доступа к универсальному серверу Fastwel // Современные технологии автоматизации. 2005. № С. 74 81.
Автор — сотрудник фирмы
ПРОСОФТ
Телефон: (812) 448 0444
Факс: (812) 448 0339
E mail: info@spb.prosoft.ru
П РОГ РАМ МН О Е ОБЕСПЕЧЕН И ЕД РАЙ ВЕРЫ СТА 2/2006
www.cta.ru



Поделитесь с Вашими друзьями:


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал