IOCTL_LMR_DISABLE_LOCAL_BUFFERING制御コードは、リモート ファイルからデータを読み取ったり、リモート ファイルにデータを書き込んだりするときに、データのローカル クライアント側のメモリ内キャッシュを無効にします。 これは、パブリック ヘッダーでは使用できない内部定義のコントロール コードです。
名前付け規則にもかかわらず、このコントロール コードはデバイスの種類のFILE_DEVICE_NETWORK_FILE_SYSTEMで定義され、デバイス I/O コントロール (IOCTL) コードではなく、ファイル システム コントロール (FSCTL) コードになります。 DeviceIoControl ではなく NtFsControlFile を使用して送信する必要があります。 コントロール コードとパラメーターについては、参照用 の 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 [in]
-
リモート ファイルへのハンドル。 このハンドルを取得するには、 CreateFile 関数を呼び出します。
-
dwIoControlCode [in]
-
操作の制御コード。 この操作に0x140390値を使用します。
-
lpInBuffer
-
使用せず、 NULL にする必要があります。
-
nInBufferSize [in]
-
入力バッファーのサイズ (バイト単位)。 ゼロを指定してください。
-
lpOutBuffer [out]
-
使用せず、 NULL にする必要があります。
-
nOutBufferSize [in]
-
出力バッファーのサイズ (バイト単位)。 ゼロを指定してください。
-
lpBytesReturned [out]
-
出力バッファーに格納されているデータのサイズをバイト単位で受け取る変数へのポインター。
出力バッファーが小さすぎる場合、呼び出しは失敗し、 GetLastError 関数は ERROR_INSUFFICIENT_BUFFERを返し、 lpBytesReturned は 0 です。
lpOverlapped パラメーターが NULL の場合、lpBytesReturned を NULL にすることはできません。 操作が出力データを返せず、 lpOutBuffer パラメーターが NULL の場合でも、 DeviceIoControl は lpBytesReturned を使用します。 このような操作の後、 lpBytesReturned の値は意味がありません。
lpOverlapped が NULL でない場合、lpBytesReturned には NULL を指定できます。 lpOverlapped が NULL ではなく、操作がデータを返す場合、重複する操作が完了するまで lpBytesReturned は意味がありません。 返されたバイト数を取得するには、 GetOverlappedResult 関数を呼び出します。 hDevice パラメーターが I/O 完了ポートに関連付けられている場合は、GetQueuedCompletionStatus 関数を呼び出すことによって返されるバイト数を取得できます。
-
lpOverlapped [in]
-
OVERLAPPED 構造体へのポインター。
FILE_FLAG_OVERLAPPEDを指定せずに hDevice パラメーターを開いた場合、lpOverlapped は無視されます。
hDevice が FILE_FLAG_OVERLAPPED フラグで開かれた場合、操作は重複する (非同期) 操作として実行されます。 この場合、 lpOverlapped は、イベント オブジェクトへのハンドルを含む有効な OVERLAPPED 構造体を指す必要があります。 それ以外の場合、関数は予期しない方法で失敗します。
重複する操作の場合、 DeviceIoControl はすぐに返され、操作が完了するとイベント オブジェクトが通知されます。 それ以外の場合、操作が完了するまで、またはエラーが発生するまで、関数は戻りません。
値を返す
このコントロール コード で DeviceIoControl を呼び出すと、IOCTL ではなく FSCTL であるため、常にエラーが返されます。 代わりに NtFsControlFile を使用してください。 NtFsControlFile は NTSTATUS 値を返します。 STATUS_SUCCESS 操作が正常に完了したことを示します。
Remarks
IOCTL_LMR_DISABLE_LOCAL_BUFFERING制御コードは、パブリック ヘッダー ファイルではなく、0x140390としてシステムによって内部的に定義されます。 これは、リモート ファイルからデータを読み取ったり、リモート ファイルにデータを書き込んだりするときに、データのローカル クライアント側のメモリ内キャッシュを無効にするために、特殊な用途のアプリケーションで使用されます。 ローカル バッファリングが無効になった後、ファイルに対して開いているハンドルがすべて閉じられ、リダイレクターによって内部データ構造がクリーンアップされるまで、設定は有効なままになります。
汎用アプリケーションでは、ネットワーク トラフィックが過剰になり、パフォーマンスが低下する可能性があるため、 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で失敗します。 リモート ディレクトリ ハンドルで IOCTL_LMR_DISABLE_LOCAL_BUFFERING 制御コードを発行すると、エラー ERROR_NOT_SUPPORTEDで失敗します。
こちらも参照ください