Поделиться через


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

При отправке

Диспетчер ввода-вывода, другие компоненты операционной системы и другие драйверы, работающие в режиме ядра, отправляют запросы IRP_MJ_DIRECTORY_CONTROL. Его можно отправить, например, если приложение пользовательского режима вызывает функцию Win32, например ReadDirectoryChangesW или FindNextVolumeMountPoint , или если компонент режима ядра вызывает ZwQueryDirectoryFile или ZwQueryDirectoryFileEx.

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

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

Код Описание
IRP_MN_QUERY_DIRECTORY Указывает запрос на запрос каталога. Типы сведений, которые можно запрашивать, зависят от файловой системы, но обычно включают следующие значения: FileBothDirectoryInformation, FileDirectoryInformation, FileFullDirectoryInformation, FileIdBothDirectoryInformation, FileIdFullDirectoryInformation, FileNamesInformation, FileObjectIdInformation, FileReparsePointInformation.
IRP_MN_NOTIFY_CHANGE_DIRECTORY Указывает запрос на уведомление об изменениях в каталоге. Как правило, вместо немедленного удовлетворения этого запроса драйвер файловой системы сохраняет IRP в частной очереди. Когда происходит изменение каталога, драйвер файловой системы выполняет уведомление, а также удаляет и завершает IRP. Драйвер файловой системы возвращает сведения в структуре FILE_NOTIFY_INFORMATION .
IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX Указывает запрос на уведомление об изменениях в каталоге. Как правило, вместо немедленного удовлетворения этого запроса драйвер файловой системы сохраняет IRP в частной очереди. Когда происходит изменение каталога, драйвер файловой системы выполняет уведомление, а также удаляет и завершает IRP. Драйвер файловой системы возвращает сведения на основе указанного IrpSp-Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass>.

Примечание

Информационный класс FileQuotaInformation устарел. Вместо этого следует использовать IRP_MJ_QUERY_QUOTA.

Драйвер файловой системы должен завершить IRP после выполнения запрошенной операции.

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

Драйвер фильтра должен передать этот IRP в следующий нижний драйвер в стеке.

Параметры

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

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

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

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

  • IrpSp->FileObject указывает на объект файла, связанный с DeviceObject.

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

  • IrpSp->Флагам можно задать одно или несколько следующих значений для IRP_MN_QUERY_DIRECTORY.

Flag Значение
SL_INDEX_SPECIFIED Начните сканирование с записи в каталоге, индекс которого задается IrpSp-Parameters.QueryDirectory.FileIndex>.
SL_RESTART_SCAN Начните проверку с первой записи в каталоге. Если этот флаг не задан, возобновите проверку из предыдущего запроса IRP_MN_QUERY_DIRECTORY.
SL_RETURN_SINGLE_ENTRY Возвращает только первую найденную запись.
SL_RETURN_ON_DISK_ENTRIES_ONLY Предписывает всем фильтрам, выполняющим виртуализацию каталогов или JIT-расширение, просто передавать запрос в файловую систему и возвращать записи, которые в настоящее время находятся на диске.

Для IRP_MN_NOTIFY_CHANGE_DIRECTORY можно задать следующий флаг:

Flag Значение
SL_WATCH_TREE Установите значение TRUE , если все подкаталоги этого каталога также должны отслеживаться. Установите значение FALSE , если необходимо отслеживать только сам каталог.
  • IrpSp->MajorFunction имеет значение IRP_MJ_DIRECTORY_CONTROL.

  • IrpSp->MinorFunction можно задать для одного из следующих значений.

    • IRP_MN_QUERY_DIRECTORY
    • IRP_MN_NOTIFY_CHANGE_DIRECTORY
    • IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX
  • IrpSp->Parameters.QueryDirectory.FileIndex — это индекс файла, с которого начинается сканирование каталога. Если флаг SL_INDEX_SPECIFIED не установлен, это значение игнорируется. Этот параметр не может быть указан ни в одной функции Win32 или подпрограмме поддержки режима ядра. В настоящее время он используется только виртуальной машиной NT DOS (NTVDM), которая существует только на 32-разрядных платформах на основе NT. Индекс файла не определен для файловых систем, таких как NTFS, в которых положение файла в родительском каталоге не является фиксированным и может быть изменено в любое время для поддержания порядка сортировки.

  • IrpSp->Параметр Parameters.QueryDirectory.FileInformationClass имеет одно из следующих значений.

    Значение Значение
    FileBothDirectoryInformation Возвращает структуру FILE_BOTH_DIR_INFORMATION для каждого файла.
    FileDirectoryInformation Возвращает структуру FILE_DIRECTORY_INFORMATION для каждого файла.
    FileFullDirectoryInformation Возвращает структуру FILE_FULL_DIR_INFORMATION для каждого файла.
    FileIdBothDirectoryInformation Возвращает структуру FILE_ID_BOTH_DIR_INFORMATION для каждого файла.
    FileIdFullDirectoryInformation Возвращает FILE_ID_FULL_DIR_INFORMATION структуру для каждого файла.
    FileNamesInformation Возвращает структуру FILE_NAMES_INFORMATION для каждого файла.
    FileObjectIdInformation Возвращает структуру FILE_OBJECTID_INFORMATION для каждого файла.
    FileQuotaInformation Является устаревшей. Вместо этого используйте IRP_MJ_QUERY_QUOTA .
    FileReparsePointInformation Возвращает одну структуру FILE_REPARSE_POINT_INFORMATION для каталога.
  • IrpSp->Parameters.QueryDirectory.FileName — необязательное имя файла в указанном каталоге.

  • IrpSp->Parameters.QueryDirectory.Length — это длина буфера в байтах, на который указывает Irp-UserBuffer>.

  • IrpSp->Parameters.NotifyDirectory.Length — это длина буфера, на который указывает Irp-UserBuffer>, в байтах.

  • IrpSp->Parameters.NotifyDirectory.CompletionFilter. Дополнительные сведения см. в описании параметра CompletionFilter для FsRtlNotifyFullChangeDirectory.

  • IrpSp->Parameters.NotifyDirectoryEx.Length — это длина буфера, на который указывает Irp-UserBuffer>, в байтах.

  • IrpSp->Parameters.NotifyDirectoryEx.CompletionFilter. Дополнительные сведения см. в описании параметра CompletionFilter для FsRtlNotifyFullChangeDirectory.

  • IrpSp->Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass — это одно из следующих значений.

    Значение Значение
    DirectoryNotifyInformation Возвращает FILE_NOTIFY_INFORMATION структуру для изменения каталога.
    DirectoryNotifyExtendedInformation Возвращает FILE_NOTIFY_EXTENDED_INFORMATION структуру для каждого изменения каталога.
    DirectoryNotifyFullInformation Возвращает FILE_NOTIFY_FULL_INFORMATION структуру для каждого изменения каталога.

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

FILE_BOTH_DIR_INFORMATION

FILE_DIRECTORY_INFORMATION

FILE_FULL_DIR_INFORMATION

FILE_ID_BOTH_DIR_INFORMATION

FILE_ID_FULL_DIR_INFORMATION

FILE_NAMES_INFORMATION

FILE_OBJECTID_INFORMATION

FILE_REPARSE_POINT_INFORMATION

FsRtlNotifyFullChangeDirectory

FILE_NOTIFY_INFORMATION

FILE_NOTIFY_EXTENDED_INFORMATION

FILE_NOTIFY_FULL_INFORMATION

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_QUERY_QUOTA

ZwQueryDirectoryFile

ZwQueryDirectoryFileEx