[PATCH] [ImageHlp]: MapAndLoad

Eric Pouech eric.pouech at wanadoo.fr
Fri Dec 1 14:56:31 CST 2006


- MapAndLoad should do some usefull stuff now
  (should fix #6099)

A+
---

 dlls/imagehlp/access.c |  142 +++++++++++++++++++++---------------------------
 1 files changed, 62 insertions(+), 80 deletions(-)

diff --git a/dlls/imagehlp/access.c b/dlls/imagehlp/access.c
index aa87e67..b00b365 100644
--- a/dlls/imagehlp/access.c
+++ b/dlls/imagehlp/access.c
@@ -145,96 +145,76 @@ BOOL WINAPI ImageUnload(PLOADED_IMAGE pL
 /***********************************************************************
  *		MapAndLoad (IMAGEHLP.@)
  */
-BOOL WINAPI MapAndLoad(
-  LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
-  BOOL bDotDll, BOOL bReadOnly)
+BOOL WINAPI MapAndLoad(LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
+                       BOOL bDotDll, BOOL bReadOnly)
 {
-  CHAR szFileName[MAX_PATH];
-  HANDLE hFile = NULL;
-  HANDLE hFileMapping = NULL;
-  HMODULE hModule = NULL;
-  PIMAGE_NT_HEADERS pNtHeader = NULL;
+    CHAR szFileName[MAX_PATH];
+    HANDLE hFile = INVALID_HANDLE_VALUE;
+    HANDLE hFileMapping = NULL;
+    PVOID mapping = NULL;
+    PIMAGE_NT_HEADERS pNtHeader = NULL;
 
-  TRACE("(%s, %s, %p, %d, %d)\n", pszImageName, pszDllPath, pLoadedImage,
-                                    bDotDll, bReadOnly);
-  
-  /* PathCombine(&szFileName, pszDllPath, pszImageName); */
-  /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
+    TRACE("(%s, %s, %p, %d, %d)\n",
+          pszImageName, pszDllPath, pLoadedImage, bDotDll, bReadOnly);
 
-  /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage) */
-  if(!(hFile = CreateFileA(
-    szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
-    NULL, OPEN_EXISTING, 0, NULL)))
+    if (!SearchPathA(pszDllPath, pszImageName, bDotDll ? ".DLL" : ".EXE", 
+                     sizeof(szFileName), szFileName, NULL))
     {
-      SetLastError(ERROR_FILE_NOT_FOUND);
-      goto Error;
+        SetLastError(ERROR_FILE_NOT_FOUND);
+        goto Error;
     }
 
-  if(!(hFileMapping = CreateFileMappingA(
-    hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
+    hFile = CreateFileA(szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
+                        NULL, OPEN_EXISTING, 0, NULL);
+    if (hFile == INVALID_HANDLE_VALUE)
     {
-      DWORD dwLastError = GetLastError();
-      WARN("CreateFileMapping: Error = %d\n", dwLastError);
-      SetLastError(dwLastError);
-      goto Error;
+        WARN("CreateFile: Error = %d\n", GetLastError());
+        goto Error;
     }
-  CloseHandle(hFile);
-  hFile = NULL;
 
-  if(!(hModule = (HMODULE) MapViewOfFile(
-    hFileMapping, FILE_MAP_READ, 0, 0, 0)))
+    hFileMapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL);
+    if (!hFileMapping)
     {
-      DWORD dwLastError = GetLastError();
-      WARN("MapViewOfFile: Error = %d\n", dwLastError);
-      SetLastError(dwLastError);
-      goto Error;
+        WARN("CreateFileMapping: Error = %d\n", GetLastError());
+        goto Error;
     }
 
-  CloseHandle(hFileMapping);
-  hFileMapping=NULL;
-
-  pLoadedImage = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
-
-  pNtHeader = RtlImageNtHeader(hModule);
-
-  pLoadedImage->ModuleName = HeapAlloc(IMAGEHLP_hHeap, 0, strlen(pszDllPath)+1); /* FIXME: Correct? */
-  strcpy( pLoadedImage->ModuleName, pszDllPath );
-  pLoadedImage->hFile = hFile;
-  pLoadedImage->MappedAddress = (PUCHAR) hModule;
-  pLoadedImage->FileHeader = pNtHeader;
-  pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
-    ((LPBYTE) &pNtHeader->OptionalHeader +
-      pNtHeader->FileHeader.SizeOfOptionalHeader);
-  pLoadedImage->NumberOfSections =
-    pNtHeader->FileHeader.NumberOfSections;
-  pLoadedImage->SizeOfImage =
-    pNtHeader->OptionalHeader.SizeOfImage;
-  pLoadedImage->Characteristics =
-    pNtHeader->FileHeader.Characteristics;
-  pLoadedImage->LastRvaSection = pLoadedImage->Sections;
-
-  pLoadedImage->fSystemImage = FALSE; /* FIXME */
-  pLoadedImage->fDOSImage = FALSE;    /* FIXME */
-
-  /* FIXME: Make thread safe */
-  pLoadedImage->Links.Flink = NULL;
-  pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage->Links;
-  if(IMAGEHLP_pLastLoadedImage)
-    IMAGEHLP_pLastLoadedImage->Links.Flink = &pLoadedImage->Links;
-  IMAGEHLP_pLastLoadedImage = pLoadedImage;
-  if(!IMAGEHLP_pFirstLoadedImage)
-    IMAGEHLP_pFirstLoadedImage = pLoadedImage;
-
-  return TRUE;
+    mapping = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
+    CloseHandle(hFileMapping);
+    if (!mapping)
+    {
+        WARN("MapViewOfFile: Error = %d\n", GetLastError());
+        goto Error;
+    }
+    
+    pNtHeader = RtlImageNtHeader(mapping);
+
+    pLoadedImage->ModuleName       = HeapAlloc(GetProcessHeap(), 0,
+                                               strlen(szFileName) + 1);
+    if (pLoadedImage->ModuleName) strcpy(pLoadedImage->ModuleName, szFileName);
+    pLoadedImage->hFile            = hFile;
+    pLoadedImage->MappedAddress    = mapping;
+    pLoadedImage->FileHeader       = pNtHeader;
+    pLoadedImage->Sections         = (PIMAGE_SECTION_HEADER)
+        ((LPBYTE) &pNtHeader->OptionalHeader +
+         pNtHeader->FileHeader.SizeOfOptionalHeader);
+    pLoadedImage->NumberOfSections = pNtHeader->FileHeader.NumberOfSections;
+    pLoadedImage->SizeOfImage      = pNtHeader->OptionalHeader.SizeOfImage;
+    pLoadedImage->Characteristics  = pNtHeader->FileHeader.Characteristics;
+    pLoadedImage->LastRvaSection   = pLoadedImage->Sections;
+
+    pLoadedImage->fSystemImage     = FALSE; /* FIXME */
+    pLoadedImage->fDOSImage        = FALSE; /* FIXME */
+
+    pLoadedImage->Links.Flink      = &pLoadedImage->Links;
+    pLoadedImage->Links.Blink      = &pLoadedImage->Links;
+
+    return TRUE;
 
 Error:
-  if(hModule)
-    UnmapViewOfFile((PVOID) hModule);
-  if(hFileMapping)
-    CloseHandle(hFileMapping);
-  if(hFile)
-    CloseHandle(hFile);
-  return FALSE;
+    if (mapping) UnmapViewOfFile(mapping);
+    if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);
+    return FALSE;
 }
 
 /***********************************************************************
@@ -254,9 +234,11 @@ BOOL WINAPI SetImageConfigInformation(
 /***********************************************************************
  *		UnMapAndLoad (IMAGEHLP.@)
  */
-BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
+BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE pLoadedImage)
 {
-  FIXME("(%p): stub\n", LoadedImage);
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return FALSE;
+    HeapFree(GetProcessHeap(), 0, pLoadedImage->ModuleName);
+    /* FIXME: MSDN states that a new checksum is computed and stored into the file */
+    if (pLoadedImage->MappedAddress) UnmapViewOfFile(pLoadedImage->MappedAddress);
+    if (pLoadedImage->hFile != INVALID_HANDLE_VALUE) CloseHandle(pLoadedImage->hFile);
+    return TRUE;
 }



More information about the wine-patches mailing list