[IMAGEHLP] Sync with Wine Staging 1.7.55. CORE-10536

svn path=/trunk/; revision=70015
This commit is contained in:
Amine Khaldi 2015-11-22 10:24:00 +00:00
parent d34d37d0af
commit 25dafb9f48
5 changed files with 109 additions and 96 deletions

View file

@ -17,7 +17,7 @@ add_library(imagehlp SHARED
${CMAKE_CURRENT_BINARY_DIR}/imagehlp.def)
set_module_type(imagehlp win32dll)
target_link_libraries(imagehlp wine)
target_link_libraries(imagehlp wine ${PSEH_LIB})
add_importlibs(imagehlp dbghelp msvcrt kernel32 ntdll)
add_pch(imagehlp precomp.h SOURCE)
add_cd_file(TARGET imagehlp DESTINATION reactos/system32 FOR all)

View file

@ -25,25 +25,7 @@
/***********************************************************************
* Data
*/
static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
NULL, /* ModuleName */
0, /* hFile */
NULL, /* MappedAddress */
NULL, /* FileHeader */
NULL, /* LastRvaSection */
0, /* NumberOfSections */
NULL, /* Sections */
1, /* Characteristics */
FALSE, /* fSystemImage */
FALSE, /* fDOSImage */
FALSE, /* fReadOnly */
0, /* Version */
{ &IMAGEHLP_EmptyLoadedImage.Links, &IMAGEHLP_EmptyLoadedImage.Links }, /* Links */
148, /* SizeOfImage; */
};
LIST_ENTRY image_list = { &image_list, &image_list };
DECLSPEC_HIDDEN extern HANDLE IMAGEHLP_hHeap;
@ -78,57 +60,69 @@ DWORD WINAPI GetImageUnusedHeaderBytes(
/***********************************************************************
* ImageLoad (IMAGEHLP.@)
*/
PLOADED_IMAGE WINAPI ImageLoad(PCSTR DllName, PCSTR DllPath)
PLOADED_IMAGE WINAPI ImageLoad(PCSTR dll_name, PCSTR dll_path)
{
PLOADED_IMAGE pLoadedImage;
LOADED_IMAGE *image;
FIXME("(%s, %s): stub\n", DllName, DllPath);
pLoadedImage = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
if (pLoadedImage)
pLoadedImage->FileHeader = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(IMAGE_NT_HEADERS));
return pLoadedImage;
TRACE("(%s, %s)\n", dll_name, dll_path);
image = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(*image));
if (!image) return NULL;
if (!MapAndLoad(dll_name, dll_path, image, TRUE, TRUE))
{
HeapFree(IMAGEHLP_hHeap, 0, image);
return NULL;
}
image->Links.Flink = image_list.Flink;
image->Links.Blink = &image_list;
image_list.Flink->Blink = &image->Links;
image_list.Flink = &image->Links;
return image;
}
/***********************************************************************
* ImageUnload (IMAGEHLP.@)
*/
BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
BOOL WINAPI ImageUnload(PLOADED_IMAGE loaded_image)
{
LIST_ENTRY *pCurrent, *pFind;
LIST_ENTRY *entry, *mark;
PLOADED_IMAGE image;
TRACE("(%p)\n", pLoadedImage);
if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
FIXME("(%p)\n", loaded_image);
if (!loaded_image)
{
/* No image loaded or null pointer */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
/* No image loaded or null pointer */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
pFind=&pLoadedImage->Links;
pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
while((pCurrent != pFind) &&
(pCurrent != NULL))
pCurrent = pCurrent->Flink;
if(!pCurrent)
/* FIXME: do we really need to check this? */
mark = &image_list;
for (entry = mark->Flink; entry != mark; entry = entry->Flink)
{
/* Not found */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
image = CONTAINING_RECORD(entry, LOADED_IMAGE, Links);
if (image == loaded_image)
break;
}
if(pCurrent->Blink)
pCurrent->Blink->Flink = pCurrent->Flink;
else
IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
pCurrent->Flink, LOADED_IMAGE, Links):NULL;
if (entry == mark)
{
/* Not found */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if(pCurrent->Flink)
pCurrent->Flink->Blink = pCurrent->Blink;
entry->Blink->Flink = entry->Flink;
entry->Flink->Blink = entry->Blink;
return FALSE;
UnMapAndLoad(loaded_image);
HeapFree(IMAGEHLP_hHeap, 0, loaded_image);
return TRUE;
}
/***********************************************************************

View file

@ -20,6 +20,7 @@
#include "precomp.h"
#include <wine/exception.h>
#include <wine/winternl.h>
static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount);
@ -151,26 +152,25 @@ BOOL WINAPI BindImageEx(
/***********************************************************************
* CheckSum (internal)
*/
static WORD CalcCheckSum(
DWORD StartValue, LPVOID BaseAddress, DWORD WordCount)
static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD ByteCount)
{
LPWORD Ptr;
DWORD Sum;
DWORD i;
LPWORD Ptr;
DWORD Sum, i;
Sum = StartValue;
Ptr = (LPWORD)BaseAddress;
for (i = 0; i < WordCount; i++)
{
Sum += *Ptr;
if (HIWORD(Sum) != 0)
{
Sum = LOWORD(Sum) + HIWORD(Sum);
}
Ptr++;
}
Sum = StartValue;
Ptr = (LPWORD)BaseAddress;
for (i = ByteCount; i > 1; i -= 2)
{
Sum += *Ptr;
if (HIWORD(Sum) != 0)
Sum = LOWORD(Sum) + HIWORD(Sum);
Ptr++;
}
return (WORD)(LOWORD(Sum) + HIWORD(Sum));
if (i == 1)
Sum += *(BYTE *)Ptr;
return (WORD)(LOWORD(Sum) + HIWORD(Sum));
}
@ -184,37 +184,57 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *) BaseAddress;
PIMAGE_NT_HEADERS32 Header32;
PIMAGE_NT_HEADERS64 Header64;
PIMAGE_NT_HEADERS ret = NULL;
DWORD *ChecksumFile;
DWORD CalcSum;
DWORD HdrSum;
DWORD HdrSum = 0;
TRACE("(%p, %d, %p, %p)\n",
BaseAddress, FileLength, HeaderSum, CheckSum
);
CalcSum = (DWORD)CalcCheckSum(0,
BaseAddress,
(FileLength + 1) / sizeof(WORD));
CalcSum = (DWORD)CalcCheckSum(0, BaseAddress, FileLength);
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)
__TRY
{
Header64 = (IMAGE_NT_HEADERS64 *)Header32;
ChecksumFile = &Header64->OptionalHeader.CheckSum;
}
else
return NULL;
if (dos->e_magic != IMAGE_DOS_SIGNATURE)
#ifdef __REACTOS__
_SEH2_LEAVE;
#else
break;
#endif
HdrSum = *ChecksumFile;
Header32 = (IMAGE_NT_HEADERS32 *)((char *)dos + dos->e_lfanew);
if (Header32->Signature != IMAGE_NT_SIGNATURE)
#ifdef __REACTOS__
_SEH2_LEAVE;
#else
break;
#endif
ret = (PIMAGE_NT_HEADERS)Header32;
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
#ifdef __REACTOS__
_SEH2_LEAVE;
#else
break;
#endif
HdrSum = *ChecksumFile;
}
__EXCEPT_PAGE_FAULT
{
/* nothing */
}
__ENDTRY
/* Subtract image checksum from calculated checksum. */
/* fix low word of checksum */
@ -241,9 +261,9 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
CalcSum += FileLength;
*CheckSum = CalcSum;
*HeaderSum = *ChecksumFile;
*HeaderSum = HdrSum;
return (PIMAGE_NT_HEADERS) Header32;
return ret;
}
/***********************************************************************

View file

@ -3,7 +3,6 @@
#include <stdarg.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#define COM_NO_WINDOWS_H

View file

@ -77,7 +77,7 @@ reactos/dll/win32/iccvid # Synced to WineStaging-1.7.55
reactos/dll/win32/icmp # Out of sync
reactos/dll/win32/ieframe # Synced to WineStaging-1.7.55
reactos/dll/win32/imaadp32.acm # Synced to WineStaging-1.7.47
reactos/dll/win32/imagehlp # Synced to WineStaging-1.7.47
reactos/dll/win32/imagehlp # Synced to WineStaging-1.7.55
reactos/dll/win32/imm32 # Synced to Wine-1.7.27
reactos/dll/win32/inetcomm # Synced to WineStaging-1.7.47
reactos/dll/win32/inetmib1 # Synced to WineStaging-1.7.47