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_1、FSCTL_REQUEST_OPLOCK_LEVEL_2、FSCTL_REQUEST_FILTER_OPLOCK和 FSCTL_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_READ
或 OPLOCK_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) |