public static void Init() { mFs = new List <ATAPartition>(10); for (int i = 0; i < ATA.ATAPartitions.Count; i++) { if (ATA.ATAPartitions[i] is ATAPartition) { ATAPartition part = ATA.ATAPartitions[i]; ReadBiosParamBlock(part, part.offset); } } UpdateVFS(); }
private static void ReadBiosParamBlock(ATAPartition hd, ulong paritionOffset) { BiosParameterBlock *bpb = (BiosParameterBlock *)Heap.alloc((uint)sizeof(BiosParameterBlock)); hd.host.ReadBlock(paritionOffset, 1, (byte *)(uint)bpb); ulong fatStart = paritionOffset + bpb->reservedSectors; ulong fatSize = bpb->tableSize; ulong dataStart = fatStart + fatSize * bpb->fatCopies; ulong rootStart = dataStart + bpb->sectorsPerCluster * (bpb->rootCluster - 2); if (rootStart == 0) { Heap.free((byte *)(uint)bpb); return; } hd.mountPoint = nextMountPoint; nextMountPoint++; hd.fatStart = fatStart; hd.fatSize = fatSize; hd.dataStart = dataStart; hd.rootStart = rootStart; hd.sectorsPerCluster = bpb->sectorsPerCluster; mFs.Add(hd); FATDirectoryEntry *dirent = (FATDirectoryEntry *)Heap.alloc((uint)sizeof(FATDirectoryEntry) * 16); hd.host.ReadBlock(rootStart, 1, (byte *)(uint)dirent); hd.rootName = (byte *)Heap.alloc(8); Utils.memcpy(hd.rootName, (byte *)dirent, 8); Utils.strDepad(hd.rootName, 8); if (filesystem_root_node == null) { FSEntry entry = new FSEntry(); entry.address = rootStart; entry.name = (byte *)Heap.alloc(8); entry.host = hd; filesystem_root_node = entry; } Heap.free((byte *)(uint)dirent); Heap.free((byte *)(uint)bpb); }