internal override void ParseAttributeNonResidentBody(INTFSInfo ntfsInfo)
        {
            byte[] data = NtfsUtils.ReadFragments(ntfsInfo, NonResidentHeader.Fragments);

            List <IndexAllocationChunk> indexes = new List <IndexAllocationChunk>();
            List <IndexEntry>           entries = new List <IndexEntry>();

            // Parse
            for (int i = 0; i < NonResidentHeader.Fragments.Length; i++)
            {
                for (int j = 0; j < NonResidentHeader.Fragments[i].Clusters; j++)
                {
                    int offset = (int)((NonResidentHeader.Fragments[i].StartingVCN - NonResidentHeader.Fragments[0].StartingVCN) * ntfsInfo.BytesPrCluster + j * ntfsInfo.BytesPrCluster);

                    if (!IndexAllocationChunk.IsIndexAllocationChunk(data, offset))
                    {
                        continue;
                    }

                    IndexAllocationChunk index = IndexAllocationChunk.ParseBody(ntfsInfo, data, offset);

                    indexes.Add(index);
                    entries.AddRange(index.Entries);
                }
            }

            Indexes = indexes.ToArray();
            Entries = entries.ToArray();
        }
        internal override void ParseAttributeNonResidentBody(INTFSInfo ntfsInfo)
        {
            base.ParseAttributeNonResidentBody(ntfsInfo);

            // Get all chunks
            byte[] data = NtfsUtils.ReadFragments(ntfsInfo, NonResidentHeader.Fragments);

            // Parse
            Debug.Assert(data.Length >= 8);

            List <ExtendedAttribute> extendedAttributes = new List <ExtendedAttribute>();
            int pointer = 0;

            while (pointer + 8 <= data.Length)       // 8 is the minimum size of an ExtendedAttribute
            {
                if (ExtendedAttribute.GetSize(data, pointer) <= 0)
                {
                    break;
                }

                ExtendedAttribute ea = ExtendedAttribute.ParseData(data, (int)NonResidentHeader.ContentSize, pointer);

                extendedAttributes.Add(ea);

                pointer += ea.Size;
            }

            ExtendedAttributes = extendedAttributes.ToArray();
        }
Esempio n. 3
0
        public static IndexAllocationChunk ParseBody(INTFSInfo ntfsInfo, byte[] data, int offset)
        {
            Debug.Assert(data.Length >= 36);

            IndexAllocationChunk res = new IndexAllocationChunk();

            // Parse
            res.Signature = Encoding.ASCII.GetString(data, offset + 0, 4);

            Debug.Assert(res.Signature == "INDX");

            res.OffsetToUSN          = BitConverter.ToUInt16(data, offset + 4);
            res.USNSizeWords         = BitConverter.ToUInt16(data, offset + 6);
            res.LogFileUSN           = BitConverter.ToUInt64(data, offset + 8);
            res.VCNInIndexAllocation = BitConverter.ToUInt64(data, offset + 16);
            res.OffsetToFirstIndex   = BitConverter.ToUInt32(data, offset + 24);
            res.SizeOfIndexTotal     = BitConverter.ToUInt32(data, offset + 28);
            res.SizeOfIndexAllocated = BitConverter.ToUInt32(data, offset + 32);
            res.HasChildren          = data[36];

            Debug.Assert(data.Length >= offset + res.OffsetToUSN + 2 + res.USNSizeWords * 2);

            res.USNNumber = new byte[2];
            Array.Copy(data, offset + res.OffsetToUSN, res.USNNumber, 0, 2);

            res.USNData = new byte[res.USNSizeWords * 2 - 2];
            Array.Copy(data, offset + res.OffsetToUSN + 2, res.USNData, 0, res.USNData.Length);

            // Patch USN Data
            NtfsUtils.ApplyUSNPatch(data, offset, (res.SizeOfIndexAllocated + 24) / ntfsInfo.BytesPrSector, (ushort)ntfsInfo.BytesPrSector, res.USNNumber, res.USNData);

            Debug.Assert(offset + res.SizeOfIndexTotal <= data.Length);

            // Parse entries
            List <IndexEntry> entries = new List <IndexEntry>();

            int pointer = offset + (int)(res.OffsetToFirstIndex + 24);       // Offset is relative to 0x18

            while (pointer <= offset + res.SizeOfIndexTotal + 24)
            {
                IndexEntry entry = IndexEntry.ParseData(data, offset + (int)res.SizeOfIndexTotal - pointer + 24, pointer);

                if (entry.Flags.HasFlag(MFTIndexEntryFlags.LastEntry))
                {
                    break;
                }

                entries.Add(entry);

                pointer += entry.Size;
            }

            res.Entries = entries.ToArray();

            return(res);
        }
Esempio n. 4
0
        internal override void ParseAttributeNonResidentBody(INTFSInfo ntfsInfo)
        {
            base.ParseAttributeNonResidentBody(ntfsInfo);

            // Get all chunks
            byte[] data = NtfsUtils.ReadFragments(ntfsInfo, NonResidentHeader.Fragments);

            // Parse
            Bitfield = new BitArray(data);
        }
        public static byte[] ReadFragments(INTFSInfo ntfsInfo, DataFragment[] fragments)
        {
            int totalLength = (int)(fragments.Sum(s => (decimal)s.Clusters) * ntfsInfo.BytesPrCluster);

            byte[] data = new byte[totalLength];

            Stream diskStream = ntfsInfo.GetDiskStream();

            using (NtfsDiskStream stream = new NtfsDiskStream(diskStream, ntfsInfo.OwnsDiskStream, fragments, ntfsInfo.BytesPrCluster, 0, totalLength))
            {
                stream.Read(data, 0, data.Length);
            }

            // Return the data
            return(data);
        }
        private static void PrintRange(INTFSInfo ntfs, Options opts, long start, long count)
        {
            switch (opts.SizeUnit)
            {
            case SizeUnit.Bytes:
                AwesomeConsole.Write("{0:N0} -> {1:N0}", start * ntfs.BytesPrCluster, (start + count) * ntfs.BytesPrCluster);
                break;

            case SizeUnit.Sectors:
                AwesomeConsole.Write("{0:N0} -> {1:N0}", start * ntfs.SectorsPrCluster, (start + count) * ntfs.SectorsPrCluster);
                break;

            default:
                AwesomeConsole.Write("{0:N0} -> {1:N0}", start, start + count);
                break;
            }
        }
        private static void PrintSize(INTFSInfo ntfs, Options opts, long clusters)
        {
            switch (opts.SizeUnit)
            {
            case SizeUnit.Bytes:
                AwesomeConsole.Write("({0:N0} bytes)", ConsoleColor.DarkGreen, clusters * ntfs.BytesPrCluster);
                break;

            case SizeUnit.Sectors:
                AwesomeConsole.Write("({0:N0} sectors)", ConsoleColor.DarkGreen, clusters * ntfs.SectorsPrCluster);
                break;

            default:
                AwesomeConsole.Write("({0:N0} clusters)", ConsoleColor.DarkGreen, clusters);
                break;
            }
        }
        internal override void ParseAttributeNonResidentBody(INTFSInfo ntfsInfo)
        {
            base.ParseAttributeNonResidentBody(ntfsInfo);

            // Get all chunks
            byte[] data = NtfsUtils.ReadFragments(ntfsInfo, NonResidentHeader.Fragments);

            // Parse
            List <AttributeListItem> results = new List <AttributeListItem>();

            int pointer     = 0;
            int contentSize = (int)NonResidentHeader.ContentSize;

            while (pointer + 26 <= contentSize)     // 26 is the smallest possible MFTAttributeListItem
            {
                AttributeListItem item = AttributeListItem.ParseListItem(data, data.Length - pointer, pointer);

                if (item.Type == AttributeType.EndOfAttributes)
                {
                    break;
                }

                if (item.Length == 0)
                {
                    break;
                }

                results.Add(item);

                pointer += item.Length;
            }

            Debug.Assert(pointer == contentSize);

            Items = results.ToArray();
        }
 internal virtual void ParseAttributeNonResidentBody(INTFSInfo ntfsInfo)
 {
     Debug.Assert(NonResidentFlag == ResidentFlag.NonResident);
     Debug.Assert(AllowedResidentStates.HasFlag(AttributeResidentAllow.NonResident));
     Debug.Assert(ntfsInfo != null);
 }