请求 独占机会锁 (oplocks)的筛选器和文件系统必须将调用同步到系统提供的 oplock 包中。 特别是,对 oplock FSCTRL 例程的调用(用于建立 oplock)必须与对 oplock 检测中断例程的调用进行同步。 这两组例程的列表包括:
Oplock FSCTRL 例程:
- 微型筛选器: FltOplockFsctrl、 FltOplockFsctrlEx
- 旧式筛选器和文件系统: FsRtlOplockFsctrl、 FsRtlOplockFsctrlEx、 FsRtlUpperOplockFsctrl
Oplock 检查中断例程:
- 微型筛选器: FltCheckOplock、 FltCheckOplockEx
- 旧筛选器和文件系统: FsRtlCheckOplock、 FsRtlCheckOplockEx、 FsRtlCheckOplockEx2、 FsRtlOplockBreakH
处理 oplock 请求时,筛选器和文件系统必须确保以下内容:
- 处理请求的同时不能并行进行可能会破坏 oplock 的输入/输出。
- Oplock 请求不能与 oplock 中断确认同时发生。
请求为同一文件控制块(FCB)创建独占 oplock 的 IRP 调用包括:
- IRP_MJ_CREATE 操作中 FILE_OPEN_REQUIRING_OPLOCK 位在 Create.Options 中被设置
- 使用 oplock 控件IRP_MJ_FILE_SYSTEM_CONTROL
下面是 oplock 同步的一些示例:
处理 oplock 请求时,文件系统会以独占方式获取某些资源,调用 FsRtlOplockFsctrlEx 并释放资源。
处理 oplock 中断确认时,文件系统将获取同一资源共享、调用 FsRtlOplockFsctrlEx 并释放资源。
执行 I/O 时,文件系统将获取同一资源共享、调用 FsRtlCheckOplockEx2、执行 I/O 并释放资源。
上层文件系统应确保它们以类似的方式在 FsRtlCheckUpperOplock 和 FsRtlUpperOplockFsctrl 的调用之间同步。