检查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出现时中断:
|
如果 oplock 已中断:
|
|
级别 2 |
在IRP_MJ_CREATE出现时中断:
|
如果 oplock 已中断:
|
|
Batch |
在IRP_MJ_CREATE出现时中断:
|
如果 oplock 已中断:
|
|
筛选器 |
在IRP_MJ_CREATE出现时中断:
|
如果 oplock 已中断:
|
|
读取 |
在IRP_MJ_CREATE出现时中断:
|
如果 oplock 已中断:
|
|
Read-Handle |
在IRP_MJ_CREATE出现时中断:
|
如果 oplock 已中断:
|
|
读取/写入 |
当出现IRP_MJ_CREATE时中断:
|
如果 oplock 中断:
|
|
Read-Write-Handle |
当出现IRP_MJ_CREATE时中断:
|
如果 oplock 中断:
|
处理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 也会中断。