Simplify and optimize InternalSetResidentAttributeLength(), as suggested by Pierre.

svn path=/branches/GSoC_2016/NTFS/; revision=71837
This commit is contained in:
Trevor Thompson 2016-07-07 08:17:07 +00:00 committed by Thomas Faber
parent 7eb1264f5f
commit c08d37d182

View file

@ -178,43 +178,37 @@ InternalSetResidentAttributeLength(PNTFS_ATTR_CONTEXT AttrContext,
ULONG AttrOffset,
ULONG DataSize)
{
ULONG EndMarker = AttributeEnd;
ULONG FinalMarker = FILE_RECORD_END;
PNTFS_ATTR_RECORD Destination = (PNTFS_ATTR_RECORD)((ULONG_PTR)FileRecord + AttrOffset);
ULONG NextAttributeOffset;
ULONG Offset;
USHORT Padding;
DPRINT("InternalSetResidentAttributeLength( %p, %p, %lu, %lu )\n", AttrContext, FileRecord, AttrOffset, DataSize);
// update ValueLength Field
AttrContext->Record.Resident.ValueLength = DataSize;
Offset = AttrOffset + FIELD_OFFSET(NTFS_ATTR_RECORD, Resident.ValueLength);
RtlCopyMemory((PCHAR)FileRecord + Offset, &DataSize, sizeof(ULONG));
AttrContext->Record.Resident.ValueLength =
Destination->Resident.ValueLength = DataSize;
// calculate the record length and end marker offset
AttrContext->Record.Length = DataSize + AttrContext->Record.Resident.ValueOffset;
AttrContext->Record.Length =
Destination->Length = DataSize + AttrContext->Record.Resident.ValueOffset;
NextAttributeOffset = AttrOffset + AttrContext->Record.Length;
// Ensure NextAttributeOffset is aligned to an 8-byte boundary
if (NextAttributeOffset % 8 != 0)
{
Padding = 8 - (NextAttributeOffset % 8);
USHORT Padding = 8 - (NextAttributeOffset % 8);
NextAttributeOffset += Padding;
AttrContext->Record.Length += Padding;
Destination->Length += Padding;
}
// advance Destination to the final "attribute" and write the end type
(ULONG_PTR)Destination += Destination->Length;
Destination->Type = AttributeEnd;
// update the record length
Offset = AttrOffset + FIELD_OFFSET(NTFS_ATTR_RECORD, Length);
RtlCopyMemory((PCHAR)FileRecord + Offset, &AttrContext->Record.Length, sizeof(ULONG));
// write the final marker (which shares the same offset and type as the Length field)
Destination->Length = FILE_RECORD_END;
// write the end marker
RtlCopyMemory((PCHAR)FileRecord + NextAttributeOffset, &EndMarker, sizeof(ULONG));
// write the final marker
Offset = NextAttributeOffset + sizeof(ULONG);
RtlCopyMemory((PCHAR)FileRecord + Offset, &FinalMarker, sizeof(ULONG));
FileRecord->BytesInUse = Offset + sizeof(ULONG);
FileRecord->BytesInUse = NextAttributeOffset + (sizeof(ULONG) * 2);
}
NTSTATUS