Beispiel #1
0
        public int ReadFrom(byte[] buffer, int offset)
        {
            InodesCount = Utilities.ToUInt32LittleEndian(buffer, offset + 0);
            BlocksCount = Utilities.ToUInt32LittleEndian(buffer, offset + 4);
            ReservedBlocksCount = Utilities.ToUInt32LittleEndian(buffer, offset + 8);
            FreeBlocksCount = Utilities.ToUInt32LittleEndian(buffer, offset + 12);
            FreeInodesCount = Utilities.ToUInt32LittleEndian(buffer, offset + 16);
            FirstDataBlock = Utilities.ToUInt32LittleEndian(buffer, offset + 20);
            LogBlockSize = Utilities.ToUInt32LittleEndian(buffer, offset + 24);
            LogFragSize = Utilities.ToUInt32LittleEndian(buffer, offset + 28);
            BlocksPerGroup = Utilities.ToUInt32LittleEndian(buffer, offset + 32);
            FragsPerGroup = Utilities.ToUInt32LittleEndian(buffer, offset + 36);
            InodesPerGroup = Utilities.ToUInt32LittleEndian(buffer, offset + 40);
            MountTime = Utilities.ToUInt32LittleEndian(buffer, offset + 44);
            WriteTime = Utilities.ToUInt32LittleEndian(buffer, offset + 48);
            MountCount = Utilities.ToUInt16LittleEndian(buffer, offset + 52);
            MaxMountCount = Utilities.ToUInt16LittleEndian(buffer, offset + 54);
            Magic = Utilities.ToUInt16LittleEndian(buffer, offset + 56);
            State = Utilities.ToUInt16LittleEndian(buffer, offset + 58);
            Errors = Utilities.ToUInt16LittleEndian(buffer, offset + 60);
            MinorRevisionLevel = Utilities.ToUInt16LittleEndian(buffer, offset + 62);
            LastCheckTime = Utilities.ToUInt32LittleEndian(buffer, offset + 64);
            CheckInterval = Utilities.ToUInt32LittleEndian(buffer, offset + 68);
            CreatorOS = Utilities.ToUInt32LittleEndian(buffer, offset + 72);
            RevisionLevel = Utilities.ToUInt32LittleEndian(buffer, offset + 76);
            DefaultReservedBlockUid = Utilities.ToUInt16LittleEndian(buffer, offset + 80);
            DefaultReservedBlockGid = Utilities.ToUInt16LittleEndian(buffer, offset + 82);

            FirstInode = Utilities.ToUInt32LittleEndian(buffer, offset + 84);
            InodeSize = Utilities.ToUInt16LittleEndian(buffer, offset + 88);
            BlockGroupNumber = Utilities.ToUInt16LittleEndian(buffer, offset + 90);
            CompatibleFeatures = (CompatibleFeatures)Utilities.ToUInt32LittleEndian(buffer, offset + 92);
            IncompatibleFeatures = (IncompatibleFeatures)Utilities.ToUInt32LittleEndian(buffer, offset + 96);
            ReadOnlyCompatibleFeatures = (ReadOnlyCompatibleFeatures)Utilities.ToUInt32LittleEndian(buffer, offset + 100);
            UniqueId = Utilities.ToGuidLittleEndian(buffer, offset + 104);
            VolumeName = Utilities.BytesToZString(buffer, offset + 120, 16);
            LastMountPoint = Utilities.BytesToZString(buffer, offset + 136, 64);
            CompressionAlgorithmUsageBitmap = Utilities.ToUInt32LittleEndian(buffer, offset + 200);

            PreallocateBlockCount = buffer[offset + 204];
            DirPreallocateBlockCount = buffer[offset + 205];

            JournalSuperBlockUniqueId = Utilities.ToGuidLittleEndian(buffer, offset + 208);
            JournalInode = Utilities.ToUInt32LittleEndian(buffer, offset + 224);
            JournalDevice = Utilities.ToUInt32LittleEndian(buffer, offset + 228);
            LastOrphan = Utilities.ToUInt32LittleEndian(buffer, offset + 232);
            HashSeed = new uint[4];
            HashSeed[0] = Utilities.ToUInt32LittleEndian(buffer, offset + 236);
            HashSeed[1] = Utilities.ToUInt32LittleEndian(buffer, offset + 240);
            HashSeed[2] = Utilities.ToUInt32LittleEndian(buffer, offset + 244);
            HashSeed[3] = Utilities.ToUInt32LittleEndian(buffer, offset + 248);
            DefaultHashVersion = buffer[offset + 252];
            DescriptorSize = Utilities.ToUInt16LittleEndian(buffer, offset + 254);
            DefaultMountOptions = Utilities.ToUInt32LittleEndian(buffer, offset + 256);
            FirstMetablockBlockGroup = Utilities.ToUInt32LittleEndian(buffer, offset + 260);
            MkfsTime = Utilities.ToUInt32LittleEndian(buffer, offset + 264);

            JournalBackup = new uint[17];
            for (int i = 0; i < 17; ++i)
            {
                JournalBackup[i] = Utilities.ToUInt32LittleEndian(buffer, offset + 268 + (4 * i));
            }

            BlocksCountHigh = Utilities.ToUInt32LittleEndian(buffer, offset + 336);
            ReservedBlocksCountHigh = Utilities.ToUInt32LittleEndian(buffer, offset + 340);
            FreeBlocksCountHigh = Utilities.ToUInt32LittleEndian(buffer, offset + 344);
            MinimumExtraInodeSize = Utilities.ToUInt16LittleEndian(buffer, offset + 348);
            WantExtraInodeSize = Utilities.ToUInt16LittleEndian(buffer, offset + 350);
            Flags = Utilities.ToUInt32LittleEndian(buffer, offset + 352);
            RaidStride = Utilities.ToUInt16LittleEndian(buffer, offset + 356);
            MultiMountProtectionInterval = Utilities.ToUInt16LittleEndian(buffer, offset + 258);
            MultiMountProtectionBlock = Utilities.ToUInt64LittleEndian(buffer, offset + 260);
            RaidStripeWidth = Utilities.ToUInt32LittleEndian(buffer, offset + 268);
            LogGroupsPerFlex = buffer[offset + 272];

            return 1024;
        }
        public int ReadFrom(byte[] buffer, int offset)
        {
            Magic = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 56);
            if (Magic != Ext2Magic)
            {
                return(Size);
            }

            InodesCount         = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 0);
            BlocksCount         = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 4);
            ReservedBlocksCount = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 8);
            FreeBlocksCount     = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 12);
            FreeInodesCount     = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 16);
            FirstDataBlock      = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 20);
            LogBlockSize        = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 24);
            LogFragSize         = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 28);
            BlocksPerGroup      = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 32);
            FragsPerGroup       = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 36);
            InodesPerGroup      = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 40);
            MountTime           = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 44);
            WriteTime           = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 48);
            MountCount          = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 52);
            MaxMountCount       = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 54);
            State                   = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 58);
            Errors                  = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 60);
            MinorRevisionLevel      = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 62);
            LastCheckTime           = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 64);
            CheckInterval           = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 68);
            CreatorOS               = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 72);
            RevisionLevel           = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 76);
            DefaultReservedBlockUid = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 80);
            DefaultReservedBlockGid = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 82);

            FirstInode                 = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 84);
            InodeSize                  = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 88);
            BlockGroupNumber           = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 90);
            CompatibleFeatures         = (CompatibleFeatures)EndianUtilities.ToUInt32LittleEndian(buffer, offset + 92);
            IncompatibleFeatures       = (IncompatibleFeatures)EndianUtilities.ToUInt32LittleEndian(buffer, offset + 96);
            ReadOnlyCompatibleFeatures =
                (ReadOnlyCompatibleFeatures)EndianUtilities.ToUInt32LittleEndian(buffer, offset + 100);
            UniqueId       = EndianUtilities.ToGuidLittleEndian(buffer, offset + 104);
            VolumeName     = EndianUtilities.BytesToZString(buffer, offset + 120, 16);
            LastMountPoint = EndianUtilities.BytesToZString(buffer, offset + 136, 64);
            CompressionAlgorithmUsageBitmap = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 200);

            PreallocateBlockCount    = buffer[offset + 204];
            DirPreallocateBlockCount = buffer[offset + 205];
            ReservedGDTBlocks        = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 206);

            JournalSuperBlockUniqueId = EndianUtilities.ToGuidLittleEndian(buffer, offset + 208);
            JournalInode             = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 224);
            JournalDevice            = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 228);
            LastOrphan               = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 232);
            HashSeed                 = new uint[4];
            HashSeed[0]              = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 236);
            HashSeed[1]              = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 240);
            HashSeed[2]              = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 244);
            HashSeed[3]              = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 248);
            DefaultHashVersion       = buffer[offset + 252];
            DescriptorSize           = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 254);
            DefaultMountOptions      = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 256);
            FirstMetablockBlockGroup = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 260);
            MkfsTime                 = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 264);

            JournalBackup = new uint[17];
            for (int i = 0; i < 17; ++i)
            {
                JournalBackup[i] = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 268 + 4 * i);
            }

            BlocksCountHigh         = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 336);
            ReservedBlocksCountHigh = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 340);
            FreeBlocksCountHigh     = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 344);
            MinimumExtraInodeSize   = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 348);
            WantExtraInodeSize      = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 350);
            Flags      = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 352);
            RaidStride = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 356);
            MultiMountProtectionInterval = EndianUtilities.ToUInt16LittleEndian(buffer, offset + 358);
            MultiMountProtectionBlock    = EndianUtilities.ToUInt64LittleEndian(buffer, offset + 360);
            RaidStripeWidth  = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 368);
            LogGroupsPerFlex = buffer[offset + 372];

            OverheadBlocksCount = EndianUtilities.ToUInt32LittleEndian(buffer, offset + 584);

            return(1024);
        }