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/filesyste... ============================================================================== --- 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