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
指向在目录发生更改时要调用的回调例程的可选指针。 如果此回调例程返回 TRUE,FsRtlNotifyFilterReportChange 完成通知列表中的挂起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 为作创建通知结构并将其插入列表中。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | fltkernel.h (包括 Fltkernel.h) |
库 | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |