この資料では、Windows Server 2008 および Windows Vista でディスクおよびボリュームへの直接アクセスを制限するためにファイル システムおよびストレージ スタックに対して加えられた変更について説明します。
背景
プログラムで、排他アクセスを行うファイル ハンドルを開くときには、そのプログラムは、ファイルの内容が変更できないと想定しています。ただし、以下の条件に該当する場合にはファイルの内容を変更できます。
-
別のプログラムで、ファイルが存在するボリュームまたはディスクに対するファイル ハンドルが開かれている。
-
そのプログラムによって、ファイルが置かれている場所に対して変更が行われる。
ボリュームに対する排他アクセスを最初に取得せずに、プログラムが、ファイル システムによってマウントされているボリュームに直接書き込むと、破損が発生したりシステムが不安定になったりすることがあります。これは、ボリュームへの書き込みがファイル システムによる書き込みと競合するためです。このような競合が発生すると、ボリュームの内容が整合性の取れていない状態のままになることがあります。
この問題の影響を軽減するために、ディスクまたはボリュームへの直接アクセスを制限するようにファイル システムおよびストレージ スタックに対して変更が加えられました。
ファイル システムおよびストレージ スタックに対する変更の詳細
-
ファイル システムは、以下の条件に該当する場合にのみボリューム ハンドルに書き込むことができます。
- 条件 1 : 書き込み対象のセクタがブート セクタである。
注 : この条件は、ウイルス対策プログラム、セットアップ プログラム、システム ボリュームのスタートアップ コードを更新する必要があるその他のプログラムなどのプログラムをサポートするために存在します。システム ボリュームはロックできません。
- 条件 2 : 書き込み対象のセクタがファイル システム領域の外部にある。
注 : ファイル システム領域の終端とボリューム領域の終端との間にある領域は、ファイル システムによって制御されません。このため、書き込むためにボリュームをロックする必要はありません。
- 条件 3 : 排他的な書き込みアクセスを要求することによってボリュームが暗黙的にロックされている。
- 条件 4 : ロック要求またはマウント解除要求によってボリュームが明示的にロックされている。
- 条件 5 : 書き込み要求に、条件 2 を無視する必要があることを示す SL_FORCE_DIRECT_WRITE フラグが設定されている。
注 : 最初にボリュームをロックせずにボリュームの空き領域に書き込むファイル システム フィルタがあります。ファイル システム フィルタがこれを行う必要がある場合、書き込み要求に、ファイル システムに書き込みが発生することを通知するフラグを設定できます。このフラグを設定できるのは、カーネル モードの内部のみです。
-
ファイル システムおよびストレージ スタックに対する変更は、ボリュームがマウントされていない場合やボリュームにファイル システムがない場合には適用されません。
-
UDFS ファイル システムおよび FASTFAT ファイル システムでは、ファイル システムおよびストレージ スタックに対する変更が制限されます。これらの変更は、ディスク タイプのメディアのみに制限されます。
注 : ほとんどの CD マスタリング プログラムは、最初にボリュームをロックせずに、ボリュームに直接書き込みます。一部の CD マスタリング プログラムでは、ファイル システム層を回避することすらあります。この場合、このようなプログラムはストレージ層に直接書き込みます。ページング ファイルはディスク ドライブ上でしかホストできないため、ファイル システムおよびストレージ スタックに対して加えられた変更を光学式ドライブに適用する必要はありません。
-
ストレージ ドライバは、以下の条件に該当する場合にディスク ハンドルに書き込むことができます。
- 条件 1 : 書き込み対象のセクタがボリューム内に存在しない。
注 : プログラムは、ボリュームの外部にあるセクタを使用してメタデータを格納します。パーティション テーブルもボリュームの外部にあるセクタにあります。これらのセクタはファイル システムによって制御されないため、セクタに対するアクセスをブロックする必要はありません。
- 条件 2 : 書き込み対象のセクタが、明示的にロックされているマウントされたボリュームにある。
- 条件 3 : 書き込み対象のセクタが、マウントされていないボリュームにある、またはファイル システムがないボリュームにある。
-
ファイル システムおよびストレージ スタックに対する変更は、ボリュームのパリティ ブロックにも適用されます。
-
ファイル システムおよびストレージ スタックに対する変更は、32 ビット版のシステムと 64 ビット版のシステムに適用されます。
さまざまな WriteFile API に加えて、ボリュームまたはディスクに対する書き込みを行うために使用されることがあるデバイス IO 制御要求があります。ファイル システムおよびストレージ スタックに対する変更は、デバイス IO 制御要求にも適用されます。デバイス IO 制御要求には以下のコマンドがあります。
-
IOCTL_DISK_COPY_DATA
-
IOCTL_SCSI_PASS_THROUGH
-
IOCTL_SCSI_PASS_THROUGH_DIRECT
-
SCSIOP_WRITE6
-
SCSIOP_WRITE
-
SCSIOP_WRITE_VERIFY
-
SCSIOP_WRITE_SAME
-
SCSIOP_WRITE_LONG
-
SCSIOP_XDWRITE
-
SCSIOP_XPWRITE
-
SCSIOP_XDWRITE_READ
-
SCSIOP_WRITE12
-
SCSIOP_WRITE_VERIFY12
-
SCSIOP_WRITE16
-
SCSIOP_WRITE_VERIFY16
-
SCSIOP_WRITE_SAME16
-
SCSIOP_WRITE_LONG16
-
SCSIOP_WRITE_XDWRITE_EXTENDED16
-
SCSIOP_WRITE_COPY
-
SCSIOP_WRITE_COPY_COMPARE
上記のコマンドでは、LBA ビットに対して照会を行い、オフセットが CHS 形式で指定されたのか、LBA 形式で指定されたのかを判断します。システムで実際のジオメトリが取得できないため、CHS 形式で送信される要求はすべて失敗します。すべての新式のディスクではオフセットが LBA 形式であると想定されるため、これが問題になることはありません。
CDB はわずか 16 バイトであるため、32 バイトの SCSI 書き込みコマンドはフィルタリングされません。また、拡張されたコピー コマンドはフィルタリングされません。write long コマンドの転送長はバイト単位ですが、その他のすべてのコマンドではセクタ単位です。
以下のコマンド グループは古いため、失敗します。
-
IOCTL_ATA_PASS_THROUGH
-
IOCTL_ATA_PASS_THROUGH_DIRECT
-
IDE_COMMAND_WRITE
-
IDE_COMMAND_WRITE_DMA
-
IDE_COMMAND_WRITE_DMA_QUEUED
-
IDE_COMMAND_WRITE_MULTIPLE
-
IDE_COMMAND_WRITE_EXT
-
IDE_COMMAND_WRITE_DMA_EXT
-
IDE_COMMAND_WRITE_DMA_FUA_EXT
-
IDE_COMMAND_WRITE_DMA_QUEUED_EXT
-
IDE_COMMAND_WRITE_DMA_QUEUED_FUA_EXT
-
IDE_COMMAND_WRITE_MULTIPLE_EXT
-
IDE_COMMAND_WRITE_MULTIPLE_FUA_EXT
プログラムの互換性の問題と影響の軽減
ファイル システムおよびストレージ スタックに対する変更が原因で、一部のプログラムが失敗することがあります。このようなプログラムは、ディスクまたはボリュームへの直接アクセスを使用するために失敗します。
プログラムの互換性に対する影響は、以下の理由で最小限に抑えられます。
-
バックアップ プログラムは、ボリュームのマウントを解除してからボリュームに書き込む必要があります。そうでない場合、プログラムによる書き込みがファイル システムによる書き込みと競合します。このような競合が発生すると、破損が生じたりシステムが不安定になったりします。
- パーティション分割プログラムは、ボリューム領域の外部にあるセクタに存在するパーティション テーブルを対象とします。ファイルシステムは、このようなセクタを制御しません。これらのセクタにアクセスできるため、パーティション分割プログラムが影響を受けることはありません。
- 回復プログラムは、ファイル システムがマウントできないボリューム上で実行される可能性が最も高くなります。RAW ボリュームにアクセスできるため、このような回復プログラムが影響を受けることはありません。
-
ブロック レベルの暗号化プログラムには、通常、パーティション マネージャ ドライバによって制御されるディスク スタックに存在するフィルタ ドライバがあります。フィルタ ドライバは、パーティション マネージャ ドライバが行う入出力 (IO) をフィルタリングします。このため、ファイル システムおよびストレージ スタックに対する変更は、ブロック レベルの暗号化プログラムに影響を及ぼしません。フィルタ ドライバがボリューム スタックにある場合、フィルタ ドライバはファイル システムによって制御されます。このため、ファイル システムおよびストレージ スタックに対する変更は、ブロック レベルの暗号化プログラムに影響を及ぼしません。
-
UDFS ファイル システムおよび FAT32 ファイル システムでは光学式ドライブのマウント時にチェックを実行しないため、CD マスタリング プログラムは影響を受けません。ただし、CD マスタリング プログラムは以下の場合に影響を受けることがあります。
-
プログラムが自分のファイルをロックしている。
-
そのプログラムがファイルの範囲を照会する。
-
そのプログラムがボリューム ハンドルを使用してファイルの範囲に直接書き込む。
ただし、この状況が原因でファイルのメタデータが同期しなくなることがあるため、この状況はお勧めしません。ファイルのメタデータが同期しなくなると、ファイルが破損することがあります。