FsRtlNotifyFullChangeDirectory 函数 (ntifs.h)

FsRtlNotifyFullChangeDirectory 例程为通知请求创建通知结构,并将其添加到指定的通知列表中。

语法

void FsRtlNotifyFullChangeDirectory(
  [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] NotifySync

指向当前卷的通知列表的不透明同步对象的指针。

[in] NotifyList

指向通知列表标题的指针。 列表中的每个元素都是不透明的通知结构。

[in] FsContext

指向文件系统分配的唯一值的指针,用于标识要创建的通知结构属于特定文件对象。 如果提供了 TraverseCallback 例程, FsContext 将作为 NotifyContext 参数传递给该例程。

[in] FullDirectoryName

指向 ANSI 或 Unicode 字符串的指针,该字符串包含与此通知结构关联的目录的全名。 如果 NotifyIrp 为 NULL,则忽略。

[in] WatchTree

如果还应监视此目录的所有子目录,则设置为 TRUE。 如果仅监视目录本身,则设置为 FALSE。 如果 NotifyIrp 为 NULL,则忽略。

[in] IgnoreBuffer

设置为 TRUE 可忽略任何用户缓冲区并强制恢复目录。 此操作可加快操作速度。 如果 NotifyIrp 为 NULL,则忽略。

[in] CompletionFilter

指定文件或子目录更改类型的标志的位掩码,这些更改应导致挂起的通知 IRP 队列完成。 下表描述了可能的标志值。

标志 含义
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) 此文件流的数据已更改。

如果 NotifyIrp 为 NULL,则忽略 CompletionFilter

[in, optional] NotifyIrp

指向在通知更改时要完成的 IRP 的指针。 如果 NotifyIrp 为 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 参数的详细信息,请参阅 FsRtlNotifyFullReportChangeTargetContext 参数。 如果 NotifyIrp 为 NULL,则忽略 TraverseCallback

[in, optional] SubjectContext

指向要传递给 TraverseCallback的SECURITY_SUBJECT_CONTEXT结构的指针。 FsRtlNotifyFullChangeDirectory 释放上下文并在使用结构后释放结构。 如果 NotifyIrp 为 NULL,则忽略。 如果提供了 TraverseCallback 例程, 则 SubjectContext 将作为 SubjectContext 参数传递给该例程。

返回值

备注

FsRtlNotifyFullChangeDirectory 由已收到通知更改请求的文件系统调用。 此请求作为 IRP 接收,其中包含主要函数代码IRP_MJ_DIRECTORY_CONTROL、次要函数代码IRP_MN_NOTIFY_CHANGE_DIRECTORY。

如果 NotifyIrpNULL,FsRtlNotifyFullChangeDirectory 会检查通知列表是否包含引用此文件对象的挂起 IRP,如果是,则使用STATUS_DELETE_PENDING完成它。

如果 NotifyIrp 不为 NULL,FsRtlNotifyFullChangeDirectory 将执行以下操作:

  • 检查文件对象是否已进行清理。 如果是这样, FsRtlNotifyFullChangeDirectory 将完成状态为STATUS_NOTIFY_CLEANUP的通知 IRP。

  • 如果文件对象尚未进行清理, FsRtlNotifyFullChangeDirectory 会检查此卷的通知列表是否已包含此更改的通知结构。 如果是这样, FsRtlNotifyFullChangeDirectory 将完成任何挂起的 IRP。 否则, FsRtlNotifyFullChangeDirectory 会将通知 IRP 标记为挂起,创建通知结构,并将其插入列表中。

要求

要求
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) PowerIrpDDis (wdm)

另请参阅

FsRtlNotifyFullReportChange

IRP_MJ_DIRECTORY_CONTROL

SECURITY_SUBJECT_CONTEXT