次の方法で共有


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 の呼び出しで GUID_ECP_PREFETCH_OPEN GUID を使用するか、IoCreateFileEx ルーチンを して PREFETCH_OPEN_ECP_CONTEXT 構造体をアタッチします。 ファイル システム フィルター ドライバー (フィルター) は、FltFindExtraCreateParameter 呼び出して、PREFETCH_OPEN_ECP_CONTEXT がファイルにアタッチされているかどうかを判断し、適切なアクションを実行できます。 このフィルターは、PREFETCH_OPEN_ECP_CONTEXT コンテキスト構造がカーネル モードから発生したかどうかを判断するために、FltIsEcpFromUserMode ルーチンを呼び出す必要があります。 悪意のあるアプリケーションがプリフェッチャーのスプーフィングを防ぐために、フィルターがユーザー モードから発生した場合、PREFETCH_OPEN_ECP_CONTEXT を受け入れないようにする必要があります。

プリフェッチャーが PREFETCH_OPEN_ECP_CONTEXT 構造体をファイルにアタッチした後、そのファイルに対するすべての追加プリフェッチャー アクティビティには、PREFETCH_OPEN_ECP_CONTEXT アタッチされているファイル オブジェクトが含まれます。 フィルターで作成要求以外のプリフェッチャー ファイル システム要求を識別する必要がある場合、フィルターは独自の状態 (フィルター マネージャーハンドル コンテキストなど) を維持する必要があります。 フィルターは、特定のファイル オブジェクトがプリフェッチャー ファイル オブジェクトであるかどうかを判断するために、独自の状態を維持します。

メモリ マネージャーはプリフェッチャー ファイル オブジェクトをキャッシュできます。 その後、メモリ マネージャーは、キャッシュ マネージャーを使用して、マップされた I/O またはキャッシュされた I/O を実行する他のアプリケーションにプリフェッチャー ファイル オブジェクトを使用できます。 したがって、プリフェッチャー ファイル オブジェクトは、プリフェッチャーがハンドルを閉じる前または後に I/O をページングするために使用できます。 プリフェッチャーがデータを書き込まなくても、このページング I/O にはページング書き込みを含めることができます。 ページングの書き込みは、他のアプリケーションによって生成されます。 メモリ マネージャーは、キャッシュされたプリフェッチャー ファイル オブジェクトを使用して、アプリケーションからデータを書き込みます。 したがって、フィルターは、ページングの書き込みによってトリガーされる処理を実行します。ページングの書き込みがプリフェッチャー ファイル オブジェクトに存在する場合でも、フィルターはその処理を引き続き実行する必要があります。

プリフェッチャー ファイル オブジェクトに対してクリーンアップ操作が行われたとフィルターが判断した場合、そのファイル オブジェクトをプリフェッチャーで開くと見なすべきではありません。

プリフェッチャーが実行する一般的な操作を次に示します (ただし、これらの操作では、プリフェッチャーはファイルの内容を変更しません)。

  • ボリュームの開閉
  • ファイルを開いて閉じる
  • ファイル情報のクエリ
  • ファイル情報を設定する (このオープンの最終アクセス時刻を更新しないようにファイル システムに指示する場合のみ)
  • [Create image and data]\(イメージとデータの作成\) セクション
  • 非同期ページング I/O を実行する

デッドロックが発生する可能性を回避するには、フィルターで次の手順を実行する必要があります。

  • プリフェッチャー操作をブロックしないでください。
  • 他のファイル システム要求を発行せずにプリフェッチャー操作を渡します。

プリフェッチされているデータにアプリケーションまたはドライバーがアクセスするには、ファイルへの独自のハンドルを開くか、セクションまたはその両方を作成する必要があります。

ECP を使用して追加情報をファイルの IRP_MJ_CREATE 操作に関連付ける方法については、「IRP_MJ_CREATE操作で追加の作成パラメーターを使用する を参照してください。

PREFETCH_OPEN_ECP_CONTEXT 構造体は読み取り専用です。 これを使用して、プリフェッチャーオープン ECP に関する情報のみを取得する必要があります。 この問題の詳細については、「System-Defined ECP」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista
ヘッダー ntifs.h (Ntifs.h を含む)

関連項目

FltCreateFileEx2 の

FltIsEcpFromUserMode の

IoCreateFileEx の