共用方式為


FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)

要求檔案上的機會鎖定 (oplock),並確認發生 oplock 中斷。

若要執行這項作業,請使用下列參數呼叫 DeviceIoControl 函式。

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_REQUEST_OPLOCK,             // dwIoControlCode
  (LPVOID) lpInBuffer,              // pointer to REQUEST_OPLOCK_INPUT_BUFFER
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // pointer to REQUEST_OPLOCK_OUTPUT_BUFFER
  (DWORD) nOutBufferSize,           // size of output buffer
  NULL,                             // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

言論

用戶端應用程式會使用此作業向本地伺服器要求機會鎖定(oplock)。 用戶端應用程式不得直接從遠端伺服器要求機會鎖定,網路重新導向器會以透明方式要求應用程式的機會鎖定。 使用此作業向遠端伺服器要求機會鎖定會導致要求遭到拒絕。

如果 deviceIoControl 作業 傳回錯誤碼 ERROR_IO_PENDING,則已授與 oplock 要求。 如果傳回任何其他錯誤碼,則尚未授與oplock。 如果錯誤碼是警告值,例如 ERROR_CANNOT_GRANT_REQUESTED_OPLOCK,REQUEST_OPLOCK_OUTPUT_BUFFER 結構中可能會提供擴充資訊。

當授與的 oplock 中斷時,OVERLAPPED 結構中的事件對象會發出訊號,而且資訊會傳回 REQUEST_OPLOCK_OUTPUT_BUFFER 結構中。 內部 成員 重疊 結構將會設定為 NTSTATUS 值,以提供 oplock 如何中斷的擴充資訊。

重疊。內部值 意義
STATUS_SUCCESS
0x0
oplock 已由另一個文件系統作業中斷。
STATUS_OPLOCK_HANDLE_CLOSED
0x00000216
因為用來要求已關閉的檔案句柄,所以不再強制 oplock。 請注意,如果oplock中斷,因為用來要求它的句柄已關閉,則不需要認可中斷,而不論oplock類型為何。
STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE
0x00000215
oplock 仍在作用中,不過它已不再與用來要求它的檔案句柄相關聯。 呼叫端對檔案使用不同的句柄來要求新的 oplock,而該句柄現在擁有 oplock。

FSCTL_REQUEST_OPLOCK 控制項程式代碼提供比下列相關控制項代碼更有效率的功能:FSCTL_REQUEST_OPLOCK_LEVEL_1FSCTL_REQUEST_OPLOCK_LEVEL_2FSCTL_REQUEST_FILTER_OPLOCKFSCTL_REQUEST_BATCH_OPLOCK。 使用 FSCTL_REQUEST_OPLOCK時,可以在相同的句柄上重複執行要求不同的 oplock 層級,而不需要關閉並重新開啟句柄;其他控制程式代碼要求關閉句柄,然後使用 createFile 重新開啟, 進行這類變更。 這可藉由在重新發出 FSCTL_REQUEST_OPLOCK 控件程式代碼時,作 REQUEST_OPLOCK_INPUT_BUFFER 結構 成員 RequestedOplockLevel 來完成。

下表摘要說明從 FSCTL_REQUEST_OPLOCK 取得之 oplock 類型的快取能力如何對應至層級 2、層級 1 和批次 oplock。

替代控制項程式代碼 對等 RequestedOplockLevel 旗標值 Oplock 類型
FSCTL_REQUEST_BATCH_OPLOCK OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE \| OPLOCK_LEVEL_CACHE_HANDLE RWH
FSCTL_REQUEST_OPLOCK_LEVEL_1 OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE 烏爾曼
FSCTL_REQUEST_OPLOCK_LEVEL_2 OPLOCK_LEVEL_CACHE_READ R

使用 FSCTL_REQUEST_OPLOCK 控件程式代碼搭配 RequestedOplockLevel 成員設定為 OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE 授與 rh 類型的 oplock。 RH oplock 類似於 FSCTL_REQUEST_FILTER_OPLOCK 控件程式代碼所授與的篩選條件 oplock。 不過,請注意,篩選 oplock 一次只允許一個用戶端在檔案上保存 oplock;FSCTL_REQUEST_OPLOCK 一次允許多個用戶端在檔案上鎖定 RH。 另一個差異是,FSCTL_REQUEST_FILTER_OPLOCK 在寫入發生之前需要 oplock 中斷通知,其中 FSCTL_REQUEST_OPLOCK 不會因為 oplock 中斷通知是僅限諮詢的,而且不允許繼續寫入,而不需認可。 如需詳細資訊,請參閱 中斷 Oplocks

如果檔案以非重疊(同步)模式開啟,則 FSCTL_REQUEST_OPLOCK 控件程式代碼會失敗。

如需此作業上重疊 I/O 的影響,請參閱 DeviceIoControl 主題的一節。

在 Windows 8 和 Windows Server 2012 中,下列技術支援此程序代碼。

科技 支援
伺服器消息塊 (SMB) 3.0 通訊協定
SMB 3.0 透明故障轉移 (TFO)
具有向外延展檔案共用的SMB 3.0(SO)
叢集共用磁碟區檔案系統 (CsvFS) 是的
復原檔案系統 (ReFS) 是的

此外,從 Windows 8 和 Windows Server 2012 開始,FSCTL_REQUEST_OPLOCK 控件程式代碼可用來要求目錄和檔案上的 oplock。 目錄中的 oplock 要求可以在 RequestedOplockLevel 成員中指定 OPLOCK_LEVEL_CACHE_READOPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE

當目錄的列舉內容變更時,目錄上的 R 或 RH oplock 會中斷為 None。 例如,在目錄中新增/刪除檔案、變更目錄中檔案的大小、修改目錄中檔案的時間戳等等,都會中斷目錄中的 oplock。 此 oplock 中斷不需要通知,才會發生目錄中的變更;這是僅限諮詢的。

當目錄本身重新命名或刪除時,目錄上的 RH oplock 會中斷為 R。 此 oplock 中斷需要通知,才能發生目錄的變更。

要求

要求 價值
最低支援的用戶端 Windows 7 [僅限傳統型應用程式]
支援的最低伺服器 Windows Server 2008 R2 [僅限傳統型應用程式]
標頭 winioctl.h (包括 Windows.h)

另請參閱