Функция 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)

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

FsRtlNotifyFilterReportChange

FsRtlNotifyFullChangeDirectory

FsRtlNotifyFullReportChange

IRP_MJ_DIRECTORY_CONTROL

SECURITY_SUBJECT_CONTEXT