Windowsマシンでストレージからセクタ単位で読み出し、書き込みを行うためにはCreateFileで\\.\PHYSICALDRIVEx (xはドライブの番号、0からスタート)をファイル名(?)にしてオープンすればいいらしい。
で、お試し。折角なのでセクタ0(MBR)を読んでパーティションテーブルを見てみた。
環境はg++ 3.4.4 on Cygwin/ EeePC
----------プログラム----------
#include <windows.h>
#include <iostream>
using namespace std;
struct p_table {
BYTE boot_flag; // ブートフラグ
BYTE start_chs[3]; // 開始CHS
BYTE type; // パーティションの種類
BYTE end_chs[3]; // 終了CHS
DWORD start_lba; // 開始LBA
DWORD total_sector; // セクタ数
};
int main(void)
{
HANDLE h = CreateFile("\\\\.\\PHYSICALDRIVE0",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(h == INVALID_HANDLE_VALUE) {
cout << "Could not open physical drive 0" << endl;
return 1;
}
BYTE buf[0x200];
DWORD read_size;
ReadFile(h, buf, 0x200, &read_size, NULL);
p_table* pt = reinterpret_cast<p_table*>(&buf[446]);
for(int i = 0; i < 4; ++i) {
const char* bfmes = pt[i].boot_flag & 0x80 ? "Boot" : "Boot Shinai";
cout << "Partition " << i << " : " << bfmes << endl;
cout << "Type : " << static_cast<DWORD>(pt[i].type) << endl;
cout << "Start LBA : " << pt[i].start_lba << endl;
cout << "Total Sector : " << pt[i].total_sector << endl;
}
CloseHandle(h);
return 0;
}
----------実行結果----------
Partition 0 : Boot Shinai
Type : 4 ※ FAT16
Start LBA : 63
Total Sector : 32193
Partition 1 : Boot
Type : 7 ※ NTFS
Start LBA : 32256
Total Sector : 7773696
Partition 2 : Boot Shinai
Type : 0
Start LBA : 0
Total Sector : 0
Partition 3 : Boot Shinai
Type : 0
Start LBA : 0
Total Sector : 0
----------------------------
EeePCでは先頭パーティションに16MB程FATな何かがあって第2パーティションが起動ドライブ(Cドライブ)になってるみたい。
ところで、LBA領域が4バイトしかないって事はHDDが2TB超えたらMBRでは管理できなくなりますね。どうなるんだろう?
GPTとかいう規格があるらしいですけど(EFIな環境で使われてる?)、x86なWindowsではそこからは起動できないらしいし。
HDDの方は137GBの壁を越えるために採用されたLBA48があるから暫くの間は大丈夫でしょうが…