@@ -258,7 +258,7 @@ NTSTATUS NTAPI RtlFindMemoryBlockFromModuleSection(
258258#endif
259259
260260
261- static __forceinline WORD CalcCheckSum (DWORD StartValue, LPVOID BaseAddress, DWORD WordCount) {
261+ static WORD CalcCheckSum (DWORD StartValue, LPVOID BaseAddress, DWORD WordCount) {
262262 LPWORD Ptr = (LPWORD)BaseAddress;
263263 DWORD Sum = StartValue;
264264 for (DWORD i = 0 ; i < WordCount; i++) {
@@ -269,17 +269,14 @@ static __forceinline WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWO
269269 return (WORD)(LOWORD (Sum) + HIWORD (Sum));
270270}
271271
272- BOOLEAN __forceinline WINAPI CheckSumBufferedFile (LPVOID BaseAddress, DWORD BufferLength) {
273- PIMAGE_NT_HEADERS header = RtlImageNtHeader (BaseAddress);
274- DWORD CalcSum = CalcCheckSum (0 , BaseAddress, (BufferLength + 1 ) / sizeof (WORD));
275- DWORD HdrSum = header->OptionalHeader .CheckSum ;
276- if (!HdrSum)return TRUE ;
272+ static BOOLEAN CheckSumBufferedFile (LPVOID BaseAddress, DWORD BufferLength, DWORD CheckSum) {
273+ DWORD CalcSum = CalcCheckSum (0 , BaseAddress, (BufferLength + 1 ) / sizeof (WORD)), HdrSum = CheckSum;
277274
278- if (!header) return FALSE ;
279275 if (LOWORD (CalcSum) >= LOWORD (HdrSum)) CalcSum -= LOWORD (HdrSum);
280276 else CalcSum = ((LOWORD (CalcSum) - LOWORD (HdrSum)) & 0xFFFF ) - 1 ;
281277 if (LOWORD (CalcSum) >= HIWORD (HdrSum)) CalcSum -= HIWORD (HdrSum);
282278 else CalcSum = ((LOWORD (CalcSum) - HIWORD (HdrSum)) & 0xFFFF ) - 1 ;
279+
283280 CalcSum += BufferLength;
284281 return HdrSum == CalcSum;
285282}
@@ -301,10 +298,9 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
301298 headers.nt = RtlImageNtHeader (Buffer);
302299 PIMAGE_SECTION_HEADER sections = nullptr ;
303300 size_t SizeofImage = 0 ;
301+ DWORD CheckSum = 0 ;
304302
305- if (!headers.nt ) {
306- return FALSE ;
307- }
303+ if (!headers.nt ) return FALSE ;
308304
309305 switch (headers.nt ->OptionalHeader .Magic ) {
310306 case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
@@ -316,6 +312,9 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
316312
317313 // Signature size
318314 SizeofImage += headers.nt32 ->OptionalHeader .DataDirectory [IMAGE_DIRECTORY_ENTRY_SECURITY].Size ;
315+
316+ CheckSum = headers.nt32 ->OptionalHeader .CheckSum ;
317+
319318 break ;
320319 case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
321320 sections = PIMAGE_SECTION_HEADER ((char *)&headers.nt64 ->OptionalHeader + headers.nt64 ->FileHeader .SizeOfOptionalHeader );
@@ -324,14 +323,20 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
324323 for (WORD i = 0 ; i < headers.nt64 ->FileHeader .NumberOfSections ; ++i, ++sections)
325324 SizeofImage += sections->SizeOfRawData ;
326325 SizeofImage += headers.nt64 ->OptionalHeader .DataDirectory [IMAGE_DIRECTORY_ENTRY_SECURITY].Size ;
326+
327+ CheckSum = headers.nt64 ->OptionalHeader .CheckSum ;
328+
327329 break ;
328330 default :
329331 return FALSE ;
330332 }
331- IMAGE_FIRST_SECTION (headers. nt32 );
333+
332334 ProbeForRead (Buffer, SizeofImage);
333335 if (Size)*Size = SizeofImage;
334- result = CheckSumBufferedFile (Buffer, (DWORD)SizeofImage);
336+
337+ if (!CheckSum)return TRUE ;
338+
339+ result = CheckSumBufferedFile (Buffer, (DWORD)SizeofImage, CheckSum);
335340 }
336341 __except (EXCEPTION_EXECUTE_HANDLER) {
337342 SetLastError (RtlNtStatusToDosError (GetExceptionCode ()));
0 commit comments