=?UTF-8?Q?Michael=20M=C3=BCller=20?=: imagehlp: Implement ImageLoad and cleanup ImageUnload.
Alexandre Julliard
julliard at winehq.org
Fri Aug 23 09:31:24 CDT 2019
Module: wine
Branch: stable
Commit: 0dd77b7c0764d4d8d770d50b5cace20bee8d731e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0dd77b7c0764d4d8d770d50b5cace20bee8d731e
Author: Michael Müller <michael at fds-team.de>
Date: Sat Mar 23 02:20:54 2019 +0100
imagehlp: Implement ImageLoad and cleanup ImageUnload.
Signed-off-by: Vijay Kiran Kamuju <infyquest at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 55a62c739c02135d18aa5af6ede304465cb0e030)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/imagehlp/access.c | 78 ++++++++++++++++++++++++---------------------
dlls/imagehlp/tests/image.c | 12 +++----
2 files changed, 47 insertions(+), 43 deletions(-)
diff --git a/dlls/imagehlp/access.c b/dlls/imagehlp/access.c
index 6a33c0c..66c3036 100644
--- a/dlls/imagehlp/access.c
+++ b/dlls/imagehlp/access.c
@@ -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;
-
- 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;
+
+ TRACE("(%p)\n", loaded_image);
- TRACE("(%p)\n", pLoadedImage);
-
- if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
+ /* 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;
}
/***********************************************************************
diff --git a/dlls/imagehlp/tests/image.c b/dlls/imagehlp/tests/image.c
index 4bc7a90..875d919 100644
--- a/dlls/imagehlp/tests/image.c
+++ b/dlls/imagehlp/tests/image.c
@@ -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;
More information about the wine-cvs
mailing list