Skip to content

Commit 58fa6b6

Browse files
committed
NTFS: FileRecord: Use Segments for logging purposes
1 parent badcf4b commit 58fa6b6

File tree

2 files changed

+27
-23
lines changed

2 files changed

+27
-23
lines changed

DiskAccessLibrary/FileSystems/NTFS/FileRecord/FileRecord.cs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,40 @@ namespace DiskAccessLibrary.FileSystems.NTFS
1616
/// </summary>
1717
public class FileRecord
1818
{
19-
private List<FileRecordSegment> m_segments;
19+
private List<FileRecordSegment> m_segments; // Used for logging purposes and must not be modified outside UpdateSegments
20+
21+
public ushort ReferenceCount;
22+
public bool IsInUse;
23+
public bool IsDirectory;
2024
private List<AttributeRecord> m_attributes;
2125

2226
internal FileRecord(FileRecordSegment segment)
2327
{
2428
m_segments = new List<FileRecordSegment>();
2529
m_segments.Add(segment);
30+
31+
ReferenceCount = m_segments[0].ReferenceCount;
32+
IsInUse = m_segments[0].IsInUse;
33+
IsDirectory = m_segments[0].IsDirectory;
2634
}
2735

2836
internal FileRecord(List<FileRecordSegment> segments)
2937
{
3038
m_segments = segments;
39+
40+
ReferenceCount = m_segments[0].ReferenceCount;
41+
IsInUse = m_segments[0].IsInUse;
42+
IsDirectory = m_segments[0].IsDirectory;
3143
}
3244

3345
/// <remarks>
3446
/// https://blogs.technet.microsoft.com/askcore/2009/10/16/the-four-stages-of-ntfs-file-growth/
3547
/// </remarks>
3648
public void UpdateSegments(int bytesPerFileRecordSegment, byte minorNTFSVersion)
3749
{
50+
m_segments[0].ReferenceCount = ReferenceCount;
51+
m_segments[0].IsInUse = IsInUse;
52+
m_segments[0].IsDirectory = IsDirectory;
3853
List<AttributeRecord> attributes = this.Attributes;
3954

4055
foreach (FileRecordSegment segment in m_segments)
@@ -164,6 +179,9 @@ private FileNameRecord GetFileNameRecord(FileNameFlags fileNameNamespace)
164179
return null;
165180
}
166181

182+
/// <summary>
183+
/// Used for logging purposes and must not be modified outside UpdateSegments
184+
/// </summary>
167185
internal List<FileRecordSegment> Segments
168186
{
169187
get
@@ -172,6 +190,9 @@ internal List<FileRecordSegment> Segments
172190
}
173191
}
174192

193+
/// <summary>
194+
/// Used for logging purposes and must not be modified outside UpdateSegments
195+
/// </summary>
175196
internal FileRecordSegment BaseSegment
176197
{
177198
get
@@ -344,22 +365,6 @@ public AttributeRecord BitmapRecord
344365
}
345366
}
346367

347-
public bool IsInUse
348-
{
349-
get
350-
{
351-
return m_segments[0].IsInUse;
352-
}
353-
}
354-
355-
public bool IsDirectory
356-
{
357-
get
358-
{
359-
return m_segments[0].IsDirectory;
360-
}
361-
}
362-
363368
public int AttributesLengthOnDisk
364369
{
365370
get

DiskAccessLibrary/FileSystems/NTFS/MasterFileTable.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public void UpdateFileRecord(FileRecord fileRecord, uint transactionID)
281281
Dictionary<MftSegmentReference, byte[]> undoDictionary = new Dictionary<MftSegmentReference, byte[]>();
282282
foreach (FileRecordSegment segment in fileRecord.Segments)
283283
{
284-
byte[] segmentBytes = GetFileRecordSegment(segment.SegmentNumber).GetBytes(m_volume.BytesPerFileRecordSegment, m_volume.MinorVersion, false);
284+
byte[] segmentBytes = segment.GetBytes(m_volume.BytesPerFileRecordSegment, m_volume.MinorVersion, false);
285285
undoDictionary.Add(segment.SegmentReference, segmentBytes);
286286
}
287287

@@ -397,11 +397,10 @@ public FileRecord CreateFile(List<FileNameRecord> fileNameRecords, uint transact
397397
m_volume.LogClient.WriteLogRecord(m_mftRecord.BaseSegmentReference, m_mftRecord.DataRecord, streamOffset, m_volume.BytesPerFileRecordSegment, NTFSLogOperation.InitializeFileRecordSegment, redoData, NTFSLogOperation.DeallocateFileRecordSegment, new byte[0], transactionID);
398398
UpdateFileRecordSegment(fileRecordSegment);
399399

400-
fileRecordSegment.ReferenceCount = (ushort)fileNameRecords.Count; // Each FileNameRecord is about to be indexed
401-
fileRecordSegment.IsInUse = true;
402-
fileRecordSegment.IsDirectory = isDirectory;
403-
404400
FileRecord fileRecord = new FileRecord(fileRecordSegment);
401+
fileRecord.ReferenceCount = (ushort)fileNameRecords.Count; // Each FileNameRecord is about to be indexed
402+
fileRecord.IsInUse = true;
403+
fileRecord.IsDirectory = isDirectory;
405404
StandardInformationRecord standardInformation = (StandardInformationRecord)fileRecord.CreateAttributeRecord(AttributeType.StandardInformation, String.Empty);
406405
standardInformation.CreationTime = fileNameRecords[0].CreationTime;
407406
standardInformation.ModificationTime = fileNameRecords[0].ModificationTime;
@@ -435,7 +434,7 @@ public void DeleteFile(FileRecord fileRecord, uint transactionID)
435434
{
436435
foreach (FileRecordSegment segment in fileRecord.Segments)
437436
{
438-
byte[] undoData = GetFileRecordSegment(segment.SegmentNumber).GetBytes(m_volume.BytesPerFileRecordSegment, m_volume.MinorVersion, false);
437+
byte[] undoData = segment.GetBytes(m_volume.BytesPerFileRecordSegment, m_volume.MinorVersion, false);
439438
ulong streamOffset = (ulong)(segment.SegmentNumber * m_volume.BytesPerFileRecordSegment);
440439
m_volume.LogClient.WriteLogRecord(m_mftRecord.BaseSegmentReference, m_mftRecord.DataRecord, streamOffset, m_volume.BytesPerFileRecordSegment, NTFSLogOperation.DeallocateFileRecordSegment, new byte[0], NTFSLogOperation.InitializeFileRecordSegment, undoData, transactionID);
441440
DeallocateFileRecordSegment(segment, transactionID);

0 commit comments

Comments
 (0)