ПЗ (1195114)
Текст из файла
3 РАЗРАБОТКА NDIS ДРАЙВЕРА В КАЧЕСТВЕ МЕЖСЕТЕВОГО ЭКРАНА
3.1 Структура драйвера
В качестве основного драйвера был использован пример промежуточного драйвера Passthru из DDK. Этот промежуточный драйвер был разработан так, чтобы расположатся между транспортным драйвером и драйвером сетевой карты(Рисунок 3.1). Единственное что делает этот пример – это получает и передает пакеты от драйвера сетевой карты драйверу транспорта и в обратном направлении/4/.
Рисунок 3.1 – Расположение промежуточного NDIS-драйвера MyFireWall.
Промежуточный драйвер экспортирует на своём верхнем уровне функции MiniportXxx а на нижнем функции ProtocolXxx(Рисунок 3.1).
Для определения функций, в код которых необходимо вставить фильтр пакетов, рассмотрим функции интерфейсов нижнего и верхнего уровня, поддерживаемые средой NDIS, которые участвуют в приёме и отправлении пакетов, и через которые эти пакеты проходят непосредственно/4/:
Отправление:
-
Функция MiniportSendPackets - Она получает несколько указателей на NDIS-пакеты от драйвера транспорта. В этой функции необходимо просмотреть все пакеты и убрать из очереди пакеты не прошедшие фильтрацию;
-
Функция MiniportSend получает по одному NDIS-пакету от драйвера транспорта, требуется в том случае когда драйвер не обеспечивает функцию MiniportSendPackets;
-
Функция ProtocolSendComplete является завершающей для функций MiniportSendPackets и MiniportSend. Она получает в качестве параметра статус завершения операции отправления пакета и описатель отправленного пакета.
Получение:
-
Функция ProtocolReceive получает пакет от драйвера сетевой карты. Она должна скопировать полученный пакет во вновь созданный NDIS-пакет и передать его драйверу транспорта. В этой функции пакеты не прошедшие фильтрацию просто пропускаются;
-
Функция ProtocolReceivePacket является не обязательной функцией и вовлекается в том случае, когда промежуточный драйвер располагается над драйвером сетевой карты, имеющей способность передавать сразу несколько пакетов, полученных из сети. Если такой уверенности нет, то эту функцию можно не регистрировать. Тогда все пакеты будут передаваться через ProtocolReceive.
В моём драйвере фильтрация осуществляется в MiniportSendPackets для отправляемых пакетов и в ProtocolReceive для получаемых пакетов.
3.2 Загрузка и инициализация драйвера
Загрузка любого драйвера в Windows начинается с точки в хода в драйвер DriverEntry, в которой выполняется начальная инициализация драйвера/6/.
При загрузке выполняются следующие действия:
-
Вызывает FireWallInit Которая выполняет начальную настройку моего драйвера;
-
Вызывает NdisMInitializeWrapper которая возвращает NdisWrapperHandle/4/;
-
Вызывает NdisIMRegisterLayeredMiniport, что бы зарегистрировать свои точки входа MiniportXxx/4/;
-
Вызывает NdisRegisterProtocol, что бы зарегистрировать свои точки входа ProtocolXxx/4/;
-
Вызывает NdisIMAssociateMiniport, чтобы иформировать будлиотеку NDIS о том что определённые раньше интерфейсы нижнего и верхнего уровня принадлежат одному и томуже промежуточному драйверу/4/.
Более подробно стоит рассмотреть функцию FireWallInit. Она вызывается самой первой, вследствие чего в ней доступны стандартные функции ядра. Эта функция загружает начальные настройки драйвера, ещё до того как он начнет выполнять свою работу. Для этого она вызывает функцию ReadSettings, которая и загружает данные из файла.
Загрузка осуществляется из файла, который имеет чётко заданную структуру(Рисунок 3.2). Заголовок содержит информацию о хранящихся данных в файле. Поле Sign определяет, действительно ли данный файл является файлом настройки и всегда должно быть равно 0x5746794D (ANSI строка «MyFW»). Следующие два поля (NumPraviloIPTableb и OffsetPraviloIPTable) отвечают за таблицу правил, первое определяет количество правил, а второе за смещение в байтах от начала файла, указывающее, где хранится таблица правил. Следующие четыре поля определяют список имён хостов и список URL. Поля HostTableDataSize и URLTableDataSize соответственно определяют размер списков в байтах. Элементы списка разделяются нулевыми байтами, а сам список заканчивается нулевой строкой. Поля OffsetHostTableData и OffsetURLTableData соответственно определяют смещение списков в байтах от начала файла.
Рисунок 3.2 – Общая структура файла настроек. НБ – нулевой байт.
Такая структура позволяет достаточно просто загружать настройки драйвера и упрощает его написание.
3.3 Механизм передачи информации на уровень пользователя
В ОС Windows невозможно напрямую вызывать функции из драйвера. Для общения программ и драйверов предусмотрена специальная система Пакетов запроса ввода-вывода(I/O Request Packet, IRP).
На пользовательском уровне для обращения к драйверу необходимо, открыть драйвер с помощью функции CreateFile, после чего воспользоваться функцией DeviceIoControl для передачи информации в драйвер. DeviceIoControl в качестве параметров принимает/5/:
-
Код операции – этот код определяет, какая функция в драйвере будет вызвана. Код операции имеет строго определённый формат(Рисунок 3.3). для задания кода используется макрос CNL_CODE(DeviceType, Function, Method, Access), показанный в листинге 3.1. Четыре части макроса служат следующим целям:
-
поле DeviceType — это 16-битный идентификатор типа устройства. В файле ntddk.h перечислен ряд типов устройств, в символьном виде представленных константами FILE_DEVICE_*. Microsoft резервирует диапазон с 0x0000 по 0x7FFF для внутреннего использования, а диапазон 0x8000-0xFFFF доступен для разработчиков. Мой драйвер определяет свой собственный идентификатор устройства и устанавливает его в значение 0x8000;
-
поле Access задает двухбитное значение для проверки возможности доступа, задающее требуемые права доступа для работы IOCTL. Возможны следующие значения: FILE_ANY_ACCESS(0), FILE_READ_ACCESS (1), FILE_WRITE_ACCESS (2) и комбинация двух последних: FILE_READ__ACCESS | FILE_WRITE_ACCESS(3).;
-
поле Function — это 12-битный идентификатор, задающий операцию, которую должно выполнить устройство. Microsoft резервирует значения с 0x000 по 0x7 FF для внутреннего использования и оставляет для разработчиков диапазон 0x800 по 0xFFF. Идентификаторы функций IOCTL, распознаваемые устройством просмотра, берутся из последнего пула номеров;
-
поле Method состоит из двух бит, определяя один из четырех возможных методом передачи ввода-вывода с именами METH0D_BUFFERED(0),METHOD_IN_DIRECT (1), METH0D_OUT_DIRECT (2) и METHOD_NEITHER (3), расположенных в файле ntddk.h. Драйвер слежения для всех запросов использует способ METHOD_BUFFERED, обладающий высокой безопасностью, но и весьма медлительный, поскольку данные копируются из системного буфера в клиентский и обратно.
Листинг 3.1. Макроопределение CTL_CODE(), генерирующее управляющие коды ввода-вывода
#define CTL_C0DE(DeviceType, Function, Method, Access) \
(((DeviceType) « 16) | ((Access) « 14) | \
((Function) « 2) | (Method))
Рисунок 3.3 – Схема управляющего кода устройства ввода-вывода.
-
входящий буфер указывает на данные которые будут переданы в драйвер, также необходимо передать размер этого буфера;
-
выходящий буфер указывает на данные которые будут переданы из драйвер, также необходимо передать размер этого буфера;
-
функция возвратит количество записанных байтов в выходящем буфере.
После того как закончится работа с драйвером необходимо закрыть указатель на драйвер с помощью функции CloseFile.
На уровне ядра в драйвере установлен обработчик запросов ввода-вывода DeviceIOCTRL, который извлекает по одному запросу из стека, определяет код операции и вызывает соответствующие обработчики, которые приведены в таблице 3.1.
Таблица 3.1 - Функции IOCTRL реализованные в драйвере.
| № | Имя функции | ID | Код IOCTL | Описание |
| 1 | MY_ICTRL_GetLog | 10 | 0x80002028 | Получение информации об уже обработаных сетевых пакетах. |
| 2 | MY_ICTRL_WriteTablePravilo | 11 | 0x8000202C | Запись в таблицу правил драйвера. |
| 3 | MY_ICTRL_ReadTablePravilo | 12 | 0x80002030 | Чтение из таблицы правил драйвера. |
| 4 | MY_ICTRL_WriteTableHTTPHost | 14 | 0x80002038 | Запись списка запрещённых хостов. |
| 5 | MY_ICTRL_WriteTableHTTPURL | 16 | 0x80002040 | Запись списка запрещённых имён файлов. |
| 6 | MY_ICTRL_GetQueryPacket | 100 | 0x80002190 | Получение ожидающих пакетов. |
| 7 | MY_ICTRL_GetQP_PacketDataSize | 101 | 0x80002194 | Получение размера пакета. |
| 8 | MY_ICTRL_GetQP_PacketData | 102 | 0x80002198 | Получение всего пакета. |
| 9 | MY_ICTRL_QP_PacketDel | 104 | 0x800021A0 | Уделение ожидающего пакета. |
| 10 | MY_ICTRL_GetVersion | 0 | 0x80002000 | Получение строки с версией драйвера |
Эти функции стоит рассмотреть более подробно:
Функция IOCTL MY_ICTRL_GetLog предназначена для передачи на уровень пользователя информацию об обработанных пакетах в драйвере. За один вызов передаётся информация об одном пакете.
Она передаёт на уровень пользователя следующею информацию:
-
действие, которое предпринял драйвер к данному пакету;
-
направление, в которое был направлен пакет;
-
правило, которое было использовано;
-
заголовок IP пакета;
-
заголовок TCP или UDP пакета в зависимости от типа пакета;
-
системное время, когда был обработан пакет.
После передачи пакета данная информация удаляется из памяти драйвера
Информация предаётся через выходящий буфер. Для подтверждения правильности передаётся размер переданных данных.
Функция IOCTL MY_ICTRL_WriteTablePravilo используется для записи правил в драйвер. Она передаёт сразу всю таблицу правил, которая замещает уже имеющиеся таблицу. Количество элементов определяется путём деления размера переданной информации на размер одного правила, если деление произошло с остатком, то драйвер игнорирует это действие как ошибочное.
В каждом правиле определяется, по каким критериям происходит проверка:
-
направление;
-
локальный IP адрес;
-
удалённый IP адрес;
-
локальный порт;
-
удалённый порт;
-
протокол используемый в пакете.
А также действие, которое необходимо предпринять при совпадении критериев.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















