public IndexBuffer(IDataStream stream, ulong vcn, FolderNTFS folder) { _folder = folder; _clusterStart = vcn * (ulong)(_folder._record.SectorsPerCluster * _folder._record.BytesPerSector); String magic = Util.GetASCIIString(stream, _clusterStart + 0x0, 4); if (!magic.Equals("INDX")) { throw new Exception("Magic INDX value not present"); } _entriesStart = (ushort)(Util.GetUInt16(stream, _clusterStart + 0x18) + 0x18); _entriesEnd = (ushort)(Util.GetUInt16(stream, _clusterStart + 0x1c) + _entriesStart); ushort updateSequenceOffset = Util.GetUInt16(stream, _clusterStart + 0x04); ushort updateSequenceLength = Util.GetUInt16(stream, _clusterStart + 0x06); ushort updateSequenceNumber = Util.GetUInt16(stream, _clusterStart + updateSequenceOffset); ushort[] updateSequenceArray = new ushort[updateSequenceLength - 1]; ushort read = 1; while (read < updateSequenceLength) { updateSequenceArray[read - 1] = Util.GetUInt16(stream, _clusterStart + updateSequenceOffset + (ushort)(read * 2)); read++; } _stream = new FixupStream(stream, _clusterStart, _entriesEnd, updateSequenceNumber, updateSequenceArray, (ulong)folder.BytesPerSector); if (_entriesEnd == _entriesStart) { throw new Exception("Entry size was 0"); } }
public IndexEntry(IDataStream stream, ulong offset, FolderNTFS folder) { _folder = folder; _stream = stream; _offset = offset; ulong mask = 0x0000ffffffffffff; // This is a hack _indexedFile = Util.GetUInt64(stream, offset); _indexEntryLength = Util.GetUInt16(stream, offset + 8); _filenameOffset = Util.GetUInt16(stream, offset + 10); _flags = Util.GetByte(stream, offset + 12); if (_indexEntryLength > 0x50) { _filenameLength = Util.GetByte(stream, offset + 0x50); Name = Util.GetUnicodeString(stream, offset + 0x52, (ulong)_filenameLength * 2); DummyEntry = false; } else { // no filename, dummy entry DummyEntry = true; } _recordNum = (_indexedFile & mask); }