Share via


プレースホルダーについて

ファイル システム プレースホルダーは、ファイルまたは他の場所に存在するディレクトリの実際のコンテンツを表すファイルです。 この最適化により、ファイルまたはディレクトリの実際のコンテンツを他の場所に配置し、必要に応じてフェッチできます。 実際のコンテンツには、メタデータ、ファイル データ、ディレクトリ エントリが含まれます。

プレースホルダーには、ファイルまたはディレクトリを指定できます。 実際のファイルまたはディレクトリ メタデータの一部、または実際のファイルデータまたはディレクトリ エントリの一部を含む場合があります。 プレースホルダー ファイルは、FILE_ATTRIBUTE_SPAR Standard Edition_FILE ビット が設定されたスパース ファイルとしてマークされます。

通常、プレースホルダーは、ファイル システム ミニフィルターが所有および管理する再解析ポイントです。 所有するミニフィルターは仮想化を実現するためのものであり、プレースホルダーがファイル システム上の通常のファイルやディレクトリのように見えたり動作したりできるようにします。 これらの仮想化ドライバーは、プレースホルダーで IO 要求を傍受し、ファイル システムのような動作を容易にします。 ProjFsCloud Files は、プレースホルダーを使用する Windows の仮想化プラットフォームの 2 つの例です。

プレースホルダーを所有するミニフィルターは、IO を満たすためにこのような IO 要求を適切に処理できます。 たとえば、アプリケーションが退避されたプレースホルダー ファイルを読み取ろうとした場合、ミニフィルターは IO 要求を満たすためにファイル データを提供します。

ミニフィルターの所有では、ユーザー モードまたは IO スタック内のそれらの上にあるコンポーネントから、その上に送信される IO 要求に対してのみ仮想化を提供できます。

プレースホルダーを所有していないミニフィルターでは、FltReadFileFltWriteFile などの API を使用して、以下のフィルターを対象とした IO 操作を発行できます。 所有していないミニフィルターが、所有するミニフィルターの下からプレースホルダー ファイルに対してターゲット IO 要求を発行した場合、所有ミニフィルターは IO 要求を適切に満たすことはできません。

たとえば、フィルターが、所有するミニフィルターに表示されない退避されたプレースホルダー ファイルに対して対象の FltReadFile を発行した場合、プレースホルダーがスパース ファイルである可能性があるため、ターゲット フィルターは実際のデータではなくゼロ (0) のブロックを取得する可能性があります。 システムが 0 のブロックをフェッチした読み取りをキャッシュすると、この読み取りによってキャッシュが汚染され、システムが汚染されたキャッシュをディスクにフラッシュすると、ファイル データが破損する可能性があります。 そのため、ミニフィルターでプレースホルダーを適切に処理することが不可欠です。