Re: [問題] 如何用C寫讀取Partition Table的方法?
※ 引述《rruy (YA賈修動畫真好看)》之銘言:
: 小弟目前 有些資訊內容 需要從Partition Table內取得
: 例如: 現在格式 (ext3 ,fat32 ,fat16..等等資訊)
: 除了讀取Partition Table外我真的想不知道如何取得了
: 上網查了一下 還是對讀取Partition Table沒有頭緒
: 要怎麼讀出來呢?
: 又不像一般文字檔?也不知道該去哪邊找?
: 有沒有大大能給個頭緒 方向 感謝
: 我只知道linux下用fdisk 裡面去看 看的到Partition Table
: 不過程式中也沒辦法這樣去看?
: Partition Table內哪個數字代表哪個值我知道
: 可是我就是不知道如何去讀到Partition Table
: 拜託各位大大 能給點提示 感恩
以下的範例僅適用於 Linux 系統, 不適用 Windows.
int fd;
unsigned char mbr[512], *p_table;
/* 用 open() 就可以開了, 如果有寫入的必要, 請把 O_RDONLY 改
* 成 O_RDWR. 以下只是以 /dev/sda 為例, 你的 disk 可能是
* /dev/hda 或者其他的.
*/
if ((fd = open("/dev/sda", O_RDONLY)) < 0) {
/* error handling */
}
/* 讀取 MBR, MBR 位於 disk 的前 512 bytes */
if (read(fd, mbr, 512) != 512) {
/* error handling */
}
close(fd);
/* MBR 的 512 bytes 裡前 446 個 bytes 是裝 bootloader 及一些
* OS specific parameters 用的, 後面 66 bytes 裡, 除了最後兩
* 個 bytes (mbr[510], mbr[511]) 一定是 0x55 0xaa 之外, 其餘
* 64 bytes 即是 partition table
*/
p_table = &mbr[446];
這 64 bytes 裡, 可容納 4 個 16 bytes 的 partition 資料, 簡述
如下:
[ 0 ] bootable
[ 1-3 ] CHS start
[ 4 ] type
[ 5-7 ] CHS end
[ 8-11] sector start
[12-15] total sectors
A. 讀取 type 及 partition size
type 位於上表之 [4] 的位置, 應該不會有什麼問題, 比較需要
留意的地方是 [12-15] 這個部份, [12-15] 裡存的值, 其實就是
partition size, 但是它是以 sector 為單位, 而且順序是 little
endian. 因此要算出此 partition 的 bytes 數, 必須再乘以 sector
size. 儘管 sector size 大都是 512 bytes. 但也有可能是 1024 或
2048 等不同的數值, 請利用 BLKSSZGET 查證,
例:
int sector_size = 0;
ioctl(fd, BLKSSZGET, §or_size);
B. Extended partition 及 EBR
在 [4] 如果讀出的 type 是 0x05, 則屬於 extended partition,
遇到這個 partition 時, 它實際的資料會存在 EBR (Extended Boot
Record), EBR 和 MBR 的架構大致相同, 假如 /dev/sda2 為 extended
partition, 則 EBR 就存在 /dev/sda2 的前 512 bytes. 而 EBR 的
後面 66 bytes 就是另一組 partition table.
C. 讓 kernel 重讀 partition table
最後, 如果有更動 partition table 的內容, 請用 BLKRRPART 通知
kernel 重讀 partition table.
例:
ioctl(fd, BLKRRPART);
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.249.207.134
推
11/24 22:30, , 1F
11/24 22:30, 1F
推
11/24 22:42, , 2F
11/24 22:42, 2F
推
11/24 23:49, , 3F
11/24 23:49, 3F
推
11/25 12:17, , 4F
11/25 12:17, 4F
推
11/25 13:05, , 5F
11/25 13:05, 5F
推
11/27 01:50, , 6F
11/27 01:50, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):