共用方式為


檢查 IRP_MJ_CREATE 作業的 Oplock 狀態

只有在開啟檔案的現有數據流時,才適用下列規定(也就是,新建立的數據流不能有已存在的 oplock)。

注意 當處理任何 oplock 的 IRP_MJ_CREATE 時,如果所需的存取僅包含 FILE_READ_ATTRIBUTES、FILE_WRITE_ATTRIBUTES 或 SYNCHRONIZE,除非指定 FILE_RESERVE_OPFILTER,否則 oplock 不會中斷。 如果建立成功,指定 FILE_RESERVE_OPFILTER 必然導致 oplock 中斷。 為了簡潔明了,下表省略了先前所述的內容,因為它適用於所有 oplocks。

要求類型 條件

層級 1

在下列情況下,IRP_MJ_CREATE中斷:

  • 與開啟所在FILE_OBJECT相關聯的 oplock 索引鍵,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 密鑰不同。

如果「oplock」已中斷:

  • 中斷至無 IF

    • 已設定FILE_RESERVE_OPFILTER旗標

    • 可以指定以下任一建立處置值:
      • FILE_SUPERSEDE
      • 文件覆寫
      • FILE_OVERWRITE_IF

    還:

    • 轉到第 2 級。
  • 在作業繼續之前,必須先收到通知。

層級 2

在下列情況下,IRP_MJ_CREATE中斷:

  • 與正在開啟的 FILE_OBJECT 相關聯的 oplock 金鑰,與擁有該 oplock 的 FILE_OBJECT 相關聯的 oplock 金鑰不同。
  • 和:
    • 已設定「FILE_RESERVE_OPFILTER」旗標

    • 下列任何新增處理選項均已指定:
      • FILE_SUPERSEDE
      • 檔案覆蓋
      • FILE_OVERWRITE_IF (覆寫檔案條件)

如果 oplock 已中斷:

  • 中斷為 None。

  • 不需要通知,作業會立即繼續進行。

批次

在發生如下狀況時,IRP_MJ_CREATE操作失敗:

  • 與正在開啟的 FILE_OBJECT 相關聯的 oplock 密鑰,與擁有 oplock 的 FILE_OBJECT 相關聯的 oplock 密鑰不同。

如果 oplock 已中斷:

  • 中斷至無 IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 下列任何創建配置值已被指定:
      • FILE_SUPERSEDE
      • 文件覆蓋
      • FILE_OVERWRITE_IF

    否則:

    • 進入層級 2。
  • 在作業繼續之前,必須先收到通知。

篩選器

在下列情況下,IRP_MJ_CREATE失效:

  • 與開啟所在FILE_OBJECT相關聯的 oplock 索引鍵,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 密鑰不同。

  • 和:
    • 數據流上已要求「可寫入」的存取權,而該數據流未針對FILE_SHARE_READ存取開啟。 請注意,「可寫入」存取權定義為下列任何屬性以外的任何屬性:

      • 文件讀取屬性
      • 文件寫入屬性
      • FILE_READ_DATA
      • FILE_READ_EA
      • 檔案執行
      • 同步
      • 讀取控制

如果 oplock 已中斷:

  • 斷開連接設為 None。

  • 在作業繼續之前,必須先收到通知。

參閱

在下列情況下,IRP_MJ_CREATE中斷:

  • 與開啟所在FILE_OBJECT相關聯的 oplock 索引鍵,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 密鑰不同。

  • 和:
    • FILE_RESERVE_OPFILTER 旗標已經設置

    • 下列任何設置選項值已被指定:
      • FILE_SUPERSEDE
      • 文件覆寫
      • FILE_OVERWRITE_IF (檔案覆寫)

如果 oplock 被中斷:

  • 中斷為 None。

  • 不需要通知,作業會立即繼續進行。

Read-Handle

在下列情況下,IRP_MJ_CREATE中斷:

  • 目前的開啟與現有開啟發生衝突,因此會發生共享違規。

  • 已設定FILE_RESERVE_OPFILTER旗標。

  • 指定下列任何創建處置值:

    • FILE_SUPERSEDE
    • 文件覆寫
    • FILE_OVERWRITE_IF(如果存在則覆寫文件)

    AND (上述三個條件之一)

  • 與開啟所在FILE_OBJECT相關聯的 oplock 索引鍵,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 密鑰不同。

如果 oplock 已中斷:

  • 中斷設定為無 IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 指定建立處置值中的任何一項:
      • FILE_SUPERSEDE
      • 檔案覆寫
      • FILE_OVERWRITE_IF

    否則:

    • 休息以便閱讀。
  • 如果 oplock 中斷,是因為目前的開啟與現有開啟發生衝突而導致共用違規,那麼必須在操作繼續之前收到確認。
  • 如果 oplock 因任何其他原因而中斷,雖然需要認可中斷,但作業會立即繼續執行(例如,不等待通知)。

讀寫

在下列情況下,IRP_MJ_CREATE中斷:

  • 與開啟所在FILE_OBJECT相關聯的 oplock 索引鍵,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 密鑰不同。

如果 oplock 已中斷:

  • 中斷至無狀態IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 指定下列任何建立處置值:
      • FILE_SUPERSEDE
      • 文件覆蓋
      • FILE_OVERWRITE_IF

    否則:

    • 暫停閱讀。
  • 在作業繼續之前,必須先收到通知。

讀取:Write-Handle

在下列情況下,IRP_MJ_CREATE中斷:

  • 與正在開啟的 FILE_OBJECT 相關聯的 oplock 密鑰,與擁有該 oplock 的 FILE_OBJECT 相關聯的 oplock 密鑰不同。

如果 oplock 已中斷:

  • 中斷至無效 IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 指定下列之中的任何一個創建處置值:
      • FILE_SUPERSEDE
      • 檔案覆蓋
      • FILE_OVERWRITE_IF

    否則:

    • 如果目前的開啟與現有開啟發生衝突,可能導致共享違規,則中斷為 Read-Write。 否則,請中斷為 Read-Handle。

  • 在作業繼續之前,必須先收到通知。

當處理 IRP_MJ_CREATE 作業時,文件系統會進行 Batch 和 Filter oplocks 的額外檢查(而不只是檢查 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 oplock,請要求在所有有這些替代資料流的資料流上中斷 Batch 或 Filter oplock。

當文件系統決定要求 oplock 套件執行 oplock 中斷處理時,會套用上表中所列的規則。

中斷 Batch 和 Filter oplock 的檢查會在進行共用存取檢查之前發生。 這表示即使開啟要求最終因為共用違規而失敗,Batch 或 Filter oplock 仍會中斷。