FltNotifyFilterChangeDirectory 函数 (fltkernel.h)

FltNotifyFilterChangeDirectory 例程为IRP_MN_NOTIFY_CHANGE_DIRECTORY作创建通知结构,并将其添加到指定的通知列表中。

语法

VOID FLTAPI FltNotifyFilterChangeDirectory(
  [in, out]      PNOTIFY_SYNC               NotifySync,
  [in, out]      PLIST_ENTRY                NotifyList,
  [in]           PVOID                      FsContext,
  [in]           PSTRING                    FullDirectoryName,
  [in]           BOOLEAN                    WatchTree,
  [in]           BOOLEAN                    IgnoreBuffer,
  [in]           ULONG                      CompletionFilter,
  [in]           PFLT_CALLBACK_DATA         NotifyCallbackData,
  [in, optional] PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback,
  [in, optional] PSECURITY_SUBJECT_CONTEXT  SubjectContext,
  [in, optional] PFILTER_REPORT_CHANGE      FilterCallback
);

参数

[in, out] NotifySync

指向更改目录通知列表的不透明同步对象的指针,NotifyList 参数指向。

[in, out] NotifyList

指向当前卷的更改目录通知列表的头的指针。 列表中的每个元素都是一个不透明的通知结构。

[in] FsContext

指向调用方分配的唯一值的指针,用于标识要创建的通知结构。 如果在 TraverseCallback 参数中提供回调例程,FsContext 作为 NotifyContext 参数传递给该例程。

[in] FullDirectoryName

指向 ANSI 或 Unicode 字符串的指针,该字符串包含与此通知结构关联的目录的完整名称。

[in] WatchTree

如果还应监视由 FullDirectoryName 参数指定的目录的所有子目录,则设置为 TRUE。 如果仅监视目录本身,则设置为 FALSE

[in] IgnoreBuffer

设置为 TRUE 以忽略任何用户缓冲区并强制重新重新登录目录。 此作可加快作速度。

[in] CompletionFilter

标志的位掩码,这些标志指定了对文件或目录的更改类型,这些更改应导致通知列表中的回调数据结构完成。 下表描述了可能的标志值。

意义
FILE_NOTIFY_CHANGE_FILE_NAME 此目录中已添加、删除或重命名文件。
FILE_NOTIFY_CHANGE_DIR_NAME 已创建、删除或重命名子目录。
FILE_NOTIFY_CHANGE_NAME 此目录的名称已更改。
FILE_NOTIFY_CHANGE_ATTRIBUTES 此文件的属性的值(如上次访问时间)已更改。
FILE_NOTIFY_CHANGE_SIZE 此文件的大小已更改。
FILE_NOTIFY_CHANGE_LAST_WRITE 此文件的上次修改时间已更改。
FILE_NOTIFY_CHANGE_LAST_ACCESS 此文件的上次访问时间已更改。
FILE_NOTIFY_CHANGE_CREATION 此文件的创建时间已更改。
FILE_NOTIFY_CHANGE_EA 已修改此文件的扩展属性。
FILE_NOTIFY_CHANGE_SECURITY 此文件的安全信息已更改。
FILE_NOTIFY_CHANGE_STREAM_NAME 此目录中已添加、删除或重命名文件流。
FILE_NOTIFY_CHANGE_STREAM_SIZE 此文件流的大小已更改。
FILE_NOTIFY_CHANGE_STREAM_WRITE 此文件流的数据已更改。

[in] NotifyCallbackData

指向要添加到通知列表的作的回调数据结构的指针。 此参数是必需的,不能 NULL

[in, optional] TraverseCallback

当在目录树中监视的子目录中发生更改时,要调用的回调例程的可选指针。 此指针允许文件系统检查观察程序是否遍历对该目录的访问权限。 此类调用方提供的例程声明如下:

NTSTATUS
(*PCHECK_FOR_TRAVERSE_ACCESS) (
    IN PVOID NotifyContext,                     // FsContext
    IN PVOID TargetContext,                     // Context pointer
    IN PSECURITY_SUBJECT_CONTEXT SubjectContext // SubjectContext
    );

有关 TargetContext 参数的详细信息,请参阅 FsRtlNotifyFullReportChange 例程的 TargetContext 参数。

[in, optional] SubjectContext

指向要传递给 TraverseCallback的上下文结构的指针。 FltNotifyFilterChangeDirectory 释放上下文并在使用它后释放结构。 如果提供了 TraverseCallback 例程,SubjectContext 作为 SubjectContext 参数传递给该例程。

[in, optional] FilterCallback

指向在目录发生更改时要调用的回调例程的可选指针。 如果此回调例程返回 TRUEFsRtlNotifyFilterReportChange 完成通知列表中的挂起IRP_MN_NOTIFY_CHANGE_DIRECTORY作;否则,它不会。 此类调用方提供的例程声明如下:

BOOLEAN
(*PFILTER_REPORT_CHANGE) (
    IN PVOID NotifyContext,                     // FsContext
    IN PVOID FilterContext                      // Context pointer
    );

返回值

没有

言论

微型筛选器驱动程序可以从注册的预作回调例程(PFLT_PRE_OPERATION_CALLBACK)调用 FltNotifyFilterChangeDirectory,以处理通知更改目录作。 这些作具有 IRP_MJ_DIRECTORY_CONTROL 的主要函数代码和IRP_MN_NOTIFY_CHANGE_DIRECTORY的次要函数代码。

微型筛选器驱动程序调用 FltNotifyFilterChangeDirectory,以创建一个通知结构来保存作的回调数据结构,并将通知结构添加到当前卷的通知列表中。

FltNotifyFilterChangeDirectory 执行以下作:

  • 检查作的文件对象是否已清理。 如果是这样,FltNotifyFilterChangeDirectory 完成状态STATUS_NOTIFY_CLEANUP的作,并且不会将其添加到通知列表中。
  • 如果作的文件对象尚未清理,FltNotifyFilterChangeDirectory 检查通知列表是否已包含给定 FsContext 值的通知结构。 如果找到此类通知结构,并且有待报告的更改,FltNotifyFilterChangeDirectory 完成 NotifyCallbackData 参数指向的回调数据结构。 如果找到通知结构,但没有待处理的报表更改,FltNotifyFilterChangeDirectory 将作添加到通知结构。 如果未找到此类通知结构,FltNotifyFilterChangeDirectory 为作创建通知结构并将其插入列表中。
当目录发生更改时,文件系统会调用 FsRtlNotifyFilterReportChange 来完成通知列表中的挂起IRP_MN_NOTIFY_CHANGE_DIRECTORY作。

要求

要求 价值
目标平台 普遍
标头 fltkernel.h (包括 Fltkernel.h)
FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

另请参阅

FsRtlNotifyFilterReportChange

IRP_MJ_DIRECTORY_CONTROL

PFLT_PRE_OPERATION_CALLBACK