imagehlp: Implement ImageLoad and cleanup ImageUnload.

Signed-off-by: Vijay Kiran Kamuju <infyquest@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Michael Müller 2019-03-23 02:20:54 +01:00 committed by Alexandre Julliard
parent 3eca7c1f8e
commit 55a62c739c
2 changed files with 46 additions and 42 deletions

View File

@ -33,8 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(imagehlp);
/***********************************************************************
* Data
*/
static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
static LIST_ENTRY image_list = { &image_list, &image_list };
DECLSPEC_HIDDEN extern HANDLE IMAGEHLP_hHeap;
@ -69,57 +68,62 @@ 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)
TRACE("(%p)\n", loaded_image);
/* FIXME: do we really need to check this? */
mark = &image_list;
for (entry = mark->Flink; entry != mark; entry = entry->Flink)
{
/* No image loaded or null pointer */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
image = CONTAINING_RECORD(entry, LOADED_IMAGE, Links);
if (image == loaded_image)
break;
}
pFind=&pLoadedImage->Links;
pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
while((pCurrent != pFind) &&
(pCurrent != NULL))
pCurrent = pCurrent->Flink;
if(!pCurrent)
if (entry == mark)
{
/* Not found */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
/* Not found */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if(pCurrent->Blink)
pCurrent->Blink->Flink = pCurrent->Flink;
else
IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
pCurrent->Flink, LOADED_IMAGE, Links):NULL;
entry->Blink->Flink = entry->Flink;
entry->Flink->Blink = entry->Blink;
if(pCurrent->Flink)
pCurrent->Flink->Blink = pCurrent->Blink;
UnMapAndLoad(loaded_image);
HeapFree(IMAGEHLP_hHeap, 0, loaded_image);
return FALSE;
return TRUE;
}
/***********************************************************************

View File

@ -457,9 +457,9 @@ static void test_image_load(void)
if (img)
{
todo_wine ok(!strcmp(img->ModuleName, temp_file),
ok(!strcmp(img->ModuleName, temp_file),
"unexpected ModuleName, got %s instead of %s\n", img->ModuleName, temp_file);
todo_wine ok(img->MappedAddress != NULL, "MappedAddress != NULL\n");
ok(img->MappedAddress != NULL, "MappedAddress != NULL\n");
if (img->MappedAddress)
{
ok(!memcmp(img->MappedAddress, &bin.dos_header, sizeof(bin.dos_header)),
@ -468,10 +468,10 @@ static void test_image_load(void)
ok(img->FileHeader != NULL, "FileHeader != NULL\n");
if (img->FileHeader)
{
todo_wine ok(!memcmp(img->FileHeader, &bin.nt_headers, sizeof(bin.nt_headers)),
ok(!memcmp(img->FileHeader, &bin.nt_headers, sizeof(bin.nt_headers)),
"FileHeader doesn't point to IMAGE_NT_HEADERS32\n");
}
todo_wine ok(img->NumberOfSections == 3,
ok(img->NumberOfSections == 3,
"unexpected NumberOfSections, got %d instead of 3\n", img->NumberOfSections);
if (img->NumberOfSections >= 3)
{
@ -485,7 +485,7 @@ static void test_image_load(void)
"unexpected name for section 2, expected .idata, got %s\n",
(const char *)img->Sections[2].Name);
}
todo_wine ok(img->Characteristics == 0x102,
ok(img->Characteristics == 0x102,
"unexpected Characteristics, got 0x%x instead of 0x102\n", img->Characteristics);
ok(img->fSystemImage == 0,
"unexpected fSystemImage, got %d instead of 0\n", img->fSystemImage);
@ -495,7 +495,7 @@ static void test_image_load(void)
"unexpected fReadOnly, got %d instead of 1\n", img->fReadOnly);
todo_wine ok(img->Version == 1 || broken(!img->Version) /* <= WinXP */,
"unexpected Version, got %d instead of 1\n", img->Version);
todo_wine ok(img->SizeOfImage == 0x600,
ok(img->SizeOfImage == 0x600,
"unexpected SizeOfImage, got 0x%x instead of 0x600\n", img->SizeOfImage);
count = 0xdeadbeef;