修改参数
微筛选器驱动程序可以修改与 I/O 操作关联的某些参数,例如目标实例、目标文件对象和特定于操作的参数,包括缓冲区地址和内存描述符列表 (MDL) 地址。 微筛选器驱动程序通常会修改 I/O 请求的预操作回调中的参数。 如果微筛选器驱动程序修改参数,则必须调用 FltSetCallbackDataDirty 以通知筛选器管理器参数已更改。 它还应记录从其操作前回调传递的上下文中的更改,以便这些更改可用于操作后回调。
微筛选器驱动程序可以在操作前回调中完成操作时更改操作的 I/O 状态,或者在操作后回调 ((例如将STATUS_SUCCESS更改为错误状态) )失败。 在这种情况下,无需调用 FltSetCallbackDataDirty 。
有关修改参数的详细信息,请参阅 修改 I/O 操作的参数。
微筛选器驱动程序可以通过将 I/O 请求的缓冲区字段替换为其自己的缓冲区来“交换缓冲区”。 此类微筛选器驱动程序负责使 I/O 请求的 MDL 和缓冲区字段保持同步。筛选器管理器在 FLT_CALLBACK_DATA 结构中设置 FLTFL_CALLBACK_DATA_SYSTEM_BUFFER_FLAG ,以指示缓冲区是否为系统缓冲区;如果是这样,微筛选器驱动程序必须分配非分页池中的替换缓冲区,并将 MDL 字段设置为 NULL。 否则,可以从分页池或非分页池分配缓冲区,并且微筛选器驱动程序必须始终创建并设置 MDL。 (在快速 I/O 操作的情况下,可以从分页或非分页池分配新缓冲区,MDL 应为 NULL。) 微筛选器驱动程序不得释放要替换的缓冲区或 MDL,并且不得释放已成功插入回调数据结构的任何 MDL, (筛选器管理器将代表微筛选器驱动程序释放 MDL) 。 更改 MDL 或缓冲区后,微筛选器驱动程序必须调用 FltSetCallbackDataDirty。
微筛选器驱动程序必须为交换缓冲区的任何操作注册操作后回调。 在此回调例程中,微筛选器驱动程序必须释放它分配的任何缓冲区。 筛选器管理器将释放 MDL,除非微筛选器驱动程序调用 FltRetainSwappedBufferMdlAddress;在这种情况下,微筛选器驱动程序负责释放 MDL。 微筛选器驱动程序可以调用 FltGetSwappedBufferMdlAddress 来获取其操作前回调中缓冲区集的 MDL。
如果在交换了缓冲区的操作期间卸载微筛选器驱动程序,则无法“清空”操作;相反,将取消操作,筛选器管理器在卸载微筛选器驱动程序之前等待操作完成。
有关交换缓冲区的微筛选器驱动程序的示例,请参阅 SwapBuffers 示例。
筛选器管理器提供以下支持例程,用于修改操作前和操作后回调例程中的 I/O 操作参数:
以下例程提供对交换缓冲区的支持: