Диссертация Кочарян С.Г — копия (1195360), страница 4
Текст из файла (страница 4)
Мой драйвер определяет свойсобственный идентификатор устройства и устанавливает его в значение0x8000;поле Access задает двухбитное значение для проверки возможностидоступа, задающее требуемые права доступа для работы IOCTL. Возможныследующиезначения:FILE_WRITE_ACCESSFILE_ANY_ACCESS,FILE_READ_ACCESSидвухкомбинацияпоследних:FILE_READ__ACCESS | FILE_WRITE_ACCESS;поле Function — это 12-битный идентификатор, задающий операцию,которую должно выполнить устройство. Microsoft резервирует значения с0x000 по 0x7 FF для внутреннего использования и оставляет дляразработчиков диапазон 0x800 по 0xFFF.
Идентификаторы функций IOCTL,распознаваемые устройством просмотра, берутся из последнего пула номеров;25поле Method состоит из двух бит, определяя один из четырех возможныхметодом передачи ввода-вывода с именами METH0D_BUFFERED(0),METHOD_IN_DIRECT(1),METH0D_OUT_DIRECT(2)иMETHOD_NEITHER (3), расположенных в файле ntddk.h. Драйвер слежениядля всех запросов использует способ METHOD_BUFFERED, обладающийвысокой безопасностью, но и весьма медлительный, поскольку данныекопируются из системного буфера в клиентский и обратно.Макроопределение CTL_CODE(), генерирующее управляющие кодыввода-вывода:#define CTL_C0DE(DeviceType, Function, Method, Access) \(((DeviceType) « 16) | ((Access) « 14) | \((Function) « 2) | (Method))На рисунке 3.4 показана схема управляющего кода устройства вводавывода.3116 15 14 13Тип устройстваДоступ2 1 0ФункцияМетодРисунок 3.4 – Схема управляющего кода устройства ввода-выводаБ) входящий буфер указывает на данные которые будут переданы вдрайвер, также необходимо передать размер этого буфера;В) выходящий буфер указывает на данные которые будут переданы издрайвера, также необходимо передать размер этого буфера;Г) функция возвратит количество записанных байтов в выходящем буфере.После того как закончится работа с драйвером необходимо закрытьуказатель на драйвер с помощью функции CloseFile.На уровне ядра в драйвере установлен обработчик запросов ввода-выводаDeviceIOCTRL, который извлекает по одному запросу из стека, определяет кодоперации и вызывает соответствующие обработчики, которые приведены втаблице 3.1.26Таблица 3.1 – Функции IOCTRL реализованные в драйвереИмя функцииIDКодОписаниеIOCTLMY_ICTRL_GetLog100x80002028Получениеинформацииобобработаныхужесетевыхпакетах.MY_ICTRL_WriteTable11PraviloMY_ICTRL_ReadTableP00202C12raviloMY_ICTRL_WriteTable0x8000203014HTTPHostMY_ICTRL_WriteTable0x800x8000203816HTTPURL0x80002040Записьвтаблицуправил драйвера.Чтение из таблицыправил драйвера.Записьсписказапрещённых хостов.Записьсписказапрещённыхимёнфайлов.MY_ICTRL_GetQueryPa100cketMY_ICTRL_GetQP_Pac002190101ketDataSizeMY_ICTRL_GetQP_Pac0x80002194102ketDataMY_ICTRL_QP_Packet0x800x80002198104Del0x800021A0MY_ICTRL_GetVersion00x80002000Получениеожидающих пакетов.Получениеразмерапакета.Получениевсегопакета.Уделениеожидающего пакета.Получение строки сверсией драйвера27Эти функции стоит рассмотреть более подробно.Функция IOCTL MY_ICTRL_GetLog предназначена для передачи науровень пользователя информацию об обработанных пакетах в драйвере.
Заодин вызов передаётся информация об одном пакете.Она передаёт на уровень пользователя следующею информацию:действие, которое предпринял драйвер к данному пакету;направление, в которое был направлен пакет;правило, которое было использовано;– заголовок IP пакета;– заголовок TCP или UDP пакета в зависимости от типа пакета;– системное время, когда был обработан пакет.После передачи пакета данная информация удаляется из памяти драйвераИнформация предаётся через выходящий буфер. Для подтвержденияправильности передаётся размер переданных данных.Функция IOCTL MY_ICTRL_WriteTablePravilo используется для записиправил в драйвер.
Она передаёт сразу всю таблицу правил, которая замещаетуже имеющиеся таблицу. Количество элементов определяется путём деленияразмера переданной информации на размер одного правила, если делениепроизошло с остатком, то драйвер игнорирует это действие как ошибочное.В каждом правиле определяется, по каким критериям происходитпроверка:– направление;– локальный IP адрес;– удалённый IP адрес;– локальный порт;– удалённый порт;протокол используемый в пакете.А также действие, которое необходимо предпринять при совпадениикритериев.28Информация предаётся через входящий буфер. Для проверки необходимовоспользоваться функцией IOCTL MY_ICTRL_ReadTablePravilo.Также эта функция вызывает функцию WriteSettings для того, чтобысохранить произведённые изменения в настройках в файл.Функция IOCTL MY_ICTRL_ReadTablePravilo используется для чтенияправил из драйвера.
Она передаёт сразу всю таблицу правил. Количествоэлементов определяется путём деления размера переданной информации наразмер одного правила, если деление произошло с остатком, то это действиеошибочное.Функция IOCTL MY_ICTRL_WriteTableHTTPHost используется дляпередачи списка запрещённых имён хостов. Список представляет собой наборстрок заканчивающихся нулём. Сам список заканчивается пустой строкой.Также необходимо передать полный размер списка.Также эта функция вызывает фукцию WriteSettings для того, чтобысохранить произведённые изменения в настройках в файл.Функция IOCTL MY_ICTRL_WriteTableHTTPURL используется дляпередачи списка запрещённых имён файлов. Список представляет собой наборстрок, заканчивающихся нулём.
Сам список заканчивается пустой строкой.Также необходимо передать полный размер списка.Также эта функция вызывает фукцию WriteSettings для того, чтобысохранить произведённые изменения в настройках в файл.ФункцияIOCTLMY_ICTRL_GetQueryPacketреализуетмеханизмпередачи пакетов на уровень пользователя. Для этого необходимо создатьправило, в котором действие обозначается как «Запрос».
Все пакеты,подпадающие под это, правило помещаются в специальную очередь и получатидентификатор.После вызова этой функции, пакет помещается в очередь ожидающихпакетов, где к нему можно обратится, используя одну из следующих функций:MY_ICTRL_GetQP_PacketDataSize,MY_ICTRL_GetQP_PacketDataиMY_ICTRL_QP_PacketDel.29Данная функция передаёт на уровень пользователя Идентификатор, времяпоступления пакета и направление пакета.Функция IOCTL MY_ICTRL_GetQP_PacketDataSize передаёт размер всегопакета для определения, какого именно пакета в функцию передаётсяидентификатор пакета.
Данную функцию необходимо вызывать передполучением пакета с помощю функции MY_ICTRL_GetQP_PacketData дляопределения размера пакета.Функция IOCTL MY_ICTRL_GetQP_PacketData передаёт содержимоепакета на уровень пользователя для определения, какого именно пакета вфункцию передаётся идентификатор пакета. Пакет передаётся полностьювместе Ethernet заголовком, IP заголовком, TCP/UDP заголовком исодержимым пакета.Функция IOCTL MY_ICTRL_QP_PacketDel используется для удаленияпакета из очереди ожидания.304 Структура inf- файлаИнсталляционный inf-файл является текстовым файлом, поставляемымвместесдрайвернымпрограммнымобеспечениемиаппаратнымобеспечением, соответственно.В операционных системах Windows 9x/Me размер inf-файл не можетпревосходить 64 килобайта.
Для NT систем ограничений нет. Если не указаноиначе для конкретного типа ОС, то максимальная длина любого поля в infфайле составляет 512 символов.4.1 Секции inf-файла и основные общие правила ввода записейИнсталляционный inf-файл поделен на секции, каждая из которыхначинается с идентификатора (имени секции), заключенного в квадратныескобки. Часть секций является обязательной, присутствие других секцийзависит от назначения драйвера.Записи внутри каждой секции описывают действия по инсталляции, либоссылаются на другие секции.
Записи, которые регламентированы для секцийопределенного типа (обязательные или нет), в литературе и в документацииDDK часто называются директивами.Весь текст, введенный в inf-файле, не различается в смысле регистрасимволов – все имена секций и записи могут быть введены и в верхнем, и внижнем регистре. Поэтому слова version, VERSION и Version являютсяидентичными для процесса установки. Текст не должен содержать символовтабуляции и других невидимых управляющих символов.Символ "точка с запятой" означает начало комментариев в следующей (заточкой с запятой) позиции, которые продолжаются до конца строки.Комментарии не принимаются в рассмотрении при анализе inf-файла.
Данное31правило не действует только в том случае, если такой текстовый фрагмент(содержащий точку с запятой) заключен в кавычки.Строка, содержащая только символы возврата каретки и перевода строки,считаетсяпустойиигнорируется.Еслисуществуетнеобходимостьпродолжить запись на следующей строке, то в последней позиции текущейстроки следует ввести обратный слэш \.Порядок следования секций в файле не играет роли, важно лишь, чтобысекции носили корректные имена и были правильно соотнесены вперекрестных ссылках.
(Правда, сами разработчики придерживаютсянекоторых правил, например, секция [Strings] вводится обычно последней.)Секция продолжается до объявления начала следующей секции, либо дообнаружения конца файла. Имя секции должно быть уникальным для данногоinf-файла. Хотя в некоторых источниках указывается, что содержимое секций,имеющиеодинаковыеимена,системноепрограммноеобеспечение,занимающееся интерпретацией inf-файла, объединяет, тем не менее, практикапоказывает, что это не так.