作者phterry (小风)
看板C_and_CPP
标题Re: [问题] 如何用C写读取Partition Table的方法?
时间Tue Nov 24 20:36:00 2009
※ 引述《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
1F:推 ledia:推一个 11/24 22:30
2F:推 VictorTom:推强者:) 11/24 22:42
3F:推 iwayne:推~ 11/24 23:49
4F:推 spir:推 11/25 12:17
5F:推 weiyucsie:推 11/25 13:05
6F:推 sunneo:推~~ 11/27 01:50