ストレージ デバイス スタック、ストレージ ボリューム、ファイル システム スタック

Note

最適な信頼性とパフォーマンスを実現するには、レガシ ファイル システム フィルター ドライバーではなく、フィルター マネージャーのサポートがあるファイル システム ミニフィルター ドライバーを使用します。 レガシ ドライバーをミニフィルター ドライバーに移植するには「レガシ フィルター ドライバーの移植ガイドライン」を参照してください。

ファイル システム レガシ フィルター ドライバーをファイル システムとボリュームに接続する方法を確認する前に、ストレージ デバイス スタック、ストレージ ボリューム、およびファイル システム スタックの関係を理解する必要があります。

ストレージ デバイス スタック

ほとんどの記憶域ドライバーは PnP デバイス ドライバーであり、PnP マネージャーによって読み込まれ、管理されます。 記憶域デバイスは、コンピューター上のすべての物理デバイスまたは論理デバイスのデバイス ノード (devnode) を含む PnP デバイス ツリーで表されます。 ファイル システムとファイル システム フィルター ドライバーは PnP デバイス ドライバーではないことに注意してください。そのため、PnP デバイス ツリー にはそれらの devnode は含まれません。

特定のストレージ デバイスの devnode には、デバイスの ストレージ デバイス スタック が含まれています。これは、デバイスのストレージ デバイス ドライバーを表す接続されたデバイス オブジェクトのチェーンです。 ディスクなどのストレージ デバイスには 1 つ以上の論理ボリューム (パーティションまたは動的ボリューム) が含まれている可能性があるため、多くの場合、ストレージ デバイス スタック自体はスタックよりもツリーのように見えます。 このツリーのルートは、ストレージ アダプターまたはスタックと統合された別のデバイス スタックの機能デバイス オブジェクト (FDO) です。 このツリーのリーフは、論理ボリューム (ストレージ ボリュームとも呼ばれます) の物理デバイス オブジェクト (PDO) であり、ファイル システム ボリュームをマウントできます。

一般的なストレージ デバイス スタックの図と説明については「ストレージ デバイス設計ガイド」の次のセクションを参照してください。

ストレージ ボリューム

ボリュームは、固定ディスク、フロッピー ディスク、CD-ROM などのストレージ デバイスであり、ディレクトリとファイルを格納するようにフォーマットされます。 大きなボリュームは、パーティションとも呼ばれる複数の論理ボリュームに分割できます。 各論理ボリュームは、NTFS、FAT、CDFS などの特定のメディア ベースのファイル システムで使用されるようにフォーマットされます。

ストレージ ボリューム (ストレージ デバイス オブジェクト) は、システムの論理ボリュームを表すデバイス オブジェクト (通常は物理デバイス オブジェクト (PDO)) です。 ストレージ デバイス オブジェクトはストレージ デバイス スタックに存在しますが、スタック内の最上位のデバイス オブジェクトであるとは限りません。

ファイル システムがストレージ ボリュームにマウントされると、ファイル システムにボリュームを表すファイル システム ボリューム デバイス オブジェクト (VDO) が作成されます。 ファイル システム VDO は、ボリューム パラメーター ブロック (VPB) と呼ばれる共有オブジェクトを使用して、ストレージ デバイス オブジェクトにマウントされます。

マウント マネージャー

マウント マネージャーは、ボリューム名、ドライブ文字、ボリューム マウント ポイントなどのストレージ ボリューム情報を管理する I/O システムの一部です。 新しいストレージ ボリュームがシステムに追加されると、マウント マネージャーには次のいずれかの方法で到着が通知されます。

  • ストレージ ボリュームを作成したクラス ドライバーは、IoRegisterDeviceInterface を呼び出して、MOUNTDEV_MOUNTED_DEVICE_GUID インターフェイス クラスに新しいインターフェイスを登録します。 これが発生すると、プラグ アンド プレイ デバイス インターフェイス通知メカニズムによって、システムへのボリュームの到着がマウント マネージャーに通知されます。

  • ストレージ ボリュームのドライバーは、I/O 制御コードの IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION を指定して 、マウント マネージャーに IRP_MJ_DEVICE_CONTROL 要求を送信します。 この要求は、IoBuildDeviceIoControlRequest を呼び出すことによって作成できます。

一意のボリューム名

マウント マネージャー は、ボリューム ドライバーに次の情報を照会することで、新しいストレージ ボリュームの到着に応答します。

  • システム オブジェクト ツリーの「デバイス」ディレクトリにあるボリュームの非永続デバイス オブジェクト名 (またはターゲット名) (例: "\Device\HarddiskVolume1")

  • ボリュームのグローバル一意識別子 (GUID) (一意のボリューム名とも呼ばれます)

  • ドライブ文字 ("\DosDevices\D:" など) など、ボリュームに対して推奨される永続的なシンボリック リンク名

ストレージ ドライバーとマウント マネージャーの間の相互作用の詳細については「ストレージ クラス ドライバーでのマウント マネージャー要求のサポート」を参照してください。

ファイル システム スタック

ファイル システム ドライバーは、コントロール デバイス オブジェクト (CDO) とボリューム デバイス オブジェクト (VDO) の 2 種類のデバイス オブジェクトを作成します。 ファイル システム スタックは、これらのデバイス オブジェクトの 1 つと、それに接続されているファイル システム フィルター ドライバーのフィルター デバイス オブジェクトで構成されます。 ファイル システムのデバイス オブジェクトは常にスタックの下部を形成します。

ファイル システム CDO

ファイル システムの CDO は、個々のボリュームではなくファイル システム全体を表し、グローバル ファイル システム キューに格納されます。 ファイル システムは、DriverEntry ルーチンに 1 つ以上の名前付き CDO を作成します。 たとえば、FastFat では、固定メディア用とリムーバブル メディア用の 2 つの CDO が作成されます。 CDFS にはリムーバブル メディアしかないため、CDO は 1 つだけ作成されます。

ファイル システム CDO には名前を付ける必要があります。 これは、ファイル システム フィルター ドライバーと多くのカーネル モード サポート ルーチンが、それらを区別する方法として、VDO と CDO の違いに依存しているためです。

ファイル システム VDO

ファイル システムの VDO は、ファイル システムによってマウントされたボリュームを表します。 ファイル システムは、ボリュームをマウントするときに VDO を作成します。通常は、ボリューム マウント要求に応答します。 CDO とは異なり、VDO は常に特定の論理ストレージ デバイスまたは物理ストレージ デバイスに関連付けられます。

Note

CDO とは異なり、ボリューム デバイス オブジェクトに名前を付けるとセキュリティ ホールが作成されるため、VDO に名前を付けてはなりません。