summaryrefslogtreecommitdiff
path: root/Source/Kernel/VFS/Part.ns.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Kernel/VFS/Part.ns.cpp')
-rw-r--r--Source/Kernel/VFS/Part.ns.cpp25
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;