diff options
Diffstat (limited to 'Source/Kernel/VFS/Part.ns.cpp')
-rw-r--r-- | Source/Kernel/VFS/Part.ns.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/Source/Kernel/VFS/Part.ns.cpp b/Source/Kernel/VFS/Part.ns.cpp index 9ead6b5..415a150 100644 --- a/Source/Kernel/VFS/Part.ns.cpp +++ b/Source/Kernel/VFS/Part.ns.cpp @@ -1,5 +1,7 @@ #include "Part.ns.h" +#include <VTManager/SimpleVT.class.h> + namespace Part { Vector<BlockDevice*> devices; @@ -7,6 +9,21 @@ Vector<Partition*> partitions; void readPartitionTable(BlockDevice *dev) { //TODO : read partition table from device partitions.push(new Partition(dev, 0, 0, dev->blocks())); //Insert whole device as a partition + + u8int* mbr = (u8int*)Mem::alloc(dev->blockSize()); + if (!dev->readBlocks(0, 1, mbr)) return; + + mbr_entry_t* entries = (mbr_entry_t*)((u32int)mbr + 0x1BE); + + for (u32int i = 0; i < 4; i++) { + if ((entries[i].bootable == 0 or entries[i].bootable == 0x80) and entries[i].id != 0 + and entries[i].s_lba != 0 and entries[i].size != 0 + and entries[i].s_lba < dev->blocks() and entries[i].size < dev->blocks()) { + partitions.push(new Partition(dev, i + 1, entries[i].s_lba, entries[i].size)); + } + } + + Mem::free(mbr); } void registerDevice(BlockDevice *dev) { @@ -73,12 +90,8 @@ BlockDevice* dev(String _class, u32int idx) { Partition* part(BlockDevice* dev, u32int idx) { for (u32int i = 0; i < partitions.size(); i++) { - if (partitions[i]->getDevice() == dev) { - if (idx == 0) { - return partitions[i]; - } else { - idx--; - } + if (partitions[i]->getDevice() == dev && partitions[i]->getPartNumber() == idx) { + return partitions[i]; } } return NULL; |