Ejemplo n.º 1
0
        public int ReadFrom(byte[] buffer, int offset)
        {
            Mode             = Utilities.ToUInt16LittleEndian(buffer, offset + 0);
            UserIdLow        = Utilities.ToUInt16LittleEndian(buffer, offset + 2);
            FileSize         = Utilities.ToUInt32LittleEndian(buffer, offset + 4);
            AccessTime       = Utilities.ToUInt32LittleEndian(buffer, offset + 8);
            CreationTime     = Utilities.ToUInt32LittleEndian(buffer, offset + 12);
            ModificationTime = Utilities.ToUInt32LittleEndian(buffer, offset + 16);
            DeletionTime     = Utilities.ToUInt32LittleEndian(buffer, offset + 20);
            GroupIdLow       = Utilities.ToUInt16LittleEndian(buffer, offset + 24);
            LinksCount       = Utilities.ToUInt16LittleEndian(buffer, offset + 26);
            BlocksCount      = Utilities.ToUInt32LittleEndian(buffer, offset + 28);
            Flags            = (InodeFlags)Utilities.ToUInt32LittleEndian(buffer, offset + 32);

            FastSymlink  = null;
            Extents      = null;
            DirectBlocks = null;
            if (FileType == UnixFileType.Link && BlocksCount == 0)
            {
                FastSymlink = new byte[60];
                Array.Copy(buffer, offset + 40, FastSymlink, 0, 60);
            }
            else if ((Flags & InodeFlags.ExtentsUsed) != 0)
            {
                Extents = Utilities.ToStruct <ExtentBlock>(buffer, offset + 40);
            }
            else
            {
                DirectBlocks = new uint[12];
                for (int i = 0; i < 12; ++i)
                {
                    DirectBlocks[i] = Utilities.ToUInt32LittleEndian(buffer, offset + 40 + i * 4);
                }

                IndirectBlock       = Utilities.ToUInt32LittleEndian(buffer, offset + 88);
                DoubleIndirectBlock = Utilities.ToUInt32LittleEndian(buffer, offset + 92);
                TripleIndirectBlock = Utilities.ToUInt32LittleEndian(buffer, offset + 96);
            }

            FileVersion  = Utilities.ToUInt32LittleEndian(buffer, offset + 100);
            FileAcl      = Utilities.ToUInt32LittleEndian(buffer, offset + 104);
            DirAcl       = Utilities.ToUInt32LittleEndian(buffer, offset + 108);
            FragAddress  = Utilities.ToUInt32LittleEndian(buffer, offset + 112);
            Fragment     = buffer[offset + 116];
            FragmentSize = buffer[offset + 117];
            UserIdHigh   = Utilities.ToUInt16LittleEndian(buffer, offset + 120);
            GroupIdHigh  = Utilities.ToUInt16LittleEndian(buffer, offset + 122);

            return(128);
        }
Ejemplo n.º 2
0
        public int ReadFrom(byte[] buffer, int offset)
        {
            Mode = Utilities.ToUInt16LittleEndian(buffer, offset + 0);
            UserIdLow = Utilities.ToUInt16LittleEndian(buffer, offset + 2);
            FileSize = Utilities.ToUInt32LittleEndian(buffer, offset + 4);
            AccessTime = Utilities.ToUInt32LittleEndian(buffer, offset + 8);
            CreationTime = Utilities.ToUInt32LittleEndian(buffer, offset + 12);
            ModificationTime = Utilities.ToUInt32LittleEndian(buffer, offset + 16);
            DeletionTime = Utilities.ToUInt32LittleEndian(buffer, offset + 20);
            GroupIdLow = Utilities.ToUInt16LittleEndian(buffer, offset + 24);
            LinksCount = Utilities.ToUInt16LittleEndian(buffer, offset + 26);
            BlocksCount = Utilities.ToUInt32LittleEndian(buffer, offset + 28);
            Flags = (InodeFlags)Utilities.ToUInt32LittleEndian(buffer, offset + 32);

            FastSymlink = null;
            Extents = null;
            DirectBlocks = null;
            if (FileType == UnixFileType.Link && BlocksCount == 0)
            {
                FastSymlink = new byte[60];
                Array.Copy(buffer, offset + 40, FastSymlink, 0, 60);
            }
            else if ((Flags & InodeFlags.ExtentsUsed) != 0)
            {
                Extents = Utilities.ToStruct<ExtentBlock>(buffer, offset + 40);
            }
            else
            {
                DirectBlocks = new uint[12];
                for (int i = 0; i < 12; ++i)
                {
                    DirectBlocks[i] = Utilities.ToUInt32LittleEndian(buffer, offset + 40 + (i * 4));
                }

                IndirectBlock = Utilities.ToUInt32LittleEndian(buffer, offset + 88);
                DoubleIndirectBlock = Utilities.ToUInt32LittleEndian(buffer, offset + 92);
                TripleIndirectBlock = Utilities.ToUInt32LittleEndian(buffer, offset + 96);
            }

            FileVersion = Utilities.ToUInt32LittleEndian(buffer, offset + 100);
            FileAcl = Utilities.ToUInt32LittleEndian(buffer, offset + 104);
            DirAcl = Utilities.ToUInt32LittleEndian(buffer, offset + 108);
            FragAddress = Utilities.ToUInt32LittleEndian(buffer, offset + 112);
            Fragment = buffer[offset + 116];
            FragmentSize = buffer[offset + 117];
            UserIdHigh = Utilities.ToUInt16LittleEndian(buffer, offset + 120);
            GroupIdHigh = Utilities.ToUInt16LittleEndian(buffer, offset + 122);

            return 128;
        }
Ejemplo n.º 3
0
        inode MakeInode(InodeMode Mode, uint Blocks, long Size = 0, long SizeCompressed = 0, ushort Nlink = 1, uint Number = 0, InodeFlags Flags = 0)
        {
            inode ret;

            if (properties.Sign)
            {
                ret = new DinodeS32()
                {
                    Mode           = Mode,
                    Blocks         = Blocks,
                    Size           = Size,
                    SizeCompressed = SizeCompressed,
                    Nlink          = Nlink,
                    Number         = Number,
                    Flags          = Flags | InodeFlags.unk2 | InodeFlags.unk3,
                };
            }
            else
            {
                ret = new DinodeD32()
                {
                    Mode           = Mode,
                    Blocks         = Blocks,
                    Size           = Size,
                    SizeCompressed = SizeCompressed,
                    Nlink          = Nlink,
                    Number         = Number,
                    Flags          = Flags
                };
            }
            ret.SetTime(properties.FileTime);
            return(ret);
        }