РПЗ (774931), страница 5

Файл №774931 РПЗ (два курсовика) 5 страницаРПЗ (774931) страница 52017-06-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

В этой функции происходит регистрация всех стандартных точек входа драйвера и обработчиков IRP-пакетов. В разрабатываемом драйвере пакеты IRP c кодами, не равными IRP_MJ_INTERNAL_DEVICE_CONTROL обрабатываются функцией DispatchRoutine.

Функция AddDevice

Управление этой функции передается диспетчером ввода/вывода после того, как завершает свою работу DriverEntry. AddDevice создает функциональный объект устройства с помощью вызова IoCreateDevice и подключает его к стеку драйверов выбранного устройства (вызовом IoAttachDeviceToDeviceStack). Кроме того, в этой функции производятся действия по подготовке к протоколированию: считываются настройки из системного реестра, выделяется буфер для сбора протоколируемой информации, создается лог-файл.

Функция DriverUnload

Функция DriverUnload необходима для того, чтобы сделать драйвер выгружаемым. В унаследованных драйверах на эту функцию возложен весь процесс выгрузки драйвера: удаление символьных ссылок, объектов устройств драйвера, отключение прерываний от объектов, освобождение выделенной памяти. В WDM-драйверах все эти действия возложены на функцию-обработчик пакетов с кодом IRP_MJ_PNP.

Функция DispatchRoutine

На эту функцию возложены обязанности по обработке IRP-пакетов с различными кодами, хотя в разрабатываемом драйвере существует необходимость в обработке только двух типов запросов. Все запросы с кодом, отличным от IRP_MJ_PNP передаются по стеку драйверов без изменений. Запросы же IRP_MJ_PNP диспетчеризуются по суб-кодам в функции PnP_Dispatch. Необходимость диспетчеризации по суб-кодам запросов IRP_MJ_PNP вызвана тем, что драйвер не должен нарушать порядка работы операционной системы и обязан подчиняться PnP-менеджеру, то есть в драйвере должны корректно обрабатываться события старта и удаления устройства.

Функция DispatchInternalDeviceControl

Запросы ввода/вывода к USB-накопителю передаются в составе IRP-пакетов с кодом IRP_MN_INTERNAL_DEVICE_CONTROL. Этот пакет содержит полную информацию о направлении и характере передаваемых данных. То есть для протоколирования обмена информацией с USB-носителем следует перехватывать пакеты именно этого типа.

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

Для сохранения протоколируемой информации используется, как уже было сказано, MDL-список. Этот MDL-список создается в функции AddDevice. Объем памяти, выделяемой под список, совпадает с максимальным размером лог-файла, задаваемым в пользовательском приложении. После создания список фиксируется в страничной памяти, что предотвращает его выгрузку на жесткий диск во время работы драйвера. После этих подготовительных действий список используется в функции DispatchInternalDeviceControl – он заполняется перехватываемой информацией.

Запись накопленного буфера в лог-файл происходит при удалении устройства.

Такая методика выбрана из-за того, что функция DispatchInternalDeviceControl работает на уровне запроса прерываний, равном DISPATCH_LEVEL, что сильно затрудняет использование механизмов синхронизации, которые могли бы позволить перейти на уровень запроса прерываний, равный PASSIVE_LEVEL, где становятся доступными функции работы с файлами. Если бы это было достигнуто в разрабатываемом драйвере, то отпала бы необходимость выделения больших объемов нестраничной памяти для хранения протокола.

Запись файла на диск в момент удаления устройства возможна, так как это событие инициализируется PnP-менеджером, запросы которого всегда происходят на уровне IRQL, равном PASSIVE_LEVEL.

Размещение кода драйвера в памяти

Некоторые функции драйвера, например те, которые выполняют инициализацию, выгодно выполнить и освободить память, занимаемую ими. В языке C есть специальная директива #pragma_alloc_text(, ), позволяющая управлять размещением кода. В качестве типа секции могут указываться значения "INIT" или "PAGE".

Функции с размещением в секции "INIT" выгружаются, и память, занимаемая ими, освобождается сразу по завершении их работы. В разрабатываемом драйвере в секции “INIT” размещена точка входа DriverEntry, поскольку она выполняется единожды при загрузке драйвера.

Точки входа AddDevice и DriverUnload располагаются в секции "PAGE", то есть в страничной памяти, поскольку они гарантированно вызываются на уровне привилегий, равном PASSIVE_LEVEL и, даже оказавшись выгруженными на диск, будут немедленно загружены в физическую память менеджером страничной памяти (который способен работать только на уровне PASSIVE_LEVEL).

Остальные же точки входа (DispatchRoutine и DispatchInternalDeviceControl) располагаются по умолчанию, в нестраничной памяти, поскольку их работа зависит от клиентского драйвера USB-устройства, под которым в стеке драйверов располагается разрабатываемый драйвер-фильтр. Уровень привилегий его запросов слабо предсказуем и может быть равен DISPATCH_LEVEL. На этом уровне подкачка страниц невозможна, что при обращении к выгруженной функции приведет к краху системы.

Установка драйвера в системе

Для установки драйвера следует создать его ключ в системном реестре.
Имя ключа должно иметь следующий вид:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\driver_name.

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

  • DisplayName – значение этого параметра описывает текст, используемый в служебных программах;

  • ErrorControl – этот параметр предписывает операционной системе способ поведения в той ситуации, когда при загрузке драйвера произошла ошибка;

  • ImagePath – описывает полный путь к файлу с исполняемым кодом драйвера;

  • Start – описывает стадию загрузки операционной системы, когда следует загружать драйвер;

  • Type – определяет тип драйвера.

Возможные значения указанных параметров можно узнать из документации MSDN.

Таким образом, первая стадия установки драйвера в систему заключается
в том, что должен быть создан ключ драйвера в реестре, а сам драйвер
скопирован в каталог, описываемый строкой ImagePath (как правило - %SystemRoot%\System32\Drivers\driver_name.sys).

Далее должно быть выбрано устройство, на которое будет установлен фильтр. Выбранному устройству в системном реестре соответствует ключ с именем вида HKLM\CurrentControlSet\Enum\USB\XXX\YYY.

Последняя часть ключа (XXX\YYY) определяется именем устройства. При установке драйвера фильтра нижнего уровня в разделе YYY создается строковый параметр LowerFilters, которому присваивается значение, совпадающее с именем драйвера, для которого был создан ключ в …\Services. Таким образом, при подключении устройства к системе для него будет создан стек драйверов, в состав которого в качестве фильтра нижнего уровня будет загружен устанавливаемый драйвер.

Кроме того, в ключе, связанном с устройством, при установке драйвера создается дополнительный раздел KvntUsbDrvrParams, который хранит два параметра:

  • MaxLogSize – максимальный размер лог-файла;

  • LogFileName – имя лог-файла.

Технологический раздел

Выбор среды разработки и технологии программирования

После подготовки и изучения алгоритмов встал еще ряд вопросов:

-под какую операционную систему реализовывать программный продукт;

-какой язык программирования и среду разработки использовать;

-какую технологию программирования положить в основу проекта.

В качестве операционной системы была выбрана система Widows XP и более новые Vista и 7. Это обусловлено тем, что Windows XP — самая распространенная на сегодняшний день ОС. И для нее написано больше всего IDE и программного обеспечения для разработки.

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

Драйвер-фильтр

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

Данное предпочтение было сделано по нескольким причинам:

  1. Удобство написания и отладки кода. В данном проекте я использовал пакет WDK для разработки драйверов под Windows, а также VisualDDK. WDK включает множество библиотек и макроопределений, облегчающих разработку кода.

VisualDDK - это надстройка для Visual Studio 2008, которая еще больше облегчает разработку драйверов, делая похожа это на написание обычных программ. В Visual Studio, таким образом, можно использовать встроенные и удобные инструменты для компиляции, отладки драйверов в ней, не используя каждый раз консоль.

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

Управлющее приложение

Для управляющего приложения был выбран язык C# и среда разработки Visual Studio 2008. С помощью C# можно быстро писать программы под Windows или интернет-приложения, благодаря удобному синтаксису, интеллектуальным подсказкам и управляемому коду. Используя управляемый код, не нужно заботится о сборке мусора, об указателях и о некоторых базовых структурах и алгоритмах – все это уже реализовано. Минусом разработки на C# .Net является низкая производительность программ. Но это уже компенсируется современным аппаратным обеспечением. Кроме того, в этом приложении нам и не требуется высокая производительность, в отличие от драйвера уровня ядра. Visual Studio предоставляет широкие возможности по созданию пользовательского интерфейса и ускоряет процесс разработки программных продуктов

Структуры данных драйвера-фильтра

Для сбора информации о вводе/выводе устройства используется структура BUFFER, объявленная в драйвере следующим образом:

typedef struct _BUFFER

{

PVOID Buffer;

PMDL Mdl;

ULONG MaxSize;

ULONG CurrentSize;

} BUFFER, *PBUFFER;

Поясним значения полей структуры:

  • Buffer – указатель на буфер, хранящий информацию;

  • Mdl – указатель на MDL-список, хранящий отображение буфера на системные страницы в памяти;

  • MaxSize – максимальный размер буфера в байтах;

  • CurrentSize – текущий размер буфера в байтах.

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

В разрабатываемом драйвере в расширении устройства расположена следующая информация:

typedef struct _DEVICE_EXTENSION

{

BUFFER UrbPackets;

HANDLE LogFileHandle;

BOOLEAN PreparedToLog;

PURB Urb;

ULONG UrbCount;

PDEVICE_OBJECT topDevObject;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

Поясним назначение указанных переменных:

  • UrbPackets – буфер для протоколирования;

  • LogFileHandle – дескриптор файла, в который записывается информация о вводе/выводе;

  • PreparedToLog – флаг, указывающий на то, что подготовка к протоколированию прошла успешно;

  • Urb – пакет, информация о котором переносится в буфер UrbPackets;

  • UrbCount – число URB-пакетов, прошедших через фильтр;

  • topDevObject – объект устройства, находящийся в стеке под нашим устройством.

Интерфейс управляющего приложения

Управляющее приложение предназначено для установки драйвера-фильтра в системе и передачи ему параметров протоколирования через системный реестр.

Интерфейс управляющего приложения состоит из главного окна, представленного на рисунке 9:

Рис. 9. Интерфейс управляющего приложения.

В левой части окна расположен список, в котором отображаются имена устройств, присутствующих в системе.

Установка драйвера происходит при нажатии на кнопку Install Driver. Установка драйвера происходит в несколько этапов.

  1. Файл KvntUsbDrvr.sys копируется в C:\Windows\System32\Drivers

  2. Устанавливается ключ в реестре с именем KvntUsbDrvr в каталоге HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\KvntUsbDrvr с параметрами

  3. Непосредственно в ключ конкретного устройства (вида VID_XXXX&PID_YYYY) заносится информация.

  4. Перезапуск устройства (автоматически или вручную)

После всех этих действий драйвер должен заработать и

Характеристики

Тип файла
Документ
Размер
606,5 Kb
Тип материала
Высшее учебное заведение

Список файлов курсовой работы

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6367
Авторов
на СтудИзбе
309
Средний доход
с одного платного файла
Обучение Подробнее