/***********************************************************************
* 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;
/***********************************************************************
* ImageLoad (IMAGEHLP.@)
*/
-PLOADED_IMAGE WINAPI ImageLoad(PCSTR DllName, PCSTR DllPath)
+PLOADED_IMAGE WINAPI ImageLoad(PCSTR dll_name, PCSTR dll_path)
{
- PLOADED_IMAGE pLoadedImage;
-
- 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;
+ LOADED_IMAGE *image;
+
+ 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;
+
+ FIXME("(%p)\n", loaded_image);
- TRACE("(%p)\n", pLoadedImage);
-
- if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
+ 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;
}
/***********************************************************************
#include "precomp.h"
+#include <wine/exception.h>
#include <wine/winternl.h>
static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount);
/***********************************************************************
* 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;
-
- Sum = StartValue;
- Ptr = (LPWORD)BaseAddress;
- for (i = 0; i < WordCount; i++)
- {
- Sum += *Ptr;
- if (HIWORD(Sum) != 0)
- {
- Sum = LOWORD(Sum) + HIWORD(Sum);
- }
- Ptr++;
- }
-
- return (WORD)(LOWORD(Sum) + HIWORD(Sum));
+ LPWORD Ptr;
+ DWORD Sum, i;
+
+ Sum = StartValue;
+ Ptr = (LPWORD)BaseAddress;
+ for (i = ByteCount; i > 1; i -= 2)
+ {
+ Sum += *Ptr;
+ if (HIWORD(Sum) != 0)
+ Sum = LOWORD(Sum) + HIWORD(Sum);
+ Ptr++;
+ }
+
+ if (i == 1)
+ Sum += *(BYTE *)Ptr;
+
+ return (WORD)(LOWORD(Sum) + HIWORD(Sum));
}
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);
+
+ __TRY
+ {
+ if (dos->e_magic != IMAGE_DOS_SIGNATURE)
+#ifdef __REACTOS__
+ _SEH2_LEAVE;
+#else
+ break;
+#endif
- if (dos->e_magic != IMAGE_DOS_SIGNATURE)
- return NULL;
+ Header32 = (IMAGE_NT_HEADERS32 *)((char *)dos + dos->e_lfanew);
+ if (Header32->Signature != IMAGE_NT_SIGNATURE)
+#ifdef __REACTOS__
+ _SEH2_LEAVE;
+#else
+ break;
+#endif
- Header32 = (IMAGE_NT_HEADERS32 *)((char *)dos + dos->e_lfanew);
+ ret = (PIMAGE_NT_HEADERS)Header32;
- 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
+#ifdef __REACTOS__
+ _SEH2_LEAVE;
+#else
+ break;
+#endif
- if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
- ChecksumFile = &Header32->OptionalHeader.CheckSum;
- else if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
+ HdrSum = *ChecksumFile;
+ }
+ __EXCEPT_PAGE_FAULT
{
- Header64 = (IMAGE_NT_HEADERS64 *)Header32;
- ChecksumFile = &Header64->OptionalHeader.CheckSum;
+ /* nothing */
}
- else
- return NULL;
-
- HdrSum = *ChecksumFile;
+ __ENDTRY
/* Subtract image checksum from calculated checksum. */
/* fix low word of checksum */
CalcSum += FileLength;
*CheckSum = CalcSum;
- *HeaderSum = *ChecksumFile;
+ *HeaderSum = HdrSum;
- return (PIMAGE_NT_HEADERS) Header32;
+ return ret;
}
/***********************************************************************