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
    );

返回值

备注

微型筛选器驱动程序可以从预操作回调例程调用 FltNotifyFilterChangeDirectory (PFLT_PRE_OPERATION_CALLBACK) 注册以处理通知更改目录操作。 这些操作具有 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)
Library FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

另请参阅

FsRtlNotifyFilterReportChange

IRP_MJ_DIRECTORY_CONTROL

PFLT_PRE_OPERATION_CALLBACK