Module: wine Branch: master Commit: ba5a86e349bc4f5943413b2d89cd1f1165b93ad7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ba5a86e349bc4f5943413b2d89... Author: Owen Rudge <orudge(a)codeweavers.com> Date: Fri Dec 4 10:12:00 2009 -0600 imagehlp: Check for 64-bit PE files in CheckSumMappedFile. --- dlls/imagehlp/modify.c | 32 ++++++++++++++++++++++++++------ 1 files changed, 26 insertions(+), 6 deletions(-) diff --git a/dlls/imagehlp/modify.c b/dlls/imagehlp/modify.c index 02636bd..debccc0 100644 --- a/dlls/imagehlp/modify.c +++ b/dlls/imagehlp/modify.c @@ -89,11 +89,14 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile( LPVOID BaseAddress, DWORD FileLength, LPDWORD HeaderSum, LPDWORD CheckSum) { - PIMAGE_NT_HEADERS Header; + IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *) BaseAddress; + PIMAGE_NT_HEADERS32 Header32; + PIMAGE_NT_HEADERS64 Header64; + DWORD *ChecksumFile; DWORD CalcSum; DWORD HdrSum; - FIXME("(%p, %d, %p, %p): stub\n", + TRACE("(%p, %d, %p, %p)\n", BaseAddress, FileLength, HeaderSum, CheckSum ); @@ -101,8 +104,25 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile( BaseAddress, (FileLength + 1) / sizeof(WORD)); - Header = RtlImageNtHeader(BaseAddress); - HdrSum = Header->OptionalHeader.CheckSum; + if (dos->e_magic != IMAGE_DOS_SIGNATURE) + return NULL; + + Header32 = (IMAGE_NT_HEADERS32 *)((char *)dos + dos->e_lfanew); + + if (Header32->Signature != IMAGE_NT_SIGNATURE) + return NULL; + + if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) + ChecksumFile = &Header32->OptionalHeader.CheckSum; + else if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) + { + Header64 = (IMAGE_NT_HEADERS64 *)Header32; + ChecksumFile = &Header64->OptionalHeader.CheckSum; + } + else + return NULL; + + HdrSum = *ChecksumFile; /* Subtract image checksum from calculated checksum. */ /* fix low word of checksum */ @@ -129,9 +149,9 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile( CalcSum += FileLength; *CheckSum = CalcSum; - *HeaderSum = Header->OptionalHeader.CheckSum; + *HeaderSum = *ChecksumFile; - return Header; + return (PIMAGE_NT_HEADERS) Header32; } /***********************************************************************