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

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

返回值

没有

言论

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

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

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

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

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

要求

要求 价值
目标平台 普遍
标头 ntifs.h (include Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDIS(storport)PowerIrpDDis(wdm)

另请参阅

FsRtlNotifyFullReportChange

IRP_MJ_DIRECTORY_CONTROL

SECURITY_SUBJECT_CONTEXT