Функция FsRtlNotifyFilterChangeDirectory (ntifs.h)
FsRtlNotifyFilterChangeDirectory создает структуру уведомлений для запроса IRP_MN_NOTIFY_CHANGE_DIRECTORY и добавляет ее в указанный список уведомлений.
Синтаксис
void FsRtlNotifyFilterChangeDirectory(
[in] PNOTIFY_SYNC NotifySync,
[in] PLIST_ENTRY NotifyList,
[in] PVOID FsContext,
[in] PSTRING FullDirectoryName,
[in] BOOLEAN WatchTree,
[in] BOOLEAN IgnoreBuffer,
[in] ULONG CompletionFilter,
[in, optional] PIRP NotifyIrp,
[in, optional] PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback,
[in, optional] PSECURITY_SUBJECT_CONTEXT SubjectContext,
[in, optional] PFILTER_REPORT_CHANGE FilterCallback
);
Параметры
[in] NotifySync
Указатель на непрозрачный объект синхронизации для списка уведомлений об изменениях каталога, на который указывает параметр NotifyList .
[in] NotifyList
Указатель на заголовок списка уведомлений каталога изменений для текущего тома. Каждый элемент в списке является непрозрачной структурой уведомления.
[in] FsContext
Указатель на уникальное значение, присвоенное файловой системой для идентификации создаваемой структуры уведомления как принадлежащей определенному объекту файла. Если указана подпрограмма TraverseCallback , FsContext передается в качестве параметра NotifyContext этой подпрограмме.
[in] FullDirectoryName
Указатель на строку ANSI или Юникода, содержащую полное имя каталога, связанного с этой структурой уведомлений. Игнорируется, если NotifyIrp имеет значение NULL.
[in] WatchTree
Установите значение TRUE, если все подкаталоги этого каталога также должны отслеживаться. Установите значение FALSE, если необходимо отслеживать только сам каталог. Игнорируется, если NotifyIrp имеет значение NULL.
[in] IgnoreBuffer
Задайте значение TRUE, чтобы игнорировать любые пользовательские буферы и принудительно переумеровать каталог. Это действие ускоряет операцию. Игнорируется, если NotifyIrp имеет значение NULL.
[in] CompletionFilter
Битовая маска флагов, указывающих типы изменений в файлах или каталогах, которые должны привести к завершению IRP в списке уведомлений. В следующей таблице описаны возможные значения флагов.
Flag | Значение |
---|---|
FILE_NOTIFY_CHANGE_FILE_NAME (0x0001) | Файл был добавлен, удален или переименован в этом каталоге. |
FILE_NOTIFY_CHANGE_DIR_NAME (0x0002) | Подкаталог был создан, удален или переименован. |
FILE_NOTIFY_CHANGE_NAME (0x0003) | Имя этого каталога изменилось. |
FILE_NOTIFY_CHANGE_ATTRIBUTES (0x0004) | Значение атрибута этого файла, например время последнего доступа, изменилось. |
FILE_NOTIFY_CHANGE_SIZE (0x0008) | Размер этого файла изменился. |
FILE_NOTIFY_CHANGE_LAST_WRITE (0x0010) | Время последнего изменения этого файла изменилось. |
FILE_NOTIFY_CHANGE_LAST_ACCESS (0x0020) | Время последнего доступа к этому файлу изменилось. |
FILE_NOTIFY_CHANGE_CREATION (0x0040) | Время создания этого файла изменилось. |
FILE_NOTIFY_CHANGE_EA (0x0080) | Расширенные атрибуты этого файла были изменены. |
FILE_NOTIFY_CHANGE_SECURITY (0x0100) | Сведения о безопасности этого файла изменились. |
FILE_NOTIFY_CHANGE_STREAM_NAME (0x0200) | Файловый поток добавлен, удален или переименован в этом каталоге. |
FILE_NOTIFY_CHANGE_STREAM_SIZE (0x0400) | Размер этого файлового потока изменился. |
FILE_NOTIFY_CHANGE_STREAM_WRITE (0x0800) | Данные этого потока файлов изменились. |
CompletionFilter игнорируется, если NotifyIrp имеет значение NULL.
[in, optional] NotifyIrp
Указатель на IRP, добавляемый в список уведомлений. Если notifyIrp имеет значение NULL, это означает, что файловый поток, представленный объектом файла (идентифицируемый параметром FsContext ), удаляется.
[in, optional] TraverseCallback
Необязательный указатель на подпрограмму обратного вызова, вызываемую при изменении в подкаталоге, отслеживаемом в дереве каталогов. Это позволяет файловой системе проверка, имеет ли наблюдатель доступ к этому каталогу. Такая подпрограмма, предоставляемая вызывающим абонентом, объявляется следующим образом:
NTSTATUS
(*PCHECK_FOR_TRAVERSE_ACCESS) (
IN PVOID NotifyContext, // FsContext
IN PVOID TargetContext, // Context pointer
IN PSECURITY_SUBJECT_CONTEXT SubjectContext // SubjectContext
);
Дополнительные сведения о параметре TargetContext см. в разделе Параметр TargetContextпараметра FsRtlNotifyFullReportChange. Параметр TraverseCallback игнорируется, если NotifyIrp имеет значение NULL.
[in, optional] SubjectContext
Указатель на SECURITY_SUBJECT_CONTEXT структуру, передаваемую в TraverseCallback. FsRtlNotifyFilterChangeDirectory освобождает контекст и освобождает структуру после его использования. Этот параметр игнорируется, если NotifyIrp имеет значение NULL. Если указана подпрограмма TraverseCallback , subjectContext передается в качестве параметра SubjectContext в эту подпрограмму.
[in, optional] FilterCallback
Необязательный указатель на подпрограмму обратного вызова, вызываемую при изменении каталога. Если эта подпрограмма обратного вызова возвращает значение TRUE, FsRtlNotifyFilterReportChange завершает ожидающие IRP_MN_NOTIFY_CHANGE_DIRECTORY запросы в списке уведомлений; в противном случае — нет. Такая подпрограмма, предоставляемая вызывающим абонентом, объявляется следующим образом:
BOOLEAN
(*PFILTER_REPORT_CHANGE) (
IN PVOID NotifyContext, // FsContext
IN PVOID FilterContext // Context pointer
);
Возвращаемое значение
None
Remarks
FsRtlNotifyFilterChangeDirectory вызывается файловой системой, которая получила IRP с основным кодом функции IRP_MJ_DIRECTORY_CONTROL, дополнительным кодом функции IRP_MN_NOTIFY_CHANGE_DIRECTORY.
Файловая система вызывает FsRtlNotifyFilterChangeDirectory , чтобы создать структуру уведомлений для хранения IRP и добавить структуру уведомления в список уведомлений для текущего тома.
Если параметр NotifyIrp имеет значение NULL, функция FsRtlNotifyFilterChangeDirectory проверяет, содержит ли список уведомлений ожидающие irP, объекты файлов которых соответствуют заданному значению FsContext , и, если да, завершает irps с STATUS_DELETE_PENDING.
Если notifyIrp не равно NULL, FsRtlNotifyFilterChangeDirectory выполняет следующие действия:
Проверяет, прошел ли очистку объект файла IRP. В этом случае FsRtlNotifyFilterChangeDirectory завершает IRP с состоянием STATUS_NOTIFY_CLEANUP и не добавляет его в список уведомлений.
Если объект файла IRP не прошел очистку, FsRtlNotifyFilterChangeDirectory проверяет, содержит ли список уведомлений структуру уведомлений для заданного значения FsContext . Если такая структура уведомлений найдена и в отчете есть ожидающие изменения, FsRtlNotifyFilterChangeDirectory завершает NotifyIrp. Если структура уведомлений найдена, но в отчете отсутствуют ожидающие изменения, FsRtlNotifyFilterChangeDirectory помечает IRP, на который указывает NotifyIrp , как ожидающее, и вставляет его в список поставщиков уведомлений в структуре уведомлений. Если такая структура уведомлений не найдена, FsRtlNotifyFilterChangeDirectory помечает IRP, на которую указывает NotifyIrp , как ожидающее, создает структуру уведомления и вставляет ее в список уведомлений.
При изменении каталога файловая система вызывает FsRtlNotifyFilterReportChange для выполнения ожидающих IRP_MN_NOTIFY_CHANGE_DIRECTORY запросов в списке уведомлений.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Накопительный пакет обновления Windows 2000 с пакетом обновления 4 (SP4); Windows XP |
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < APC_LEVEL |
Правила соответствия DDI | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по