mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[NTFS]
Simplify and optimize InternalSetResidentAttributeLength(), as suggested by Pierre. svn path=/branches/GSoC_2016/NTFS/; revision=71837
This commit is contained in:
parent
7eb1264f5f
commit
c08d37d182
1 changed files with 14 additions and 20 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue