Implemented LdrVerifyImageMatchesChecksum().

svn path=/trunk/; revision=4875
This commit is contained in:
Eric Kohl 2003-06-09 13:44:37 +00:00
parent b7bf13d061
commit b99ad0e0a6
4 changed files with 175 additions and 7 deletions

View file

@ -96,8 +96,8 @@ LdrGetDllHandle(IN ULONG Unknown1,
OUT PVOID *BaseAddress);
NTSTATUS STDCALL
LdrFindEntryForAddress(PVOID Address,
PLDR_MODULE *Module);
LdrFindEntryForAddress(IN PVOID Address,
OUT PLDR_MODULE *Module);
NTSTATUS STDCALL
LdrGetProcedureAddress(IN PVOID BaseAddress,
@ -131,6 +131,12 @@ LdrShutdownThread(VOID);
NTSTATUS STDCALL
LdrUnloadDll(IN PVOID BaseAddress);
NTSTATUS STDCALL
LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
ULONG Unknown1,
ULONG Unknown2,
ULONG Unknown3);
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_LDR_H */
/* EOF */

View file

@ -1,4 +1,4 @@
; $Id: ntdll.def,v 1.101 2003/06/07 11:32:42 ekohl Exp $
; $Id: ntdll.def,v 1.102 2003/06/09 13:44:11 ekohl Exp $
;
; ReactOS Operating System
;
@ -52,7 +52,7 @@ LdrQueryProcessModuleInformation@12
LdrShutdownProcess@0
LdrShutdownThread@0
LdrUnloadDll@4
;LdrVerifyImageMatchesChecksum@16
LdrVerifyImageMatchesChecksum@16
NlsAnsiCodePage DATA
NlsMbCodePageTag DATA
NlsMbOemCodePageTag DATA

View file

@ -1,4 +1,4 @@
; $Id: ntdll.edf,v 1.90 2003/06/07 11:32:42 ekohl Exp $
; $Id: ntdll.edf,v 1.91 2003/06/09 13:44:11 ekohl Exp $
;
; ReactOS Operating System
;
@ -52,7 +52,7 @@ LdrQueryProcessModuleInformation=LdrQueryProcessModuleInformation@12
LdrShutdownProcess=LdrShutdownProcess@0
LdrShutdownThread=LdrShutdownThread@0
LdrUnloadDll=LdrUnloadDll@4
;LdrVerifyImageMatchesChecksum=LdrVerifyImageMatchesChecksum@16
LdrVerifyImageMatchesChecksum=LdrVerifyImageMatchesChecksum@16
NlsAnsiCodePage DATA
NlsMbCodePageTag DATA
NlsMbOemCodePageTag DATA

View file

@ -1,4 +1,4 @@
/* $Id: utils.c,v 1.65 2003/05/12 19:47:53 ekohl Exp $
/* $Id: utils.c,v 1.66 2003/06/09 13:43:42 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -1879,4 +1879,166 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
return(Status);
}
static BOOLEAN
LdrpCheckImageChecksum (IN PVOID BaseAddress,
IN ULONG ImageSize)
{
PIMAGE_NT_HEADERS Header;
PUSHORT Ptr;
ULONG Sum;
ULONG CalcSum;
ULONG HeaderSum;
ULONG i;
Header = RtlImageNtHeader (BaseAddress);
if (Header == NULL)
return FALSE;
HeaderSum = Header->OptionalHeader.CheckSum;
if (HeaderSum == 0)
return TRUE;
Sum = 0;
Ptr = (PUSHORT) BaseAddress;
for (i = 0; i < ImageSize / sizeof (USHORT); i++)
{
Sum += (ULONG)*Ptr;
if (HIWORD(Sum) != 0)
{
Sum = LOWORD(Sum) + HIWORD(Sum);
}
Ptr++;
}
if (ImageSize & 1)
{
Sum += (ULONG)*((PUCHAR)Ptr);
if (HIWORD(Sum) != 0)
{
Sum = LOWORD(Sum) + HIWORD(Sum);
}
}
CalcSum = (USHORT)(LOWORD(Sum) + HIWORD(Sum));
/* Subtract image checksum from calculated checksum. */
/* fix low word of checksum */
if (LOWORD(CalcSum) >= LOWORD(HeaderSum))
{
CalcSum -= LOWORD(HeaderSum);
}
else
{
CalcSum = ((LOWORD(CalcSum) - LOWORD(HeaderSum)) & 0xFFFF) - 1;
}
/* fix high word of checksum */
if (LOWORD(CalcSum) >= HIWORD(HeaderSum))
{
CalcSum -= HIWORD(HeaderSum);
}
else
{
CalcSum = ((LOWORD(CalcSum) - HIWORD(HeaderSum)) & 0xFFFF) - 1;
}
/* add file length */
CalcSum += ImageSize;
return (BOOLEAN)(CalcSum == HeaderSum);
}
/***************************************************************************
* NAME EXPORTED
* LdrVerifyImageMatchesChecksum
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* REVISIONS
*
* NOTE
*/
NTSTATUS STDCALL
LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
ULONG Unknown1,
ULONG Unknown2,
ULONG Unknown3)
{
FILE_STANDARD_INFORMATION FileInfo;
IO_STATUS_BLOCK IoStatusBlock;
HANDLE SectionHandle;
ULONG ViewSize;
PVOID BaseAddress;
BOOLEAN Result;
NTSTATUS Status;
DPRINT ("LdrVerifyImageMatchesChecksum() called\n");
Status = NtCreateSection (&SectionHandle,
SECTION_MAP_EXECUTE,
NULL,
NULL,
PAGE_EXECUTE,
SEC_COMMIT,
FileHandle);
if (!NT_SUCCESS(Status))
{
DPRINT1 ("NtCreateSection() failed (Status %lx)\n", Status);
return Status;
}
ViewSize = 0;
BaseAddress = NULL;
Status = NtMapViewOfSection (SectionHandle,
NtCurrentProcess (),
&BaseAddress,
0,
0,
NULL,
&ViewSize,
ViewShare,
0,
PAGE_EXECUTE);
if (!NT_SUCCESS(Status))
{
DPRINT1 ("NtMapViewOfSection() failed (Status %lx)\n", Status);
NtClose (SectionHandle);
return Status;
}
Status = NtQueryInformationFile (FileHandle,
&IoStatusBlock,
&FileInfo,
sizeof (FILE_STANDARD_INFORMATION),
FileStandardInformation);
if (!NT_SUCCESS(Status))
{
DPRINT1 ("NtMapViewOfSection() failed (Status %lx)\n", Status);
NtUnmapViewOfSection (NtCurrentProcess (),
BaseAddress);
NtClose (SectionHandle);
return Status;
}
Result = LdrpCheckImageChecksum (BaseAddress,
FileInfo.EndOfFile.u.LowPart);
if (Result == FALSE)
{
Status = STATUS_IMAGE_CHECKSUM_MISMATCH;
}
NtUnmapViewOfSection (NtCurrentProcess (),
BaseAddress);
NtClose (SectionHandle);
return Status;
}
/* EOF */