braintag

公開してしまう備忘録

論理デバイス名から物理セクタ(MBR等)へアクセス

論理ボリューム名(Logical Volume)つまり\\.\C等から
物理デバイス(hysical Drive)\\.\PhysicalDrive0とかを導き出す方法

MS製のツール、ドライブにセクタ単位でアクセスできるDskProbe.exeを使うとわかるが、
http://www.microsoft.com/downloads/details.aspx?FamilyID=3E972E9A-E08A-49A2-9D3A-C0519479E85A&displaylang=en


論理ボリューム(Logical Volume)つまり\\.\C等と、物理ドライブ(hysical Drive)の、\\.\PhysicalDrive0ではセクタ開始位置が違う。

物理ボリュームでの指定ではMBRの読み書きが出来る。

しかし、論理ボリュームである\\.\Cでデバイスを開きセクタ0を参照しても、MBRにはアクセスできない。セクタ0はMBRではなく、PBSからとなってしまう。

じゃあMBR開くときは、\\.\PhysicalDrive(N)を指定すればいいよねってなるが、
でも、論理ボリューム名のCドライブは、PhysicalDrive(N)の、N番号の
どれに相当するのよ、わからんなぁってことがよくある。
(Cドライブなら0確定なのかもしれない)

そこで、MBRにアクセスするため、論理ボリュームから物理デバイスを導き出す方法

まず\\.\cにてデバイスを開き、(CreateFileで)、
DeviceIoControlのIOCTL_VOLUME_GET_VOLUME_DISK_EXTENTSを呼ぶ
VolExt.Extents[0].DiskNumberがデバイス番号なのでそれを(N)に代入する。
そしてまたデバイスを開けば、MBRにアクセスが出来る。

ちなみにWinCEの場合は"DSK1"とかが物理ドライブ番号で、
読み書きにReadFile/WriteFileとか使えないので、
DeviceIOcontrolIOCTL_DISK_READ/IOCTL_DISK_WRITE等を使ってR/Wしてやる。