共用方式為


檢查IRP_MJ_CREATE作業的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 已中斷:

  • 中斷為 None IF

    • 已設定FILE_RESERVE_OPFILTER旗標

    • 指定下列任何建立處置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    還:

    • 中斷至層級 2。
  • 必須先收到通知,才能繼續作業。

層級 2

當下列情況時,IRP_MJ_CREATE中斷:

  • 與開啟發生所在FILE_OBJECT相關聯的 oplock 機碼,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 機碼不同。
  • 和:
    • 已設定FILE_RESERVE_OPFILTER旗標

    • 指定下列任何建立處置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

如果 oplock 已中斷:

  • 中斷為 [無]。

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

Batch

當下列情況時,IRP_MJ_CREATE中斷:

  • 與開啟發生所在FILE_OBJECT相關聯的 oplock 機碼,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 機碼不同。

如果 oplock 已中斷:

  • 中斷為 None IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 指定下列任何建立處置值:
      • 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 已中斷:

  • 中斷為 [無]。

  • 必須先收到通知,才能繼續作業。

讀取

當下列情況時,IRP_MJ_CREATE中斷:

  • 與開啟發生所在FILE_OBJECT相關聯的 oplock 機碼,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 機碼不同。

  • 和:
    • 已設定FILE_RESERVE_OPFILTER旗標

    • 指定下列任何建立處置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

如果 oplock 已中斷:

  • 中斷為 [無]。

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

Read-Handle

當下列情況時,IRP_MJ_CREATE中斷:

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

  • 已設定FILE_RESERVE_OPFILTER旗標。

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

    • FILE_SUPERSEDE
    • FILE_OVERWRITE
    • FILE_OVERWRITE_IF

    上述 三個條件的 AND ()

  • 與開啟發生所在FILE_OBJECT相關聯的 oplock 機碼,與擁有 oplock 之FILE_OBJECT相關聯的 oplock 機碼不同。

如果 oplock 已中斷:

  • 中斷為 None IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 指定下列任何建立處置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    還:

    • 中斷為 [讀取]。
  • 如果作業鎖定中斷,因為目前的開啟與現有開啟發生衝突,因此會發生共享違規,則必須在作業繼續之前收到通知。
  • 如果作業鎖定因任何其他原因而中斷,雖然需要中斷通知,但作業會立即繼續 (,而不需等候通知) 。

Read-Write

當下列情況時,IRP_MJ_CREATE中斷:

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

如果 oplock 已中斷:

  • 中斷為 None IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 指定下列任何建立處置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    還:

    • 中斷為 [讀取]。
  • 在作業繼續之前,必須先收到通知。

讀寫句柄

當下列情況時,IRP_MJ_CREATE中斷:

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

如果 oplock 已中斷:

  • 中斷為 None IF

    • 已設定FILE_RESERVE_OPFILTER旗標。

    • 指定下列任何建立處置值:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    還:

    • 中斷以 Read-Write 目前的開啟與現有開啟發生衝突,如此就會發生共享違規。 否則,請中斷為 [讀取句柄]。

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

文件系統會在處理IRP_MJ_CREATE作業時執行 Batch 和 Filter oplock 的其他檢查 (,而不是 oplock 套件本身) ,這會影響文件系統是否要求 oplock 套件執行 oplock 中斷處理。 在此情況下,一個數據流上的作業可能會影響相同檔案的其他數據流的oplocks (也就是下列準則清單的最後兩個清單專案) 。 如果符合下列一或多個準則,文件系統會將要求傳送至 oplock 套件,以執行 oplock 中斷處理:

  • 如果這是開啟的網路查詢,且 KTM 交易存在,請要求中斷。 否則,請勿在開啟網路查詢時要求中斷。

  • 如果 SUPERSEDE、OVERWRITE 或 OVERWRITE_IF 作業是在替代數據流上執行,但未指定FILE_SHARE_DELETE,而且主要數據流上有 Batch 或 Filter oplock,請在主要數據流上要求中斷 Batch 或 Filter oplock。

  • 如果在主要數據流上執行 SUPERSEDE、OVERWRITE 或 OVERWRITE_IF 作業,而且已要求 DELETE 存取,且任何替代數據流上有 Batch 或篩選 oplock,請在具有這些數據流的所有替代數據流上要求中斷 Batch 或 Filter oplock。

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

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