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_REPARSE_POINT_INFORMATION
FsRtlNotifyFullChangeDirectory
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по