ЖУРНАЛ «СТА» №2/2006

(используется стандартная прошивка g00). Реальность отработки драйвера можно наблюдать, подключив осцил- лограф или светодиод к соответст- вующему выходу платы. Естественно, для визуализации работы драйвера можно было обойтись и без платы, например, вывести какоелибо сооб- щение, или озвучить это событие на динамике ПК. Затем в регистр eax за- гружается возвращаемый параметр (STATUS_IO_DEVICE_ERROR), тем самым системе сообщают об ошибке. На этом работа (и «жизнь» ) драйвера завершается. Так как текущий пример является только шаблоном драйвера, какихлибо конструктивных действий в драйвере не производится. Код ошибки выбран произвольно, его ис- пользование имело целью сообщить системе о том, что работа драйвера не может быть продолжена и его необхо- димо выгрузить, что операционная система и сделает. Но главного мы до- бились! Совершенно корректно, ис- пользуя все «джентльменские» прави- ла поведения в ОС Windows, мы полу- чили полный доступ в святая свя- тых — к системным ресурсам ОС, имея нулевой уровень привилегий для исполняемого кода. Просто жуть бе- рёт, если представить, что можно на- творить, бездумно воспользовавшись открывшимися возможностями. Можно свободно читать и записывать любые данные из внешних портов операторами IN и OUT, что было так привычно в DOS, записывать данные в любые адреса памяти, но одним неподходящим оператором или некорректным значением, записан- ным в порт или операцию память, можно получить «синий экран смер- ти» (BSOD) на Вашем мониторе. Большие возможности прежде всего предполагают и большую ответствен- ность. Вот уж где поговорка «Семь раз отмерь, один раз отрежь!» очень акту- альна. Рассмотрим прототип DriverEntry (у нас это процедура EntryDriverUNIO). DriverEntry proto DriverObject :PDRIVER_OBJECT, RegistryPath :PUNICODE_STRING DriverObject Указатель на объект созданного драйвера. Если говорить проще, то речь идёт о структуре типа DRIVER_OBJECT, описанной в файле NTDDK.h DDK. Часть полей в этой структуре необходимо запол- нить загруженному драйверу, имен- но по этой причине ему и передаёт- ся указатель на эту структуру. В на- шем примере мы не занимались этой работой, так как «не задержи- ваемся надолго». В полнофункцио- нальном драйвере эту работу при- дётся проделать. RegistryPath Указатель на структуру типа UNICODE_STRING, содержащую указатель на 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). /subsistem:native Тип подсистемы, необходимый для работы выходного файла. Этого во- проса мы кратко касались в данной статье, в части, посвящённой обзору архитектуры Windows. Напомню, что речь шла о существовании трёх под- систем окружения: Win32, POSIX и OS/2. Параметр Native говорит о том, что нет необходимости ни в од- ной из этих подсистем. Драйвер ра- ботает в «родной» или естественной среде, то есть использует базовый API самой ОС Windows. К сожалению, в статье изза ограни- чений по объёму нет возможности при- вести и прокомментировать листинг ntddk.inc для создания простейшего драйвера. Файл будет выложен на сай- те журнала «СТА». З АКЛЮЧЕНИЕ , ИЛИ Ч ТО ВПЕРЕДИ В статье изложен минимально необ- ходимый материал, для того чтобы обозначить основные направления развития темы написания драйверов в ОС Windows. Следующим шагом в соз- дании полнофункционального драй- вера должно быть создание объекта «устройство» функцией IoCreateDevice в фазе инициализации драйвера (в рамках процедуры EntryDriverUNIO) и достаточно полное изучение структу- ры DRIVER_OBJECT. Многие поля структуры — это просто указатели на процедуры обработки различных паке- тов запросов на вводвывод (IRP), формируемых диспетчером вводавы- вода на основании вызовов из прило- жений режима пользователя соответ- ствующих функций или внутрисис- темных запросов. Нет необходимости сразу пытаться реализовать все воз- можные процедуры. Минимально не- обходимые процедуры, обеспечиваю- щие обработку IRP, формируются на основании вызовов приложением пользователя функций CreateFile (от- крытие созданного драйвером устрой- ства) и DeviceIoControl (задание уст- ройству посредством драйвера опреде- лённых команд на выполнение). Учи- тывая, что ОС Windows XP в любых её ипостасях является одной из ведущих операционных систем на рынке авто- матизации, есть смысл глубже изучить вопрос строения этой ОС и овладеть техникой написания драйверов для неё. Удачи Вам! ● Л ИТЕРАТУРА 1. В. Пирогов. Ассемблер для Windows. — 3е изд. — СПб. : БХВПетербург, 2005. 2. М. Руссинович, Д. Соломон. Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP, Windows 2000. — 4е изд. — М. : Русская Редакция, Питер, 2005. 3. Валерий Яковлев. Написание пользова- тельской DLL доступа к универсальному OPCсерверу Fastwel // Современные тех- нологии автоматизации. 2005. № 3. С. 7481. Автор — сотрудник фирмы ПРОСОФТ Телефон: (812) 448-0444 Факс: (812) 448-0339 E-mail: info@spb.prosoft.ru П Р О Г РАММНО Е ОБ Е С П Е Ч Е НИ Е / Д РАЙ В Е Р Ы 75 СТА 2/2006 www.cta.ru

RkJQdWJsaXNoZXIy MTQ4NjUy