Author: ion Date: Thu Jan 21 15:47:14 2016 New Revision: 70633 URL: http://svn.reactos.org/svn/reactos?rev=70633&view=rev Log: [BOOTLIB]: Cleanup, less magic.
Modified: trunk/reactos/boot/environ/include/bl.h trunk/reactos/boot/environ/lib/misc/image.c trunk/reactos/boot/environ/lib/misc/util.c Modified: trunk/reactos/boot/environ/include/bl.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/include/bl.h?rev=70633&r1=70632&r2=70633&view=diff ============================================================================== --- trunk/reactos/boot/environ/include/bl.h [iso-8859-1] (original) +++ trunk/reactos/boot/environ/include/bl.h [iso-8859-1] Thu Jan 21 15:47:14 2016 @@ -154,6 +154,12 @@ #define BL_LOAD_PE_IMG_COMPUTE_HASH 0x10 #define BL_LOAD_PE_IMG_CHECK_SUBSYSTEM 0x80 #define BL_LOAD_PE_IMG_CHECK_FORCED_INTEGRITY 0x200 + +#define BL_UTL_CHECKSUM_COMPLEMENT 0x10000 +#define BL_UTL_CHECKSUM_ROTATE 0x20000 +#define BL_UTL_CHECKSUM_NEGATE 0x40000 +#define BL_UTL_CHECKSUM_UCHAR_BUFFER 0x01 +#define BL_UTL_CHECKSUM_USHORT_BUFFER 0x02 /* ENUMERATIONS **************************************************************/ @@ -1618,6 +1624,14 @@ NTSTATUS BlUtlRegisterProgressRoutine ( VOID + ); + +ULONG +BlUtlCheckSum ( + _In_ ULONG PartialSum, + _In_ PUCHAR Buffer, + _In_ ULONG Length, + _In_ ULONG Flags ); NTSTATUS Modified: trunk/reactos/boot/environ/lib/misc/image.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/misc/image.c?rev=70633&r1=70632&r2=70633&view=diff ============================================================================== --- trunk/reactos/boot/environ/lib/misc/image.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/lib/misc/image.c [iso-8859-1] Thu Jan 21 15:47:14 2016 @@ -649,54 +649,6 @@ /* Unallocate the image buffer */ return BlImgUnallocateImageBuffer(ImageBase, ImageSize, ImageFlags); -} - -unsigned int BlUtlCheckSum(unsigned int PartialSum, PUCHAR Source, unsigned int Length, unsigned int Flags) -{ - unsigned int Type; // eax@1 - int Type1; // eax@1 - unsigned int AlignedLength; // ebx@3 - unsigned int i; // ebx@21 MAPDST - - Type = Flags & 3; - Type1 = Type - 1; - if (Type1) - { - if (Type1 == 1) - { - PartialSum = (unsigned __int16)PartialSum; - AlignedLength = Length & ~1; - if (Length & ~1) - { - i = 0; - do - { - PartialSum += *(unsigned __int16 *)&Source[i]; - if (Flags & 0x10000) - PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum); - i += 2; - } while (i < AlignedLength); - } - - if (Length != AlignedLength) - { - PartialSum += (unsigned __int8)Source[AlignedLength]; - if (Flags & 0x10000) - PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum); - } - if (Flags & 0x40000) - return ~PartialSum; - PartialSum = (unsigned __int16)PartialSum; - } - } - else - { - EfiPrintf(L"checksum type not supported\r\n"); - } - - if (Flags & 0x40000) - return ~PartialSum; - return PartialSum; } NTSTATUS @@ -921,7 +873,11 @@ NtHeaders->OptionalHeader.CheckSum = 0; /* Calculate the checksum of the header, and restore the original one */ - PartialSum = BlUtlCheckSum(0, VirtualAddress, HeaderSize, 0x10002); + PartialSum = BlUtlCheckSum(0, + VirtualAddress, + HeaderSize, + BL_UTL_CHECKSUM_COMPLEMENT | + BL_UTL_CHECKSUM_USHORT_BUFFER); NtHeaders->OptionalHeader.CheckSum = CheckSum; /* Record our current position (right after the headers) */ @@ -1037,7 +993,8 @@ PartialSum = BlUtlCheckSum(PartialSum, (PUCHAR)SectionStart, AlignSize, - 0x10002); + BL_UTL_CHECKSUM_COMPLEMENT | + BL_UTL_CHECKSUM_USHORT_BUFFER); } } @@ -1114,7 +1071,8 @@ PartialSum = BlUtlCheckSum(PartialSum, LocalBuffer, BytesRead, - 0x10002); + BL_UTL_CHECKSUM_COMPLEMENT | + BL_UTL_CHECKSUM_USHORT_BUFFER); } /* Finally, calculate the final checksum and compare it */ Modified: trunk/reactos/boot/environ/lib/misc/util.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/misc/util.c?rev=70633&r1=70632&r2=70633&view=diff ============================================================================== --- trunk/reactos/boot/environ/lib/misc/util.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/lib/misc/util.c [iso-8859-1] Thu Jan 21 15:47:14 2016 @@ -720,3 +720,61 @@ return Status; } +ULONG +BlUtlCheckSum ( + _In_ ULONG PartialSum, + _In_ PUCHAR Buffer, + _In_ ULONG Length, + _In_ ULONG Flags + ) +{ + ULONG i; + + if (Flags & BL_UTL_CHECKSUM_UCHAR_BUFFER) + { + EfiPrintf(L"Not supported\r\n"); + return 0; + } + else if (Flags & BL_UTL_CHECKSUM_USHORT_BUFFER) + { + PartialSum = (unsigned __int16)PartialSum; + Length &= ~1; + + for (i = 0; i < Length; i += 2) + { + PartialSum += *(unsigned __int16 *)&Buffer[i]; + if (Flags & BL_UTL_CHECKSUM_COMPLEMENT) + { + PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum); + } + } + + if (Length != Length) + { + PartialSum += (unsigned __int8)Buffer[Length]; + if (Flags & BL_UTL_CHECKSUM_COMPLEMENT) + { + PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum); + } + } + + if (Flags & BL_UTL_CHECKSUM_NEGATE) + { + return ~PartialSum; + } + + PartialSum = (unsigned __int16)PartialSum; + } + else + { + /* Invalid mode */ + return 0; + } + + if (Flags & BL_UTL_CHECKSUM_NEGATE) + { + return ~PartialSum; + } + + return PartialSum; +}