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