diff --git a/reactos/dll/win32/imagehlp/CMakeLists.txt b/reactos/dll/win32/imagehlp/CMakeLists.txt index da7b2392480..a07c8d75add 100644 --- a/reactos/dll/win32/imagehlp/CMakeLists.txt +++ b/reactos/dll/win32/imagehlp/CMakeLists.txt @@ -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) diff --git a/reactos/dll/win32/imagehlp/access.c b/reactos/dll/win32/imagehlp/access.c index cdeee792b7e..b386ce323dd 100644 --- a/reactos/dll/win32/imagehlp/access.c +++ b/reactos/dll/win32/imagehlp/access.c @@ -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; } /*********************************************************************** diff --git a/reactos/dll/win32/imagehlp/modify.c b/reactos/dll/win32/imagehlp/modify.c index d76d150c440..4ec92ebc98b 100644 --- a/reactos/dll/win32/imagehlp/modify.c +++ b/reactos/dll/win32/imagehlp/modify.c @@ -20,6 +20,7 @@ #include "precomp.h" +#include #include 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; } /*********************************************************************** diff --git a/reactos/dll/win32/imagehlp/precomp.h b/reactos/dll/win32/imagehlp/precomp.h index fbca3c7e800..e9f8eef0a86 100644 --- a/reactos/dll/win32/imagehlp/precomp.h +++ b/reactos/dll/win32/imagehlp/precomp.h @@ -3,7 +3,6 @@ #include -#define WIN32_NO_STATUS #define _INC_WINDOWS #define COM_NO_WINDOWS_H diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 236d2dfccc7..56f47cee2f3 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -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