IRP_MJ_READ (драйверы FS и фильтров)

При отправке

Диспетчер ввода-вывода или драйвер файловой системы отправляет запрос IRP_MJ_READ. Этот запрос может быть отправлен, например, если приложение пользовательского режима вызывает функцию Win32, например ReadFile, или компонент режима ядра вызывает ZwReadFile.

Операция: драйверы файловой системы

Драйвер файловой системы должен извлечь и декодировать файловый объект для определения параметров и дополнительного кода функции.

Для запросов на чтение списка дескрипторов памяти (MDL) файловая система должна проверка дополнительный код функции, чтобы определить, какая операция запрашивается. Ниже приведены допустимые коды дополнительных функций, которые можно использовать только для кэшированных файловых операций ввода-вывода:

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

Дополнительные сведения об обработке этого IRP см. в примерах CDFS и FASTFAT, включенных в комплект драйверов Windows (WDK).

Операция: устаревшие драйверы фильтров файловой системы

Драйвер фильтра должен выполнять любую необходимую обработку и, в зависимости от характера фильтра, выполнять одно из следующих действий:

  • Завершение или сбой IRP, или
  • Передайте IRP в следующий драйвер в стеке.

Параметры

Файловая система или драйвер фильтра вызывает IoGetCurrentIrpStackLocation для заданного IRP, чтобы получить указатель на собственное расположение стека в IRP. В следующих параметрах Irp указывает на IRP , а IrpSpна IO_STACK_LOCATION. Драйвер может использовать сведения, заданные в следующих элементах IRP и расположении стека IRP для обработки запроса на чтение:

  • DeviceObject — это указатель на целевой объект устройства.

  • Irp->AssociatedIrp.SystemBuffer указывает на предоставленный системой буфер, который будет использоваться в качестве промежуточного системного буфера, если флаг DO_BUFFERED_IO установлен в DeviceObject-Flags>. В противном случае этому элементу присваивается значение NULL.

  • Irp->IoStatus указывает на структуру IO_STATUS_BLOCK , которая получает окончательное состояние завершения и сведения о запрошенной операции. Дополнительные сведения см. в описании параметра IoStatusBlock в ZwReadFile.

  • Irp->MdlAddress — это адрес списка дескрипторов памяти (MDL), описывающего страницы, содержащие данные для чтения.

  • *Irp->UserBuffer указывает на предоставленный вызывающей стороны выходной буфер, который получает данные, считываемые из файла.

  • IrpSp->FileObject указывает на объект файла, связанный с DeviceObject. Если флаг FO_SYNCHRONOUS_IO установлен в IrpSp-FileObject-Flags>, объект файла был открыт для синхронного ввода-вывода>.

    Параметр IrpSp-FileObject> содержит указатель на поле RelatedFileObject, которое также является FILE_OBJECT структурой. Поле RelatedFileObject структуры FILE_OBJECT недопустимо во время обработки IRP_MJ_READ и не должно использоваться.

  • IrpSp->MajorFunction имеет значение IRP_MJ_READ.

  • IrpSp->MinorFunction указывает запрашиваемую операцию и содержит одно из следующих значений:

  • IRP_MN_COMPLETE

  • IRP_MN_COMPLETE_MDL

  • IRP_MN_COMPLETE_MDL_DPC

  • IRP_MN_COMPRESSED

  • IRP_MN_DPC

  • IRP_MN_MDL

  • IRP_MN_MDL_DPC

  • IRP_MN_NORMAL

  • IrpSp->Parameters.Read.ByteOffset — это LARGE_INTEGER переменная, указывающая начальное смещение байтов в файле считываемых данных.

  • IrpSp->Parameters.Read.Key— это значение ключа, связанное с блокировкой диапазона байтов в целевом файле.

  • IrpSp->Parameters.Read.Length — это длина считываемых данных в байтах. Если операция чтения выполнена успешно, число прочитанных байтов возвращается в элементе Informationструктуры IO_STATUS_BLOCK, на которую указывает Irp-IoStatus>.

Комментарии

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

См. также раздел

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ (справочник по ядру WDK)

IRP_MJ_WRITE

ZwReadFile