PREFETCH_OPEN_ECP_CONTEXT 構造体 (ntifs.h)
PREFETCH_OPEN_ECP_CONTEXT構造体は、プリフェッチャーがファイルに対して特定のオープン要求を実行するかどうかを示します。
構文
typedef struct _PREFETCH_OPEN_ECP_CONTEXT {
PVOID Context;
} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT;
メンバー
Context
開いている要求に関連付けられている不透明なコンテキストへのポインター。
注釈
プリフェッチャーは、ディスク アクセスの効率を高め、パフォーマンスを向上させるために、キャッシュ マネージャーとメモリ マネージャーと緊密に統合されたオペレーティング システムのコンポーネントです。 他のコンポーネントがプリフェッチャーに干渉すると、システムのパフォーマンスが低下し、デッドロックが発生する可能性があります。 したがって、プリフェッチャーは 、プリ フェッチャーがそのファイルに対してオープン要求を実行したことを伝えるために、PREFETCH_OPEN_ECP_CONTEXT構造体をファイルにアタッチします。 プリフェッチャーは、FltCreateFileEx2 または IoCreateFileEx ルーチンの呼び出しでGUID_ECP_PREFETCH_OPEN GUID を使用して、PREFETCH_OPEN_ECP_CONTEXT構造体をアタッチします。 ファイル システム フィルター ドライバー (フィルター) は 、FltFindExtraCreateParameter を呼び出して 、PREFETCH_OPEN_ECP_CONTEXT がファイルにアタッチされているかどうかを判断し、適切なアクションを実行できます。 フィルターは 、fltIsEcpFromUserMode ルーチンを呼び出して 、PREFETCH_OPEN_ECP_CONTEXT コンテキスト構造がカーネル モードから発生したかどうかを判断する必要があります。 悪意のあるアプリケーションがプリフェッチャーをスプーフィングするのを防ぐために、フィルターはユーザー モードから発生した場合 、PREFETCH_OPEN_ECP_CONTEXT を受け入れないようにする必要があります。
プリフェッチャーが PREFETCH_OPEN_ECP_CONTEXT 構造体をファイルにアタッチすると、そのファイルに対するすべての追加プリフェッチャー アクティビティには、 PREFETCH_OPEN_ECP_CONTEXT アタッチされているファイル オブジェクトが含まれます。 フィルターで作成要求以外のプリフェッチャー ファイル システム要求を識別する必要がある場合、フィルターは独自の状態 (フィルター マネージャーハンドル コンテキストなど) を維持する必要があります。 フィルターは、特定のファイル オブジェクトがプリフェッチャー ファイル オブジェクトであるかどうかを判断するために、独自の状態を維持します。
メモリ マネージャーはプリフェッチャー ファイル オブジェクトをキャッシュできます。 メモリ マネージャーは、キャッシュ マネージャーを使用して、マップされた I/O またはキャッシュされた I/O を実行する他のアプリケーションのプリフェッチャー ファイル オブジェクトを使用できます。 したがって、プリフェッチャー ファイル オブジェクトは、プリフェッチャーがハンドルを閉じる前または後に I/O をページングするために使用できます。 プリフェッチャーがデータを書き込むことはありませんが、このページング I/O にはページング書き込みを含めることができます。 ページングの書き込みは、他のアプリケーションによって生成されます。 メモリ マネージャーは、キャッシュされたプリフェッチャー ファイル オブジェクトを使用して、アプリケーションからデータを書き込みます。 そのため、フィルターは、ページングの書き込みによってトリガーされる作業を実行します。ページングの書き込みがプリフェッチャー ファイル オブジェクトに存在する場合でも、フィルターはその処理を引き続き実行する必要があります。
プリフェッチャー ファイル オブジェクトでクリーンアップ操作が行われたとフィルターで判断された場合、フィルターでは、そのファイル オブジェクトがプリフェッチャーで開かれているとは見なされなくなります。
プリフェッチャーが実行する一般的な操作を次に示します (ただし、これらの操作では、プリフェッチャーはファイルの内容を変更しません)。
- ボリュームを開いて閉じる
- ファイルを開いて閉じる
- ファイル情報のクエリ
- ファイル情報を設定する (このオープンの最終アクセス時刻を更新しないようにファイル・システムに指示する場合のみ)
- [イメージとデータの作成] セクション
- 非同期ページング I/O の実行
デッドロックが発生する可能性のある状況を回避するには、フィルターで次の手順を実行する必要があります。
- プリフェッチャー操作をブロックしないでください。
- 他のファイル システム要求を発行せずにプリフェッチャー操作を渡します。
プリフェッチされているデータにアクセスするアプリケーションまたはドライバーの場合は、ファイルへの独自のハンドルを開くか、セクションまたはその両方を作成する必要があります。
ECP を使用してファイルの IRP_MJ_CREATE 操作に追加情報を関連付ける方法については、「 IRP_MJ_CREATE操作での追加の作成パラメーターの使用」を参照してください。
PREFETCH_OPEN_ECP_CONTEXT構造体は読み取り専用です。 これを使用して、プリフェッチャーが開いている ECP に関する情報のみを取得する必要があります。 この問題の詳細については、「 システム定義 ECP」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista |
Header | ntifs.h (Ntifs.h を含む) |