1.5 Пакет запроса ввода / вывода (IRP)

Пакеты ввода / вывода (IRP‑пакеты) используются для передачи запросов к драйверу от его клиентов. Они являются структурами данных переменной длины, и состоят из стандартного заголовка, содержащего общую учетную информацию, и одного или нескольких блоков параметров, называемых ячейками стека ввода / вывода (I/O Stack Location).

Приведем структуру заголовка IRP‑пакета:

Таблица 1.5.1. Структура заголовка IRP‑пакета.

Поля

Описание

IO_STATUS_BLOCK IoStatus Статус запроса
PVOID AssociatedIrp. SystemBuffer Указатель на системный буфер для случая, если устройство поддерживает буферизованный ввод / вывод
PMDL MdlAddress Указатель на MDL‑список в случае, если устройство поддерживает прямой ввод / вывод
PVOID UserBuffer Адрес пользовательского буфера для ввода / вывода
BOOLEAN Cancel Индикатор того, что IRP‑пакет должен быть аннулирован

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

Таблица 1.5.2. Структура ячейки стека ввода / вывода

Поля

Описание

UCHAR MajorFunction Код IRP_MJ_XXX, описывающий назначение операции
UCHAR MinorFunction Субкод операции
PDEVICE_OBJECT DeviceObject Указатель на объект устройства, которому был адресован данный объект IRP
PFILE_OBJECT FileObject Файловый объект для данного запроса, если он задан
union Parameters (трактовка определяется значением MajorFunction)
struct Read

Параметры для IRP типа IRP_MJ_READ:

ULONG Length

ULONG Key

LARGE_INTEGER ByteOffset

struct Write

Параметры для IRP типа IRP_MJ_WRITE:

ULONG Length

ULONG Key

LARGE_INTEGER ByteOffset

struct DeviceControl

Параметры для IRP типа IRP_MJ_DEVICE_CONTROL:

ULONG OutputBufferLength

ULONG InputBufferLength

ULONG IoControlCode

PVOID Type3InputBuffer

Приведем графическое представление структуры IRP‑пакета:


Рис. 1.5.1 Структура IRP пакета

Общение с USB‑накопителями в ОС Windows NT 5 на уровне драйверов, как уже было сказано в разделе 1.3.1, происходит посредством передачи URB‑пакетов. Указатели на URB‑пакеты содержат ячейки стека IRP‑пакета, доступ к этим указателям осуществляется следующим образом:

PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);

PURB Urb = IrpSp->Parameters. Others. Argument1;

Приведем частичное объявление структуры из справочной документации Microsoft. Отметим только поля, использование которых необходимо в рамках данной курсовой работы:

typedef struct _URB {

union {

struct _URB_HEADER UrbHeader;

struct _URB_SELECT_INTERFACE UrbSelectInterface;

struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration;

struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer;

}

} URB, *PURB;

Поле UrbHeader хранит информацию о коде URB‑пакета, по которому можно определить, какая операция запрашивается.

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

Поле UrbBulkOrInterruptTransfer несет наиболее важную в рамках данной курсовой работы информацию – указатели на блоки ввода / вывода USB‑устройства. Приведем описание структуры _URB_BULK_OR_INTERRUPT_TRANSFER:

struct _URB_BULK_OR_INTERRUPT_TRANSFER {

struct _URB_HEADER Hdr;

USBD_PIPE_HANDLE PipeHandle;

ULONG TransferFlags;

ULONG TransferBufferLength;

PVOID TransferBuffer;

PMDL TransferBufferMDL;};

Поля этой структуры описаны в следующей таблице:

Таблица 1.5.3 Поля структуры URB_BULK_OR_INTERRUPT_TRANSFER

Поле

Описание

struct _URB_HEADER Hdr Стандартный заголовок URB‑пакета, содержащий код запроса
USBD_PIPE_HANDLE PipeHandle Дескриптор канала, на который передаются данные
ULONG TransferFlags Флаги, определяющие направление передачи данных и способ обработки ошибок
ULONG TransferBufferLength Длина передаваемого блока данных в байтах
PVOID TransferBuffer Указатель на передаваемый буфер. Буфер находится в нестраничной памяти
PMDL TransferBufferMDL Указатель на MDL‑список, несущий передаваемую информацию. Буфер находится в страничной памяти

Следует отметить, что один из указателей TransferBuffer или TransferBufferMDL равен NULL, то есть в пределах одного пакета передается только одна порция данных.

Задача протоколирования обмена информацией сводится к перехвату и сохранению буферов TransferBuffer и TransferBufferMDL.


Информация о работе «Протоколирование обмена информацией между компьютером и внешним запоминающим USB-устройством»
Раздел: Информатика, программирование
Количество знаков с пробелами: 58963
Количество таблиц: 10
Количество изображений: 6

Похожие работы

Скачать
79890
1
0

... системы и их особенностями в целом, мы разобрались, теперь самое время приступить к более детальному, конкретному рассмотрению многообразия ОС, которое обычно начинается с рассмотрения краткой истории появления и развития. Операционная система Unix Считается, что в появлении Юникса в частности виновата... компьютерная игра. Дело в том, что Кен Томпсон непонятно чего ради создал игрушку «Space ...

0 комментариев


Наверх