返回 FLT_PREOP_SYNCHRONIZE
注意
微筛选器驱动程序不应使用 FLT_PREOP_SYNCHRONIZE 在操作前和操作后调用中保留资源, (它不应在 I/O 调用) 中保留资源。 这样做是不安全的,因为它可能会导致死锁。
如果微筛选器驱动程序的操作 前回调例程 通过返回FLT_PREOP_SYNCHRONIZE来同步 I/O 操作,筛选器管理器会在 I/O 完成期间调用该筛选器 的操作后回调例程 :
- 如果筛选器未清空,筛选器管理器在与操作前回调相同的线程上下文中调用该筛选器的操作后回调例程,其值为 IRQL <= APC_LEVEL。 (请注意,此线程上下文不一定是发起线程的上下文。)
- 如果筛选器正在清空,筛选器管理器不会同步回原始线程。
注意
如果筛选器的操作前回调例程返回FLT_PREOP_SYNCHRONIZE,则必须为该操作实现操作后回调例程。
如果筛选器的预操作回调例程返回FLT_PREOP_SYNCHRONIZE,则可以在其 CompletionContext 输出参数中返回非 NULL 值。 此参数是传递给相应的操作后回调例程的可选上下文指针。 操作后回调例程在其 CompletionContext 输入参数中接收此指针。
对于基于 IRP 的 I/O 操作,微筛选器驱动程序的预操作回调例程应返回FLT_PREOP_SYNCHRONIZE。 但是,可以为其他操作类型返回此状态值。 如果返回的 I/O 操作不是基于 IRP 的 I/O 操作,筛选器管理器会将此返回值视为FLT_PREOP_SUCCESS_WITH_CALLBACK。 若要确定操作是否是基于 IRP 的 I/O 操作,请使用 FLT_IS_IRP_OPERATION 宏。
筛选器不应返回创建操作FLT_PREOP_SYNCHRONIZE,因为这些操作已由筛选器管理器同步。 如果微筛选器驱动程序为IRP_MJ_CREATE操作注册了操作前和操作后回调例程,则在与预创建回调例程相同的线程上下文中,将在 IRQL = PASSIVE_LEVEL 调用创建后回调例程。
对于异步读取或写入操作,微筛选器驱动程序不得返回FLT_PREOP_SYNCHRONIZE。 这样做可能会严重降低微筛选器驱动程序和系统性能,甚至可能导致死锁,例如,如果已修改的页面编写器线程被阻止。 在为基于 IRP 的读取或写入操作返回FLT_PREOP_SYNCHRONIZE之前,微筛选器驱动程序应通过调用 FltIsOperationSynchronous 验证操作是否同步。
无法同步以下类型的 I/O 操作:
oplock 文件系统控制 (FSCTL) 操作 (MajorFunction IRP_MJ_FILE_SYSTEM_CONTROL; FsControlCode为 FSCTL_REQUEST_FILTER_OPLOCK、 FSCTL_REQUEST_BATCH_OPLOCK、 FSCTL_REQUEST_OPLOCK_LEVEL_1 或 FSCTL_REQUEST_OPLOCK_LEVEL_2.)
IRP_MJ_DIRECTORY_CONTROL MajorFunction (通知更改目录操作; MinorFunction 为 IRP_MN_NOTIFY_CHANGE_DIRECTORY.)
(MajorFunction IRP_MJ_LOCK_CONTROL字节范围锁定请求; MinorFunction 为 IRP_MN_LOCK.)
无法为上述任何操作返回FLT_PREOP_SYNCHRONIZE。