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); }
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; }
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); }