FS_FILTER_CALLBACKS结构 (ntifs.h)

FS_FILTER_CALLBACKS结构包含调用方提供的通知回调例程的入口点。

语法

typedef struct _FS_FILTER_CALLBACKS {
  ULONG                          SizeOfFsFilterCallbacks;
  ULONG                          Reserved;
  PFS_FILTER_CALLBACK            PreAcquireForSectionSynchronization;
  PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
  PFS_FILTER_CALLBACK            PreReleaseForSectionSynchronization;
  PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
  PFS_FILTER_CALLBACK            PreAcquireForCcFlush;
  PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
  PFS_FILTER_CALLBACK            PreReleaseForCcFlush;
  PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
  PFS_FILTER_CALLBACK            PreAcquireForModifiedPageWriter;
  PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
  PFS_FILTER_CALLBACK            PreReleaseForModifiedPageWriter;
  PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
  PFS_FILTER_CALLBACK            PreQueryOpen;
  PFS_FILTER_COMPLETION_CALLBACK PostQueryOpen;
} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;

成员

SizeOfFsFilterCallbacks

此结构的大小(以字节为单位)。 设置为 sizeof(FS_FILTER_CALLBACKS)SizeOfFsFilterCallbacks 不得设置为零。

Reserved

保留。 请勿使用。

PreAcquireForSectionSynchronization

指向 FS_FILTER_CALLBACK PreAcquireForSectionSynchronization 例程的指针。

PostAcquireForSectionSynchronization

指向 FS_FILTER_CALLBACK PostAcquireForSectionSynchronization 例程的指针。

PreReleaseForSectionSynchronization

指向 FS_FILTER_CALLBACK PreReleaseForSectionSynchronization 例程的指针。

PostReleaseForSectionSynchronization

指向 FS_FILTER_CALLBACK PostReleaseForSectionSynchronization 例程的指针。

PreAcquireForCcFlush

指向 FS_FILTER_CALLBACK PreAcquireForCcFlush 例程的指针。

PostAcquireForCcFlush

指向 FS_FILTER_CALLBACK PostAcquireForCcFlush 例程的指针。

PreReleaseForCcFlush

指向 FS_FILTER_CALLBACK PreReleaseForCcFlush 例程的指针。

PostReleaseForCcFlush

指向 FS_FILTER_CALLBACK PostReleaseForCcFlush 例程的指针。

PreAcquireForModifiedPageWriter

指向 FS_FILTER_CALLBACK PreAcquireForModifiedPageWriter 例程的指针。

PostAcquireForModifiedPageWriter

指向 FS_FILTER_CALLBACK PostAcquireForModifiedPageWriter 例程的指针。

PreReleaseForModifiedPageWriter

指向 FS_FILTER_CALLBACK PreReleaseForModifiedPageWriter 例程的指针。

PostReleaseForModifiedPageWriter

指向 FS_FILTER_CALLBACK PostReleaseForModifiedPageWriter 例程的指针。

PreQueryOpen

指向 FS_FILTER_CALLBACK PreQueryOpen 例程的指针。

PostQueryOpen

指向 FS_FILTER_CALLBACK PostQueryOpen 例程的指针。

言论

文件系统筛选器驱动程序和文件系统调用 FsRtlRegisterFileSystemFileSystemFilterCallbacks 例程,以注册在基础文件系统执行某些作时要调用的通知回调例程。

所有回调入口点都是可选的,可以 NULL

FS_FILTER_CALLBACK筛选器回调例程及其参数定义如下:


typedef
NTSTATUS (*PFS_FILTER_CALLBACK) (
    IN PFS_FILTER_CALLBACK_DATA Data,
    OUT PVOID *CompletionContext
);

参数 意义
数据 指向此作的 FS_FILTER_CALLBACK_DATA 结构的指针。
CompletionContext 要传递给筛选器完成回调例程的上下文信息。 如果未传递上下文信息或没有相应的筛选器完成回调例程,则设置为 NULL

FS_FILTER_COMPLETION_CALLBACK筛选器完成回调例程及其参数定义如下:


typedef
VOID (*PFS_FILTER_COMPLETION_CALLBACK) (
    IN PFS_FILTER_CALLBACK_DATA Data,
    IN NTSTATUS OperationStatus,
    IN PVOID CompletionContext
);

参数 意义
数据 指向此作的 FS_FILTER_CALLBACK_DATA 结构的指针。
OperationStatus 作的状态。 如果文件系统成功执行了该作,则此参数设置为STATUS_SUCCESS。 否则,它设置为适当的错误状态值。
CompletionContext 筛选器回调例程中设置的上下文信息。 如果未传递任何信息或没有相应的筛选器回调例程,则设置为 NULL

为以下作定义了回调例程:

操作 通知回调例程
在为文件的一部分创建内存映射节之前,内存管理器会独占获取文件。 对于此作,SyncType 设置为 SyncTypeCreateSection PreAcquireForSectionSynchronization、 PostAcquireForSectionSynchronization
内存管理器在为文件的一部分创建内存映射节后释放文件。 PreReleaseForSectionSynchronization、 PostReleaseForSectionSynchronization
内核组件(如缓存管理器)在暂时禁用文件的一部分创建节之前,会以独占方式获取文件。 对于此作,SyncType 设置为 SyncTypeOther。 PreAcquireForSectionSynchronization、PostAcquireForSectionSynchronization。 PreAcquireForSectionSynchronization 应始终返回此作的成功状态代码(如 STATUS_SUCCESS)。
内核组件(如缓存管理器)在暂时禁用文件的一部分创建节后释放文件。 PreReleaseForSectionSynchronization、 PostReleaseForSectionSynchronization
缓存管理器在从缓存中刷新文件的一部分之前,以独占方式获取文件。 PreAcquireForCcFlush、PostAcquireForCcFlush
缓存管理器从缓存刷新部分文件后释放文件。 PreReleaseForCcFlush、PostReleaseForCcFlush
修改的页面编写器在将文件的一部分写入磁盘之前独占获取文件。 PreAcquireForModifiedPageWriter、 PostAcquireForModifiedPageWriter
修改后的页编写器在将文件的一部分写入磁盘后释放文件。 PreReleaseForModifiedPageWriter、 PostReleaseForModifiedPageWriter
组件按名称查询文件信息,而无需打开文件。 重定向程序永远不会使用此查询调用,因此不需要实现 PreQueryOpen 或 PostQueryOpen 回调。 PreQueryOpen、PostQueryOpen

在将作请求传递到较低级别的筛选器驱动程序和基础文件系统之前,将调用筛选器通知回调例程。 在回调例程中,筛选器驱动程序应执行任何所需的处理,并立即返回STATUS_SUCCESS。 如果筛选器驱动程序的回调例程返回非STATUS_SUCCESS的状态值,这会导致作请求失败。 某些请求(如锁定请求)的重复失败可能会停止系统进度。 因此,仅当绝对必要时,筛选器驱动程序才应失败此类请求。 如果失败这些请求,筛选器驱动程序应返回错误状态值,该值将错误描述为尽可能完整、准确。

注意

筛选器驱动程序的通知回调例程无法通过请求释放文件系统资源。 如果筛选器驱动程序从以下任何通知回调例程返回非STATUS_SUCCESS的状态值,则忽略状态值。

  • PreReleaseForSectionSynchronization
  • PreReleaseForCcFlush
  • PreReleaseForModifiedPageWriter

将作请求传递到较低级别的筛选器驱动程序和基础文件系统后,将调用筛选器完成回调例程。 在完成回调例程中,筛选器驱动程序必须执行任何所需的处理并立即返回。

要求

要求 价值
标头 ntifs.h

另请参阅

FS_FILTER_CALLBACK_DATA

FsRtlRegisterFileSystemFilterCallbacks