IOCTL_LMR_DISABLE_LOCAL_BUFFERING控制程式碼在讀取或寫入遠端檔案資料時,會禁用本地用戶端記憶體中的快取。 這是內部定義的控制程式碼,公開標頭中沒有。
儘管命名慣例不同,此控制碼是以裝置類型的 FILE_DEVICE_NETWORK_FILE_SYSTEM 定義,使其成為檔案系統控制(FSCTL)程式碼,而非裝置 I/O 控制(IOCTL)程式碼。 你必須使用 NtFsControlFile 而非 DeviceIoControl 來傳送。 以下以 DeviceIoControl 慣例作為參考,記錄了控制程式碼與參數。
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to device
IOCTL_LMR_DISABLE_LOCAL_BUFFERING, // dwIoControlCode
(LPVOID) NULL, // lpInBuffer
(DWORD) 0, // nInBufferSize
(LPVOID) NULL, // lpOutBuffer
(DWORD) 0, // nOutBufferSize
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
Parameters
-
hDevice [在]
-
遠端檔案的一個帳柄。 要取得此句柄,請呼叫 CreateFile 函式。
-
dwIoControlCode [in]
-
操作的控制代碼。 使用此操作的值0x140390。
-
lpIn緩衝區
-
未使用,必須是 NULL。
-
nInBufferSize [in]
-
輸入緩衝區的大小,以位元組為單位。 必須是零。
-
lpOutBuffer [結束]
-
未使用,必須是 NULL。
-
nOutBufferSize [in]
-
輸出緩衝區的大小,以位元組為單位。 必須是零。
-
lpBytesReturned [ out]
-
一個指標指向一個變數,接收輸出緩衝區中儲存資料大小(以位元組為單位)。
若輸出緩衝區太小,呼叫失敗,GetLastError 函式回傳 ERROR_INSUFFICIENT_BUFFER,lpBytesReturns 為零。
如果 lpOverlapped 參數為 NULL,則 lpBytesReturn 無法成為 NULL。 即使操作未回傳任何輸出資料且 lpOutBuffer 參數為 NULL,DeviceIoControl 仍會使用 lpBytesReturned。 完成此操作後, lpBytesReturns 的值將失去意義。
如果 lpOverlapped 不是 NULL,lpBytesReturns 可以是 NULL。 若 lpOverlapped 非 NULL 且操作回傳資料,則 lpBytesReturns 在重疊操作完成前即無意義。 要取得回傳的位元組數,請呼叫 GetOverlappedResult 函式。 如果 hDevice 參數與 I/O 完成埠相關聯,你可以透過呼叫 GetQueuedCompletionStatus 函式來取得回傳的位元組數。
-
lp重疊 [in]
-
指向重 疊 結構的指標。
若開啟 hDevice 參數未指定 FILE_FLAG_OVERLAPPED,則忽略 lpOverlapped 。
若以 FILE_FLAG_OVERLAPPED 標誌開啟 hDevice,則該操作會以重疊(非同步)方式執行。 在這種情況下, lpOverlapped 必須指向一個有效的 OVERLAPPED 結構,該結構包含事件物件的句柄。 否則,函式會以不可預測的方式失效。
對於重疊操作, DeviceIoControl 會立即返回,並在操作完成後通知事件物件。 否則,該函式直到操作完成或發生錯誤前不會回傳。
返回值
使用此控制碼呼叫 DeviceIoControl 總是會回傳失敗,因為它是 FSCTL,而非 IOCTL。 改用 ntFsControlFile 。 NtFsControlFile 回傳 一個 NTSTATUS 值; STATUS_SUCCESS 表示手術已成功完成。
Remarks
IOCTL_LMR_DISABLE_LOCAL_BUFFERING控制程式碼由系統內部定義為0x140390,而非公開標頭檔。 特殊用途的應用程式用來在讀取或寫入遠端檔案資料時,禁用本地用戶端記憶體中的快取。 在本地緩衝被停用後,該設定會持續生效,直到所有開啟的檔案 handle 都關閉,且 redirector 清理其內部資料結構。
通用應用程式不應使用 IOCTL_LMR_DISABLE_LOCAL_BUFFERING,因為這可能導致過多的網路流量及相關的效能損失。 IOCTL_LMR_DISABLE_LOCAL_BUFFERING控制碼應僅用於在網路上傳輸大量資料並盡量最大化網路頻寬利用的特殊應用。 例如, CopyFile 和 CopyFileEx 函式利用 IOCTL_LMR_DISABLE_LOCAL_BUFFERING 來提升大型檔案複製效能。
IOCTL_LMR_DISABLE_LOCAL_BUFFERING 不是由本地檔案系統實作,錯誤 ERROR_INVALID_FUNCTION 會導致失敗。 對遠端目錄的 handle 發出 IOCTL_LMR_DISABLE_LOCAL_BUFFERING 控制碼會因錯誤 ERROR_NOT_SUPPORTED而失敗。
參見