Microsoft KBによるとCreateFile
、FILE_SHARE_READ
とFILE_SHARE_WRITE
onを呼び出す必要があります。"\\.\PhysicalDriveN"
ここで、N
はゼロベースの物理ドライブ インデックスです。その後、ドライブ全体を 1 つの巨大なファイルとしてアクセスできます。これが機能するには、マシンの管理者である必要があります!
CreateFile()
ドライブへの適切なアクセス権がある (つまり、管理者である必要がある) 場合は、これらのデバイス名を使用してアプリケーション プログラミング インターフェイス (API) を使用して物理ドライブまたは論理ドライブを開くことができます。ドライブにアクセスするには、フラグCreateFile()
FILE_SHARE_READ
とフラグの両方を使用する必要があります
。FILE_SHARE_WRITE
論理ドライブまたは物理ドライブが開かれると、ドライブ全体のデータに対して直接 I/O を実行できます。ダイレクト ディスク I/O を実行する場合は、デバイスのセクター サイズの倍数とセクター境界でシーク、読み取り、および書き込みを行う必要があります。IOCTL_DISK_GET_DRIVE_GEOMETRY を使用して DeviceIoControl() を呼び出し、セクターあたりのバイト数、セクター数、トラックあたりのセクターなどを取得して、必要なバッファーのサイズを計算できるようにします。
更新:調査を行ったところ、Vista を起動するには、ボリュームのロックを取得するか、マウントを解除する必要があることがわかりました。そうしないと、書き込みが失敗します。ドキュメントでマイクロソフトは次のように述べています。
ファイル システムがマウントされているボリュームに直接書き込む場合は、最初にそのボリュームへの排他アクセスを取得する必要があります。そうしないと、アプリケーションの書き込みがファイル システムからの他の変更と競合し、ボリュームの内容が一貫性のない状態のままになる可能性があるため、データの破損やシステムの不安定性が生じる危険性があります。これらの問題を回避するために、Windows Vista 以降では次の変更が行われました。
ボリュームにマウントされたファイル システムがない場合、または次の条件のいずれかに該当する場合、ボリューム ハンドルへの書き込みは成功します。
- 書き込むセクタはブートセクタです。
- 書き込まれるセクタは、ファイル システム領域の外に存在します。
FSCTL_LOCK_VOLUME
またはを使用して、ボリュームを明示的にロックまたはマウント解除しましたFSCTL_DISMOUNT_VOLUME
。
- ボリュームには実際のファイル システムはありません。(つまり、RAW ファイルシステムがマウントされています。)
次の条件のいずれかに該当する場合、ディスク ハンドルへの書き込みは成功します。
- 書き込まれるセクターがボリュームのエクステント内にありません。
- 書き込まれるセクタはマウントされたボリューム内に収まりますが、 または を使用してボリュームを明示的にロックまたはマウント解除しまし
FSCTL_LOCK_VOLUME
たFSCTL_DISMOUNT_VOLUME
。
- 書き込むセクタは、RAW 以外のファイル システムがマウントされていないボリューム内に収まるようにします。