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 或 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,则表示文件对象表示的文件流 (由 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 参数的详细信息,请参阅 FsRtlNotifyFullReportChange 的 TargetContext 参数。 如果 NotifyIrp 为 NULL,则忽略 TraverseCallback。
[in, optional] SubjectContext
指向要传递给 TraverseCallback的SECURITY_SUBJECT_CONTEXT结构的指针。 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
);
返回值
无
备注
FsRtlNotifyFilterChangeDirectory 由一个文件系统调用,该文件系统已收到包含主函数代码 IRP_MJ_DIRECTORY_CONTROL、次要函数代码IRP_MN_NOTIFY_CHANGE_DIRECTORY的 IRP。
文件系统调用 FsRtlNotifyFilterChangeDirectory 来创建一个通知结构来保存 IRP,并将通知结构添加到当前卷的通知列表中。
如果 NotifyIrp 为 NULL,FsRtlNotifyFilterChangeDirectory 会检查通知列表是否已包含任何挂起的 IRP,其文件对象与给定 的 FsContext 值匹配,如果是,则使用STATUS_DELETE_PENDING完成 IRP。
如果 NotifyIrp 不为 NULL,FsRtlNotifyFilterChangeDirectory 将执行以下操作:
检查 IRP 的文件对象是否已进行清理。 如果是这样, FsRtlNotifyFilterChangeDirectory 会以状态STATUS_NOTIFY_CLEANUP完成 IRP,并且不会将其添加到通知列表。
如果 IRP 的文件对象尚未进行清理, FsRtlNotifyFilterChangeDirectory 会检查通知列表是否已包含给定 FsContext 值的通知结构。 如果找到此类通知结构,并且有待报告的更改, FsRtlNotifyFilterChangeDirectory 将完成 NotifyIrp。 如果找到通知结构,但没有待报告的更改, FsRtlNotifyFilterChangeDirectory 会将 NotifyIrp 指向的 IRP 标记为挂起,并将其插入通知结构中的通知 IRP 列表中。 如果未找到此类通知结构, FsRtlNotifyFilterChangeDirectory 会将 NotifyIrp 指向的 IRP 标记为挂起,创建一个通知结构,并将其插入到通知列表中。
当目录发生更改时,文件系统会调用 FsRtlNotifyFilterReportChange 以完成通知列表中的挂起IRP_MN_NOTIFY_CHANGE_DIRECTORY请求。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 SP4 更新汇总;Windowsxp |
目标平台 | 通用 |
标头 | ntifs.h (包括 Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < APC_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) , PowerIrpDDis (wdm) |
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈