IOCTL_LMR_DISABLE_LOCAL_BUFFERINGコントロール コード
IOCTL_LMR_DISABLE_LOCAL_BUFFERING制御コードは、リモート ファイルからデータを読み取ったり、リモート ファイルにデータを書き込んだりするときに、データのローカル クライアント側のメモリ内キャッシュを無効にします。 これは、パブリック ヘッダーでは使用できない内部定義の制御コードです。
この操作を実行するには、次のパラメーターを指定して 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
);
パラメーター
-
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 は 0 以外の値を返します。
操作が失敗するか、保留中の場合、 DeviceIoControl は 0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
注釈
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で失敗します。
こちらもご覧ください