Драйвера ядра Windows - Программирование, компьютеры и кибернетика курсовая работа

Драйвера ядра Windows - Программирование, компьютеры и кибернетика курсовая работа



































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


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

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

Когда приложению требуется операция в/выв, то происходит обращение к драйверу. Для этого приложение может давать запрос на чтение данных из устройства или запись данных на устройство. А если требуется какое-то другое действие, например, опрос или управление устройством, либо что-либо другое, то для этого используется т.н. IOCTL-интерфейс (Device In-Out Control).
Мы будем рассматривать именно такой случай для виртуальных устройств, потому что чаще всего, зачем нужно виртуальное устройство в драйвере? Чтобы можно было передавать ему данные, которые драйвер может как-то обработать (как нельзя в приложении) и вернуть в приложение результат. Вспомним, что обычный драйвер ядра, рассмотренный ранее, ничего не брал из приложения и ничего туда не возвращал, а просто делал действия, недоступные приложению.
Когда приложению требуется операция в/выв, то происходит обращение к драйверу. Для этого может использоваться т.н. IOCTL-интерфейс (Device In-Out Control).
Вызывающее приложение выполняет следующие действия:
1) Открытие файла и получение его дескриптора:
invoke CreateFile, ссылка на устройство, \
GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL
В результате, если все произошло успешно, мы получаем дескриптор устройства.
2) Посылка драйверу кода действия (что делать, драйвер может реализовывать много различных действий):
invoke DeviceIoControl, дескриптор, код действия, адрес входного буфера, размер входных данных, адрес выходного буфера, размер выходных данных, адрес буфера для реального количества байтов
3) Закрытие файла и, соответственно, освобождение дескриптора.
invoke CloseHandle дескриптор устройства
Чтобы передавать данные, модули (приложение и драйвер) должны договориться о протоколе взаимодействия (коды действий, структура буферов - входных и выходных).
Такой же код действия используется и в приложении, и в драйвере.
Код действия в приложении и в драйвере можно записывать в 16-ричном виде, а можно использовать макрос CTL_CODE, как это сделано в примере лаб. работы в файле common.inc.
Рассмотрим пример кода действия из драйвера виртуального устройства, который используется в лабораторной работе. Имя - IOCTL_GET.
В случае виртуального устройства файловый флаг равен 0.
Тип устройства - FILE_DEVICE_UNKNOWN = 22h
Права доступа - FILE_READ_ACCESS+FILE_WRITE_ACCESS = 1+2=3=11b
Функциональный код - в диапазоне от 800h до FFFh. У нас - 800h.
Метод буферизации - способ передачи данных между приложением и драйвером (возможны три):
- Для небольшого объема данных используется обычно METHOD_BUFFERED (00b) - выделяется дополнительный буфер в нестраничной памяти, достаточный для размещения входного и выходного буфера. Адрес этого буфера размещается в IRP в поле AssociatedIrp.SystemBuffer. Диспетчер в/выв сам берет на себя работу перезаписи данных между пользовательским и дополнительным буфером.
- Прямой доступ к данным (без буфера) - METHOD_OUT_DIRECT (2) - для вывода либо METOD_IN_DIRECT (1) - для ввода; поле из IRP - MdlAddress. Это непосредственное обращение - диспетчер в/выв фиксирует в памяти физические страницы, содержащие буфер пользовательского режима. При этом создает вспомогательную структуру MDL (Memory Descriptor List) для описания зафиксированных страниц. И разработчик драйвера работает с MDL.
- Доступ через буфер пользовательского уровня - METHOD_NEITHER (3); поле из IRP - SystemBuffer. Диспетчер в/выв передает в драйвер виртуальные адреса пользовательского режима. И в драйвере нужно очень осторожно с ними работать, потому что драйвер в этом случае должен работать только в контексте вызывающего потока.
Когда приложение посылает драйверу код действия, то начинает работу диспетчер ввода-вывода. Он отвечает за формирование пакета запроса ввода-вывода (I/O request packet, IRP) и посылку его драйверу для дальнейшей обработки.
Мы будем рассматривать 3 типа запросов:
- IRP_MJ_CREATE - будет передан при CreateFile,
- IRP_MJ_DEVICE_CONTROL - будет передан при DeviceIoControl
Пакет IRP состоит из заголовка и стеков размещения в/выв. Диспетчер в/выв создает количество ячеек стека в/выв равное числу драйверных слоев, участвующих в обработке запроса. Каждому драйверу разрешен доступ к собственной ячейке стека. Когда драйвер передает пакет IRP драйверу нижнего уровня, указатель на ячейку стека перемещается на ячейку, необходимую этому драйвера. И, наоборот, после обработки запроса, указатель поднимается вверх на ячейку драйвера высшего уровня. Получение указателя с помощью функции - IoGetCurrentStackLocation().
В каждом стеке размещения находится указатель на объект-устройство DeviceObject и на объект-файл FileObject, для которого инициирован запрос. Пакеты IRP всегда хранятся в невыгружаемой памяти.
Для работы драйвера создаются и применяются следующие объекты:
- символьные ссылки на устройства, которые доступны из режима пользователя.
1) Создание объекта драйвера. Создается при загрузке драйвера на этапе его запуска. В этот момент запускается функция DriverEntry и заполняется массив MajorFunction, а также указатель на объект устройства и обратно.
В состав объекта устройства входят:
- ссылка на объект драйвера, который обрабатывает запросы к устройству;
2) Создание символьной ссылки на устройство. Для того чтобы объект "устройство" стал доступен коду режима пользователя, драйвер должен создать в доступном ему (коду режима пользователя) каталоге "\??" еще один объект - символьную ссылку (symbolic link). Драйвер shablon.sys создает символьную ссылку "slshablon" на свое устройство "devshablon" в каталоге "\??", значением которой является строка "\Device\devshablon".
Таким образом, уже при загрузке драйвера (в нашем случае, на этапе загрузки ОС) мы имеем три объекта в памяти: драйвер "\Driver\shablon", устройство "\Device\shablon" и символьную ссылку на устройство "\??\slshablon".
3) Открытие. Дальше при запуске приложения вызывается CreateFile. Там есть ссылка на устройство. Из структуры объекта устройства DEVICE_OBJECT извлекаются сведения об обслуживающем его драйвере. Диспетчер ввода-вывода формирует пакет запроса ввода-вывода IRP типа IRP_MJ_CREATE и направляет его драйверу. Так драйвер узнает о том, что код режима пользователя пытается получить доступ к его устройству. Если драйвер не имеет ничего против, то он возвращает код успеха. У нашего драйвера есть специальная процедура диспетчеризации, которая реагирует на это IRP - DispatchCreateClose (там совмещенная процедура для открытия и закрытия устройства). В ней в поле Io.Status.Status передается STATUS_SUCCESS, а в Io.Status.Information - 0, т.к. в этом случае ничего не нужно передавать. Такой ответ от драйвера является сигналом диспетчеру объектов о создании виртуального файла. При этом в таблице описателей (handle table) процесса создается новый элемент с указателем на объект "файл", и коду режима пользователя возвращается новый дескриптор.
Если все ОК, то мы сохраняем дескриптор файла, возвращенный CreateFile, в переменной hDevice.
4) Операции в/выв. Теперь мы имеем возможность осуществлять операции управления этим устройством посредством вызова функций DeviceIoControl. Поскольку драйвер устройства может в принципе выполнять много различных задач, необходимо как-то дифференцировать запросы. Для этого и предназначен второй параметр dwIoControlCode, называемый управляющим кодом ввода-вывода (I/O control code), который строится по определенным правилам.
Используя описатель устройства, диспетчер ввода-вывода извлечет сведения об обслуживающем его драйвере, сформирует пакет запроса ввода-вывода типа IRP_MJ_DEVICE_CONTROL и направит его драйверу. В драйвере будет вызвана соответствующая процедура DispatchControl, которой в качестве параметров передаются код действия и сведения об адресах и размерах входного и выходного буфера. Все это передается через IRP. В процедуре из IRP берется необходимая информация: код действия, адрес буфера для передачи данных.
Процедура DispatchControl выполняет необходимые действия, в нашем случае адрес пакета IRP из регистра ESI Затем передает результат через выходной буфер в приложение.
Аналогично предыдущей процедуре, передаем через IRP статус завершения и количество переданных из драйвера байтов.
В приложении эти данные форматируются и выводятся.
5) Закрытие. Как и полагается поступать с дескрипторами, которые больше не нужны, вызовом функции CloseHandle, закрываем описатель устройства.
6) Выгрузка драйвера. Удаляем символьную ссылку и удаляем объект устройства.
Комплекс (2) состоит из двух программ:
- приложение, которое обращается к драйверу за адресом IRP, а затем этот адрес выводит в стандартное окно Windows.
Драйвер shablon выполняет то, что нельзя сделать на уровне пользователя, в данном случае определяет содержимое регистра esi при работе драйвера.
Приложение в выходном буфере получает содержимое esi, преобразует его для вывода в шестнадцатеричном виде и выводит в стандартное окно Windows.
Если необходимо в драйвере получить информацию из CMOS, то требуется:
- послать в порт 70h смещение в CMOS, которое нас интересует;
- взять из порта 71h информацию в al.
Затем записать эту информацию в выходной буфер.
А в приложении необходимо взять информацию из выходного буфера, при необходимости, преобразовать ее и вывести, либо проанализировать и в зависимости от результата вывести в стандартное окно необходимый текст.
В этой лабораторной работе предполагается, что драйвер устанавливается постоянно в Windows с помощью .inf-файла, используя из Панели управления пункт - Установка оборудования: Добавление нового устройства, Установка вручную, Показать все устройства, Установить с диска, с помощью обзора выбрать файл .inf (драйвер должен быть в той же папке).
Чтобы проверить, что драйвер установлен, выбираем в панели управления Система, Оборудование, Диспетчер устройств.
1.3 Доступ к существующим драйверам из приложений пользовательского режима
Алгоритм работы приложения работающего с драйвером
Для работы с драйвером приложению пользовательского режима необходимо получить манипулятор(хэндл) драйвера. Этот манипулятор можно получить, используя API-функцию CreateFile или CreateFileA, которая работает с ASCII-символами. Далее используется API-функция DeviceIoControl, которой, в качестве одного из параметров, передается IOCTL-код. IOCTL-код это управляющий код, с помощью которого драйвер узнает об операции, выполнение которой запрашивает приложение, методе передачи параметров и правах доступа, которые необходимы приложению для выполнения этой операции. После того как приложение вызвало
DeviceIoControl драйверу отправляется IRP_MJ_DEVICE_CONTROL. После завершения обработки запросы приложению возвращается управление и приложению остается проанализировать ответ драйвера и закрыть открытые дескрипторы.
В приведенном ниже примере приложение пользовательского режима отправляет запрос IOCTL_DISK_GET_PARTITION_INFO_EX драйверу файловой системы, проводит анализ полученной информации и выводит формат раздела жесткого диска.
int _tmain(int argc, _TCHAR* argv[])
PARTITION_INFORMATION_EX piPartitionInfo;
/*3*/FILE_SHARE_READ | FILE_SHARE_WRITE,
if (hDevice == INVALID_HANDLE_VALUE)
MessageBoxA(NULL, "CreateFileA error!", "Error", 0);
/*2*/IOCTL_DISK_GET_PARTITION_INFO_EX,
if(piPartitionInfo.PartitionStyle == PARTITION_STYLE_MBR)
MessageBoxA(NULL, "PARTITION_STYLE_MBR", "Caption", 0);
else if(piPartitionInfo.PartitionStyle == PARTITION_STYLE_GPT)
MessageBoxA(NULL, "PARTITION_STYLE_GPT", "Caption", 0);
MessageBoxA(NULL, "PARTITION_STYLE_RAW", "Caption", 0);
MessageBoxA(NULL, "DeviceIoControl error", "Error", 0);
Объявляются переменные, необходимые для работы приложения. PARTITION_INFORMATION_EX это структура, которая описывает информацию о разделе жесткого диска.
PARTITION_STYLE PartitionStyle; // формат раздела
LARGE_INTEGER StartingOffset; // смещение начала раздела
LARGE_INTEGER PartitionLength; // размер раздела
DWORD PartitionNumber; // номер раздела
BOOLEAN RewritePartition; // если раздел перезаписываемый то TRUE
PARTITION_INFORMATION_MBR Mbr; // дополнительная информация MBR Style раздела
PARTITION_INFORMATION_GPT Gpt; // дополнительная информация GPT Style раздела
В этой части программы вызывается функция CreateFileA для получения манипулятора, который записывается в переменную hDevice.
Синхронно вызывается функция DeviceIoControl. Ей передаются:
IOCTL-код IOCTL_DISK_GET_PARTITION_INFO_EX;
указатель на входной буфер, NULL в нашем случае;
указатель на переменную типа DWORD, в которой будет храниться количество возвращаемых байтов;
указатель на структуру OVERLAPPED, которая используется для асинхронного вызова функции.
После возврата управления, в случае успешного завершения функции, в структуре PARTITION_INFORMATION_EX хранится информация о разделе.
Производится анализ и вывод информации. Перед возвращением управления операционной системе можно закрыть открытые дескрипторы. Это позволяет сделать функция CloseHandle(__in HANDLE). Если дескрипторы не закрыть, то это сделает операционная система за Вас.
Воспроизвести 7 сигналов одинаковой длительности с постоянной частотой звучания.
Определить наличие и тип дисковода А: и вывести в стандартное окно, есть ли он и какого типа, в виде текста.
Указание. Драйвер передает в вызывающую программу значение из CMOS, а именно из байта по смещению 10h - наличие и тип дисководов A: (старшая 16-ричная цифра) и B: (младшая). Значения:
Вывести номер одного из разделов жесткого диска (IOCTL_DISK_GET_PARTITION_INFO_EX)
Механизмы взаимодействия драйвера режима ядра и пользовательского приложения: многослойная драйверная архитектура, алгоритм сокрытия данных, взаимодействие драйвера и приложения, пользовательский интерфейс программы фильтрации доступа к файлам. курсовая работа [1023,3 K], добавлен 23.06.2009
Архитектура ввода/вывода Windows NT. Внутренняя организация шины USB. Сущностная характеристика драйверной модели WDM. Точки входа разрабатываемого драйвера, размещение кода в памяти, установка драйвера в системе. Реализация кода драйвера на языке C. курсовая работа [1,2 M], добавлен 27.09.2014
Структура режима пользователя, предоставляющего возможность пользователю вступать во взаимодействие с системой. Описание режима ядра, который обеспечивает безопасное выполнение приложений (программ) пользователя. Уровень аппаратных абстракций Windows NT. презентация [29,6 K], добавлен 23.10.2013
Ядро Windows 98. Роль 16-разрядных модулей ядра. Проблемы быстродействия. Кооперативная и вытесняющая многозадачность. Улучшенное использование ресурсов в Windows 98. Использование WordArt. Программа MS Outlook Express: создание и отправка сообщений. контрольная работа [120,4 K], добавлен 14.04.2005
Совместное функционирование всех устройств компьютера и доступ к его ресурсам. Понятие и функции графической операционной системы Windows. Справочная служба Windows. Управление файловой системой. Технология "Plug and Play". Графический интерфейс Windows. контрольная работа [22,2 K], добавлен 22.01.2011
Характеристика операционной системы. История развития Windows. Сравнительная характеристика версий Windows. Элементы и инструменты Windows XP. Прикладные программы в Windows XP. Работа настольных и портативных компьютеров под управлением Windows. доклад [19,1 K], добавлен 16.10.2011
Использование драйвера режима ядра и управляющего приложения для создания системных потоков. Имитация обработки данных и организация задержек. Разработка драйвера на языке C++. Конфигурация тестового стенда. Точность изменения задержек и работы таймера. курсовая работа [182,4 K], добавлен 24.06.2009
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2021



Драйвера ядра Windows курсовая работа. Программирование, компьютеры и кибернетика.
Учебное пособие: Моделювання технологічних процесів в рибництві
Курсовая работа по теме Программно управляемый генератор сигнала типа 'меандр' сверхнизкой частоты на микроконтроллере
Реферат: Общие представления о языке Java 5
Эссе Мое Отношение К Брендам
Курсовая работа по теме Анализ, формирование и реализация стратегической ситуации
Сочинение По Произведению Солнечный Удар
Текст Соседи Контрольная Работа
Бизнес План Проекта Курсовая Работа
Курсовая Волжская Булгария В 10 13 Веках
Реферат: Geronimo Essay Research Paper GeronimoGeronimo
Курсовая работа: Удовлетворенность жизнью в старости
Курсовая Работа На Тему Разработка Технологического Процесса По Изготовлению Женской Сумки
Курсовая работа по теме Выявление фальсификации плодово-ягодных консервов для детского питания
Реферат по теме Мировоззренчесское значение мифа о вечном возвращении
Как Писать Эссе План И Пример
Сочинение Про Осень 5 Класс Кратко
Реферат по теме Педагогика сотрудничества
Как Писать Сочинение Рассуждение 9.1 Примеры
Реферат На Тему Некоторые Аспекты Взаимоотношений России И Европейского Союза
Реферат: Система USB
Джон Рид. "10 дней, которые потрясли мир" - История и исторические личности презентация
Заключительная стадия аудиторской проверки на примере ООО "Интек" - Бухгалтерский учет и аудит курсовая работа
Роль тренинга в управлении персоналом - Менеджмент и трудовые отношения курсовая работа


Report Page