A folder (directory) node in the NTFS filesystem.
Inheritance: Folder, IDescribable
			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");
				}
			}
Esempio n. 2
0
            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");
                }
            }
Esempio n. 3
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);
            }
			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);
			}