コード例 #1
0
 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();
 }
コード例 #2
0
        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);
        }