Author: tthompson
Date: Thu Jul 7 08:17:07 2016
New Revision: 71837
URL:
http://svn.reactos.org/svn/reactos?rev=71837&view=rev
Log:
[NTFS]
Simplify and optimize InternalSetResidentAttributeLength(), as suggested by Pierre.
Modified:
branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c
Modified: branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/NTFS/drivers/filesyst…
==============================================================================
--- branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c [iso-8859-1] (original)
+++ branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c [iso-8859-1] Thu Jul 7
08:17:07 2016
@@ -178,43 +178,37 @@
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;
- }
-
- // update the record length
- Offset = AttrOffset + FIELD_OFFSET(NTFS_ATTR_RECORD, Length);
- RtlCopyMemory((PCHAR)FileRecord + Offset, &AttrContext->Record.Length,
sizeof(ULONG));
-
- // 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);
+ Destination->Length += Padding;
+ }
+
+ // advance Destination to the final "attribute" and write the end type
+ (ULONG_PTR)Destination += Destination->Length;
+ Destination->Type = AttributeEnd;
+
+ // write the final marker (which shares the same offset and type as the Length
field)
+ Destination->Length = FILE_RECORD_END;
+
+ FileRecord->BytesInUse = NextAttributeOffset + (sizeof(ULONG) * 2);
}
NTSTATUS