检查IRP_MJ_CREATE操作的 Oplock 状态

仅当打开文件的现有流 (即新创建的流上不能有预先存在的 oplock) 时才适用。

注意 处理任何 oplock 的IRP_MJ_CREATE时,如果所需的访问只包含FILE_READ_ATTRIBUTES、FILE_WRITE_ATTRIBUTES或 SYNCHRONIZE,则除非指定FILE_RESERVE_OPFILTER,否则 oplock 不会中断。 如果创建成功,则指定FILE_RESERVE_OPFILTER始终会导致 oplock 中断。 为简洁起见,下表省略了上述内容,因为它适用于所有 oplock。

请求类型 条件

级别 1

在IRP_MJ_CREATE出现时中断:

  • 与进行打开的FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。

如果 oplock 已中断:

  • 中断为无 IF

    • 已设置FILE_RESERVE_OPFILTER标志

      OR

    • 指定以下任何创建处置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    还:

    • 中断到级别 2。
  • 在操作继续之前,必须收到确认。

级别 2

在IRP_MJ_CREATE出现时中断:

  • 与进行打开的FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。
  • 和:
    • 已设置FILE_RESERVE_OPFILTER标志

      OR

    • 指定以下任何创建处置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

如果 oplock 已中断:

  • 中断为 None。

  • 无需确认,操作会立即进行。

Batch

在IRP_MJ_CREATE出现时中断:

  • 与进行打开的FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。

如果 oplock 已中断:

  • 中断为无 IF

    • 设置FILE_RESERVE_OPFILTER标志。

      OR

    • 指定以下任何创建处置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    还:

    • 中断到级别 2。
  • 在操作继续之前,必须收到确认。

筛选器

在IRP_MJ_CREATE出现时中断:

  • 与进行打开的FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。

  • 和:
    • 在流上请求了“可写”的所需访问权限,该流未为FILE_SHARE_READ访问打开。 请注意,“可写”访问定义为除以下属性以外的任何属性:

      • FILE_READ_ATTRIBUTES
      • FILE_WRITE_ATTRIBUTES
      • FILE_READ_DATA
      • FILE_READ_EA
      • FILE_EXECUTE
      • SYNCHRONIZE
      • READ_CONTROL

如果 oplock 已中断:

  • 中断为 None。

  • 在操作继续之前,必须收到确认。

读取

在IRP_MJ_CREATE出现时中断:

  • 与进行打开的FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。

  • 和:
    • 已设置FILE_RESERVE_OPFILTER标志

      OR

    • 指定以下任何创建处置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

如果 oplock 已中断:

  • 中断为 None。

  • 无需确认,操作会立即进行。

Read-Handle

在IRP_MJ_CREATE出现时中断:

  • 当前开放与现有开放冲突,因此会发生共享冲突。

    OR

  • 设置FILE_RESERVE_OPFILTER标志。

    OR

  • 指定以下任何创建处置值:

    • FILE_SUPERSEDE
    • FILE_OVERWRITE
    • FILE_OVERWRITE_IF

    ( 上述三个条件中的任何一个)

  • 与进行打开的FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。

如果 oplock 已中断:

  • 中断为无 IF

    • 设置FILE_RESERVE_OPFILTER标志。

      OR

    • 指定以下任何创建处置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    还:

    • 中断为读取。
  • 如果 oplock 因当前打开与现有打开冲突而中断,导致发生共享冲突,则必须在操作继续之前收到确认。
  • 如果 oplock 因任何其他原因而中断,尽管需要确认中断,但操作会立即继续 (,例如,无需等待确认) 。

读取/写入

当出现IRP_MJ_CREATE时中断:

  • 与打开FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。

如果 oplock 中断:

  • 如果为 ,则中断为 None:

    • 设置FILE_RESERVE_OPFILTER标志。

      OR

    • 指定以下任何创建处置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    还:

    • 中断为读取。
  • 在操作继续之前,必须收到确认。

Read-Write-Handle

当出现IRP_MJ_CREATE时中断:

  • 与打开FILE_OBJECT关联的 oplock 键不同于与拥有 oplock 的FILE_OBJECT关联的 oplock 键。

如果 oplock 中断:

  • 如果为 ,则中断为 None:

    • 设置FILE_RESERVE_OPFILTER标志。

      OR

    • 指定以下任何创建处置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    还:

    • 如果当前打开的打开与现有打开冲突,导致发生共享冲突,则中断为 Read-Write。 否则,中断为 Read-Handle。

  • 在操作继续之前,必须收到确认。

处理IRP_MJ_CREATE操作时,文件系统对 Batch 和 Filter oplock 执行附加检查,而不是) oplock 包本身 (,这会影响文件系统是否要求 oplock 包执行 oplock 中断处理。 在这种情况下,一个数据流上的操作可能会影响同一文件的其他数据流 (,即以下条件列表的最后两个列表项) 。 如果满足以下一个或多个条件,则文件系统将向 oplock 包发送请求以执行 oplock 中断处理:

  • 如果这是打开的网络查询并且存在 KTM 事务,则请求中断。 否则,不要在网络查询打开时请求中断。

  • 如果在备用数据流上执行 SUPERSEDE、OVERWRITE 或 OVERWRITE_IF 操作,并且未指定FILE_SHARE_DELETE,并且主数据流上存在 Batch 或 Filter oplock,请在主数据流上请求中断 Batch 或 Filter oplock。

  • 如果对主数据流执行 SUPERSEDE、OVERWRITE 或 OVERWRITE_IF 操作,并且已请求 DELETE 访问权限,并且任何备用数据流上都有 Batch 或 Filter 操作锁,请在具有批处理或筛选操作锁的所有备用数据流上请求中断 Batch 或 Filter oplock。

当文件系统决定要求 oplock 包执行 oplock 中断处理时,上表中列出的规则适用。

中断 Batch 和 Filter 操作锁检查发生在进行共享访问检查之前。 这意味着即使打开的请求最终由于共享冲突而失败,Batch 或 Filter oplock 也会中断。