次の方法で共有


CcPinRead 関数 (ntifs.h)

CcPinRead ルーチンは、キャッシュされたファイルの指定されたバイト範囲をピン留めし、ピン留めされたデータをメモリ内のバッファーに読み取ります。

構文

BOOLEAN CcPinRead(
  [in]  PFILE_OBJECT   FileObject,
  [in]  PLARGE_INTEGER FileOffset,
  [in]  ULONG          Length,
  [in]  ULONG          Flags,
  [out] PVOID          *Bcb,
  [out] PVOID          *Buffer
);

パラメーター

[in] FileObject

データの範囲をピン留めするキャッシュされたファイルのファイル オブジェクトへのポインター。

[in] FileOffset

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

[in] Length

必要なデータの長さ (バイト単位)。

[in] Flags

ピン留め操作の実行方法を指定するフラグのビットマスク。 次の値の 1 つ以上の ORed の組み合わせ:

価値 意味
PIN_WAIT 呼び出し元は、データがピン留めされるまで待機状態にすることができます。
PIN_EXCLUSIVE バッファー制御ブロック (BCB) は排他的に取得されます。 このフラグを設定する場合は、PIN_WAITも設定する必要があります。
PIN_NO_READ 既にメモリに常駐しているページのみがピン留めされます。 このフラグを設定する場合は、PIN_WAITも設定する必要があります。
PIN_IF_BCB データは、BCB が既に存在する場合にのみ固定されます。 それ以外の場合、ピンは失敗し、Bcb NULL設定されます。

[out] Bcb

最初の呼び出しでは、バッファー制御ブロック (BCB) へのポインターが返されます。 このポインターは、このバッファーの後続のすべての呼び出しで入力として指定する必要があります。

[out] Buffer

ピン留めされたデータを含むバッファーへのポインター。

戻り値

CcPinRead は、キャッシュされたファイル のデータがピン留めされ、正常に読み取られた場合は TRUE を返し、それ以外の場合は FALSE 返します。

備考

PIN_WAIT フラグが設定されている場合、CcPinRead はピン留め要求を完了し、TRUE返します。 キャッシュされたファイルの必要なページが既にメモリに常駐している場合、データはすぐに固定され、ブロックは行われません。 必要なページが常駐していない場合、呼び出し元は、必要なすべてのページが常駐状態になり、データをピン留めできるようになるまで待機状態になります。 PIN_WAIT フラグが設定されていないが、データをすぐにピン留めできない場合、ccPinRead は FALSE返し、出力パラメーターの値は意味がありません。

その後、呼び出し元が ccPinReadによって読み取られたデータ 変更する場合は、変更されたデータが最終的にディスクに書き込まれるように、CcSetDirtyPinnedData も呼び出す必要があります。

CcPinRead 正常に呼び出されるたびに、後続の ccUnpinDataへの呼び出し 照合する必要があります。

Buffer で返されるポインターは、ccUnpinData 呼び出されるまで有効です。 このポインターがまだ有効な間に ccPinMappedData が呼び出された場合、ポインターは ccPinMappedData 呼び出された後も有効なままです (ただし、ccUnpinData 呼び出されるまでのみ)。

CcPinRead は、キャッシュ マネージャーのビュー境界を越えてデータをピン留めすることはできません。 キャッシュ・マネージャーは、256 KB アライン・ビューでシステム内のファイルを管理します。 (キャッシュ マネージャーのビュー サイズは、システム定義の定数VACB_MAPPING_GRANULARITYで指定されます。この定数は ntifs.h で 256 KB に設定されています)。ピン留めされた領域は、複数の 256 KB ビューにまたがることはできません。 したがって、ピン留めできる最大の領域は 256 KB で、ファイル内の 256 KB で整列されたオフセットから始められます。

キャッシュされたファイルにバイト範囲をピン留めしても、ページがメモリに常駐し続けるわけではありません。 ページがピン留めされている限り、バイト範囲はシステム キャッシュの仮想アドレス空間にマップされたままであることが保証されますが、メモリ マネージャーは、システムのメモリ要求に応じて物理ページをページングできます。

エラーが発生した場合、ccPinRead は、その特定のエラーの状態例外を発生させます。 たとえば、プールの割り当てエラーが発生した場合、ccPinRead STATUS_INSUFFICIENT_RESOURCES例外が発生します。I/O エラーが発生した場合、ccPinRead I/O エラーの状態例外が発生します。 したがって、エラーが発生したかどうかを制御するには、ドライバーは、CcPinRead への呼び出しを try-except または try-finally ステートメント ラップする必要があります。

キャッシュされたファイルのデータをマップするには、CcMapData ルーチンを使用します。 ファイルをキャッシュするには、ccInitializeCacheMap使用します。

必要条件

要件 価値
ターゲット プラットフォーム の 万国
ヘッダー ntifs.h (Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

関連項目

ccInitializeCacheMap の

CcMapData を する

CcPinMappedData

ccPreparePinWrite を する

ccSetDirtyPinnedData の

ccUnpinData を する