コントロール コードIOCTL_LMR_DISABLE_LOCAL_BUFFERING

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 の場合、lpBytesReturnedNULL にすることはできません。 操作が出力データを返せず、 lpOutBuffer パラメーターが NULL の場合でも、 DeviceIoControllpBytesReturned を使用します。 このような操作の後、 lpBytesReturned の値は意味がありません。

lpOverlappedNULL でない場合、lpBytesReturned には NULL を指定できます。 lpOverlappedNULL ではなく、操作がデータを返す場合、重複する操作が完了するまで lpBytesReturned は意味がありません。 返されたバイト数を取得するには、 GetOverlappedResult 関数を呼び出します。 hDevice パラメーターが I/O 完了ポートに関連付けられている場合は、GetQueuedCompletionStatus 関数を呼び出すことによって返されるバイト数を取得できます。

lpOverlapped [in]

OVERLAPPED 構造体へのポインター。

FILE_FLAG_OVERLAPPEDを指定せずに hDevice パラメーターを開いた場合、lpOverlapped は無視されます。

hDeviceFILE_FLAG_OVERLAPPED フラグで開かれた場合、操作は重複する (非同期) 操作として実行されます。 この場合、 lpOverlapped は、イベント オブジェクトへのハンドルを含む有効な OVERLAPPED 構造体を指す必要があります。 それ以外の場合、関数は予期しない方法で失敗します。

重複する操作の場合、 DeviceIoControl はすぐに返され、操作が完了するとイベント オブジェクトが通知されます。 それ以外の場合、操作が完了するまで、またはエラーが発生するまで、関数は戻りません。

値を返す

このコントロール コード で DeviceIoControl を呼び出すと、IOCTL ではなく FSCTL であるため、常にエラーが返されます。 代わりに NtFsControlFile を使用してください。 NtFsControlFileNTSTATUS 値を返します。 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で失敗します。

こちらも参照ください

NtFsControlFile

DeviceIoControl