最近の記事
- 4/22 - 思い出の紙時計
- 3/29 - さくらインターネットの VPS リニューアル
- 3/19 - SSHD への攻撃を分析してみた
- 3/9 - キーボードの過酷さ
- 3/8 - .NET のパフォーマンスについて
- 3/7 - phpMyAdmin への攻撃
- 3/1 - ミイラ取りがミイラになりかけた
- 2/22 - URL を知らなければ安全だと?
- 2/16 - 決意
- 1/30 - ルーターの UPnP 対応状況
Entering Passive Mode
NTFS のボリュームマウントポイントは、
ディレクトリに設定することができ、
リンクの処理は NTFS によって行われる。
そのため、一度設定したマウントポイントは、
OS を再起動しても維持されている。
また、ディスクを異なる PC に持っていっても、
リンク先のボリュームが存在すれば利用できる。
こんなことが可能なのは、リンク先に関する情報が、
ディスク自身に保存されているからである。
しかしながら、一般的にディレクトリが持てる情報は、
自分の中に含まれるファイルやサブディレクトリの情報や、
ディレクトリの属性や作成日時しかない。
そこで、NTFS はディレクトリに対して特殊な属性を持たせ、
拡張情報を追加することで対応している。
まず、マウントポイントとして機能するディレクトリには、
読み取り専用やシステム属性と同じように、
「リパースポイント」という属性が設定されている。
この属性は <winnt.h> ヘッダファイルに、
FILE_ATTRIBUTE_REPARSE_POINT として定義されており、
GetFileAttributes などの API で取得できる。
また、リパースポイントの属性を持つディレクトリには、
リパースタグという特殊な追加情報が関連付けられている。
リパースは、再解析という意味であり、
この属性が設定されたディレクトリは、
NTFS ドライバが特別な扱いをする。
その処理は、リパースタグの内容に沿って行われる。
リパースタグは、タグの種類とそのデータで構成されている。
NTFS は、リパースポイントを色々な用途に使えるように、
タグの種類によって機能を定義できるようにしている。
ボリュームマウントポイント機能は、
リパースタグに設定できる 1 つの種類に過ぎず、
そのタグの種類を表す値は、<winnt.h> に、
IO_REPARSE_TAG_MOUNT_POINT として定義されている。
他の種類のリパースタグもある。最新の開発キットには、
IO_REPARSE_TAG_SYMBOLIC_LINK なんて値も確認できる。
近い将来シンボリックリンクが実装されるのかもしれない。
ディレクトリに設定されているリパースタグの種類は、
FindFirstFile などの API で得ることができる。
ボリュームマウントポイントの場合は、
リパースタグのデータとして、
リンク先のパス情報を持っている。
つまり、以下のようなイメージである。
パス: d:\mnt\system
属性: FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_DIRECTORY
タグの種類: IO_REPARSE_TAG_MOUNT_POINT
タグデータ: Volume{2c4c2620-c203-11d9-a821-806d6172696f}
NTFS ドライバは、ディレクトリにアクセスする際、
この情報を元に、リンク先のボリュームを識別し、
ボリュームが、まるでディレクトリの配下にあるように
パスで扱うことができるように処理しているのである。
コメント (0 件)