次の方法で共有


FsRtlCopyWrite 関数 (ntifs.h)

FsRtlCopyWrite ルーチンは、ユーザー バッファーからキャッシュされたファイルにデータをコピーします。

構文

BOOLEAN FsRtlCopyWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  BOOLEAN          Wait,
  [in]  ULONG            LockKey,
  [in]  PVOID            Buffer,
  [out] PIO_STATUS_BLOCK IoStatus,
  [in]  PDEVICE_OBJECT   DeviceObject
);

パラメーター

[in] FileObject

データの書き込み先となるキャッシュ されたファイルのファイル オブジェクトへのポインター。

[in] FileOffset

キャッシュされたファイル内の開始バイト オフセットを指定する変数へのポインター。

[in] Length

書き込むデータの長さ (バイト単位)。

[in] Wait

すべてのデータがコピーされるまで呼び出し元を待機状態にできる場合は TRUE に設定し、それ以外の場合は FALSE に設定します。

[in] LockKey

ロックするバイト範囲に関連付けられている値。 ロックする範囲が、既に非決定的ロックでロックされている別の範囲と重複している場合、または読み取る範囲が、既に非決定的にロックされている別の範囲のサブ範囲である場合、このパラメーターの値は、その非決定的ロックのキーである必要があります。ロックは、呼び出し元スレッドの親プロセスによって保持されている必要があります。 それ以外の場合、このパラメーターは無効です。

[in] Buffer

データのコピー元となるバッファーへのポインター。

[out] IoStatus

最終的な完了状態と操作に関する情報を受け取る呼び出し元によって割り当てられた構造体へのポインター。 データが正常にコピーされた場合、IoStatus.Status にはSTATUS_SUCCESSが含まれます。 すべてのデータが正常にコピーされない場合は、IoStatus.Information コピーされた実際のバイト数が含まれます。

[in] DeviceObject

ファイル データを保持するマウントされたボリュームのデバイス オブジェクトへのポインター。

戻り値

FsRtlCopyWrite は、コピー要求が完了した場合は TRUE を返し、それ以外の場合は FALSE を返します。 TRUE の戻り値は、必ずしもコピー操作が成功したことを意味するわけではないことに注意してください。

FsRtlCopyWrite が FALSE を返す場合、または IoStatus の内容 コピー操作が失敗したことを示す場合、呼び出し元は、fsRtlCopyWrite呼び出す代わりに書き込み IRP を割り当てる必要があります。

備考

ファイル システム固有の高速 I/O 書き込みルーチンを実装するのではなく、ファイル キャッシュをサポートするファイル システムの開発者は、高速 I/O 書き込み要求を処理するためのファイル システムのエントリ ポイントとして FsRtlCopyWrite を使用することを検討する必要があります。 そのためには、ファイル システムの DriverEntry ルーチンが、ファイル システム ドライバー オブジェクトのFAST_IO_DISPATCH構造で FastIoWrite エントリ ポイントを FsRtlCopyWrite に設定する必要があります。 さらに、ファイル システムは次の操作を行う必要があります。

  1. 高速 I/O を実行するファイルごとに、ファイル システムはFSRTL_COMMON_FCB_HEADER構造体を割り当てて初期化する必要があります。

    ほとんどのファイル システムでは、ファイル制御ブロック (FCB) にFSRTL_COMMON_FCB_HEADER構造を含めるか、または開いているファイルの状態を維持するために使用される同等の構造を含めることで、これを実現します。

    FSRTL_COMMON_FCB_HEADER構造体の記憶域は、通常、ページング されたプールから割り当てられます。

  2. 高速 I/O が実行されるファイルごとに、ファイル・システムはファイルのファイル・オブジェクトをFSRTL_COMMON_FCB_HEADER構造にリンクする必要があります。 これを行うには、各ファイル オブジェクトの FsContext メンバーを、この構造体 (または FCB またはFSRTL_COMMON_FCB_HEADER構造体を含む他の構造体) を指すように設定します。

  3. ファイルをキャッシュする場合、ファイル システムは、ファイルのFSRTL_COMMON_FCB_HEADER構造体の IsFastIoPossible メンバーを適切な値に設定する必要があります。 この値は、ファイルがキャッシュされている限り、必要に応じて更新する必要があります。

    特に、ファイル システムは、キャッシュされたファイルに排他的なバイト範囲ロックが存在するとすぐに、FSRTL_COMMON_FCB_HEADER構造体の IsFastIoPossible メンバーを FastIoIsQuestionable を するように設定する必要があります。

待機 が TRUE の場合、FsRtlCopyWrite はデータをコピーして TRUE を返す必要があります。 キャッシュされたファイルの必要なページが既にメモリに常駐している場合、データはすぐにコピーされ、ブロックは発生しません。 必要なページが常駐していない場合、呼び出し元は、必要なすべてのページが常駐状態になり、データをコピーできるようになるまで待機状態になります。

Wait が FALSE の場合、FsRtlCopyWrite はブロックを拒否し、ファイルのメイン リソースを取得できない場合、またはキャッシュされたファイルの必要なページがまだメモリに常駐していない場合は FALSE を返します。

ファイル システムの FastIoCheckIfPossible ルーチンは、FileOffset と Length で定義されたバイト範囲に、呼び出し元が適切な LockKey 値を渡さない排他的にロックされたバイト範囲を含めないようにします。 ファイル システムがバイト範囲ロックを管理するために FsRtlXxxLockYyy サポート ルーチンを使用する場合は、fsRtlCopyReadを呼び出す前に、FastIoCheckIfPossible ルーチンから FsRtlFastCheckLockForWrite を呼 び出すことによって実現できます。

ファイルをキャッシュするには、CcInitializeCacheMap ルーチンを使用します。

必要条件

要件 価値
ターゲット プラットフォーム の 万国
ヘッダー ntifs.h (Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 を する HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

関連項目

ccInitializeCacheMap の

FsRtlCopyRead の

FsRtlFastCheckLockForWrite