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