trios/kernel/fs/mbr.c

20 lines
687 B
C

#include "mbr.h"
bool mbr_get_partition(struct MbrPartition *dest, struct AtaDevice dev, int n) {
if(n < 0 || n > 3) return false;
uint8_t data[512] __attribute__(( aligned(2) ));
if(!ata_read(dev, 0, 1, (void*)data)) return false;
size_t offset = 0x1BE + n * 0x10;
uint8_t status = data[offset];
if((status & 0x7F) != 0) return false;
dest->n = n;
dest->bootable = status & 0x80 ? true : false;
dest->type = data[offset + 4];
dest->start_sector = data[offset+8] | (data[offset+9] << 8) | (data[offset+10] << 16) | (data[offset+11] << 24);
dest->sector_count = data[offset+12] | (data[offset+13] << 8) | (data[offset+14] << 16) | (data[offset+15] << 24);
return true;
}