[IMAGEHLP] Sync with Wine 3.0. CORE-14225
authorAmine Khaldi <amine.khaldi@reactos.org>
Thu, 18 Jan 2018 23:37:52 +0000 (00:37 +0100)
committerAmine Khaldi <amine.khaldi@reactos.org>
Thu, 18 Jan 2018 23:37:52 +0000 (00:37 +0100)
dll/win32/imagehlp/access.c
dll/win32/imagehlp/modify.c
media/doc/README.WINE

index b386ce3..367efac 100644 (file)
@@ -25,7 +25,8 @@
 /***********************************************************************
  *           Data
  */
-LIST_ENTRY image_list = { &image_list, &image_list };
+
+static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
 
 DECLSPEC_HIDDEN extern HANDLE IMAGEHLP_hHeap;
 
@@ -60,69 +61,57 @@ DWORD WINAPI GetImageUnusedHeaderBytes(
 /***********************************************************************
  *             ImageLoad (IMAGEHLP.@)
  */
-PLOADED_IMAGE WINAPI ImageLoad(PCSTR dll_name, PCSTR dll_path)
+PLOADED_IMAGE WINAPI ImageLoad(PCSTR DllName, PCSTR DllPath)
 {
-    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;
+  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;
 }
 
 /***********************************************************************
  *             ImageUnload (IMAGEHLP.@)
  */
-BOOL WINAPI ImageUnload(PLOADED_IMAGE loaded_image)
+BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
 {
-    LIST_ENTRY *entry, *mark;
-    PLOADED_IMAGE image;
-
-    FIXME("(%p)\n", loaded_image);
+  LIST_ENTRY *pCurrent, *pFind;
 
-    if (!loaded_image)
+  TRACE("(%p)\n", pLoadedImage);
+  
+  if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
     {
-        /* No image loaded or null pointer */
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
+      /* No image loaded or null pointer */
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
     }
 
-    /* FIXME: do we really need to check this? */
-    mark = &image_list;
-    for (entry = mark->Flink; entry != mark; entry = entry->Flink)
+  pFind=&pLoadedImage->Links;
+  pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
+  while((pCurrent != pFind) &&
+    (pCurrent != NULL))
+      pCurrent = pCurrent->Flink;
+  if(!pCurrent)
     {
-        image = CONTAINING_RECORD(entry, LOADED_IMAGE, Links);
-        if (image == loaded_image)
-            break;
+      /* Not found */
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
     }
 
-    if (entry == mark)
-    {
-        /* 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 TRUE;
+  return FALSE;
 }
 
 /***********************************************************************
index 4ec92eb..6adabb6 100644 (file)
 
 static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount);
 
+
 /***********************************************************************
  *             BindImage (IMAGEHLP.@)
- *
- * NOTES
- *   See BindImageEx
  */
 BOOL WINAPI BindImage(
   PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath)
@@ -39,138 +37,42 @@ BOOL WINAPI BindImage(
 
 /***********************************************************************
  *             BindImageEx (IMAGEHLP.@)
- *
- * Compute the virtual address of each function imported by a PE image
- *
- * PARAMS
- *
- *   Flags         [in] Bind options
- *   ImageName     [in] File name of the image to be bound
- *   DllPath       [in] Root of the fallback search path in case the ImageName file cannot be opened
- *   SymbolPath    [in] Symbol file root search path
- *   StatusRoutine [in] Pointer to a status routine which will be called during the binding process
- *
- * RETURNS
- *   Success: TRUE
- *   Failure: FALSE
- *
- * NOTES
- *  Binding is not implemented yet, so far this function only enumerates
- *  all imported dlls/functions and returns TRUE.
  */
 BOOL WINAPI BindImageEx(
   DWORD Flags, PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath,
   PIMAGEHLP_STATUS_ROUTINE StatusRoutine)
 {
-    LOADED_IMAGE loaded_image;
-    const IMAGE_IMPORT_DESCRIPTOR *import_desc;
-    ULONG size;
-
-    FIXME("(%d, %s, %s, %s, %p): semi-stub\n",
-        Flags, debugstr_a(ImageName), debugstr_a(DllPath),
-        debugstr_a(SymbolPath), StatusRoutine
-    );
-
-    if (!(MapAndLoad(ImageName, DllPath, &loaded_image, TRUE, TRUE))) return FALSE;
-
-    if (!(import_desc = RtlImageDirectoryEntryToData((HMODULE)loaded_image.MappedAddress, FALSE,
-                                                     IMAGE_DIRECTORY_ENTRY_IMPORT, &size)))
-    {
-        UnMapAndLoad(&loaded_image);
-        return TRUE; /* No imported modules means nothing to bind, so we're done. */
-    }
-
-    /* FIXME: Does native imagehlp support both 32-bit and 64-bit PE executables? */
-#ifdef _WIN64
-    if (loaded_image.FileHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC)
-#else
-    if (loaded_image.FileHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
-#endif
-    {
-        FIXME("Wrong architecture in PE header, unable to enumerate imports\n");
-        UnMapAndLoad(&loaded_image);
-        return TRUE;
-    }
-
-    for (; import_desc->Name && import_desc->FirstThunk; ++import_desc)
-    {
-        IMAGE_THUNK_DATA *thunk;
-        char dll_fullname[MAX_PATH];
-        const char *dll_name;
-
-        if (!(dll_name = ImageRvaToVa(loaded_image.FileHeader, loaded_image.MappedAddress,
-                                      import_desc->Name, 0)))
-        {
-            UnMapAndLoad(&loaded_image);
-            SetLastError(ERROR_INVALID_ACCESS); /* FIXME */
-            return FALSE;
-        }
-
-        if (StatusRoutine)
-            StatusRoutine(BindImportModule, ImageName, dll_name, 0, 0);
-
-        if (!SearchPathA(DllPath, dll_name, 0, sizeof(dll_fullname), dll_fullname, 0))
-        {
-            UnMapAndLoad(&loaded_image);
-            SetLastError(ERROR_FILE_NOT_FOUND);
-            return FALSE;
-        }
-
-        if (!(thunk = ImageRvaToVa(loaded_image.FileHeader, loaded_image.MappedAddress,
-                                   import_desc->OriginalFirstThunk ? import_desc->OriginalFirstThunk :
-                                   import_desc->FirstThunk, 0)))
-        {
-            ERR("Can't grab thunk data of %s, going to next imported DLL\n", dll_name);
-            continue;
-        }
-
-        for (; thunk->u1.Ordinal; ++thunk)
-        {
-            /* Ignoring ordinal imports for now */
-            if(!IMAGE_SNAP_BY_ORDINAL(thunk->u1.Ordinal))
-            {
-                IMAGE_IMPORT_BY_NAME *iibn;
-
-                if (!(iibn = ImageRvaToVa(loaded_image.FileHeader, loaded_image.MappedAddress,
-                                          thunk->u1.AddressOfData, 0)))
-                {
-                    ERR("Can't grab import by name info, skipping to next ordinal\n");
-                    continue;
-                }
-
-                if (StatusRoutine)
-                    StatusRoutine(BindImportProcedure, ImageName, dll_fullname, 0, (ULONG_PTR)iibn->Name);
-            }
-        }
-    }
-
-    UnMapAndLoad(&loaded_image);
-    return TRUE;
+  FIXME("(%d, %s, %s, %s, %p): stub\n",
+    Flags, debugstr_a(ImageName), debugstr_a(DllPath),
+    debugstr_a(SymbolPath), StatusRoutine
+  );
+  return TRUE;
 }
 
 
 /***********************************************************************
  *             CheckSum (internal)
  */
-static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD ByteCount)
+static WORD CalcCheckSum(
+  DWORD StartValue, LPVOID BaseAddress, DWORD WordCount)
 {
-    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));
+   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));
 }
 
 
@@ -184,57 +86,37 @@ 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 = 0;
+  DWORD HdrSum;
 
   TRACE("(%p, %d, %p, %p)\n",
     BaseAddress, FileLength, HeaderSum, CheckSum
   );
 
-  CalcSum = (DWORD)CalcCheckSum(0, BaseAddress, FileLength);
+  CalcSum = (DWORD)CalcCheckSum(0,
+                               BaseAddress,
+                               (FileLength + 1) / sizeof(WORD));
 
-  __TRY
-  {
-    if (dos->e_magic != IMAGE_DOS_SIGNATURE)
-#ifdef __REACTOS__
-      _SEH2_LEAVE;
-#else
-      break;
-#endif
-
-    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
+  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)
   {
-    /* nothing */
+    Header64 = (IMAGE_NT_HEADERS64 *)Header32;
+    ChecksumFile = &Header64->OptionalHeader.CheckSum;
   }
-  __ENDTRY
+  else
+    return NULL;
+
+  HdrSum = *ChecksumFile;
 
   /* Subtract image checksum from calculated checksum. */
   /* fix low word of checksum */
@@ -261,9 +143,9 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
   CalcSum += FileLength;
 
   *CheckSum = CalcSum;
-  *HeaderSum = HdrSum;
+  *HeaderSum = *ChecksumFile;
 
-  return ret;
+  return (PIMAGE_NT_HEADERS) Header32;
 }
 
 /***********************************************************************
index 0d0cc1c..83a7f59 100644 (file)
@@ -76,7 +76,7 @@ reactos/dll/win32/httpapi             # Synced to WineStaging-2.9
 reactos/dll/win32/iccvid              # Synced to Wine-3.0
 reactos/dll/win32/ieframe             # Synced to Wine-3.0
 reactos/dll/win32/imaadp32.acm        # Synced to WineStaging-2.16
-reactos/dll/win32/imagehlp            # Synced to WineStaging-2.9
+reactos/dll/win32/imagehlp            # Synced to Wine-3.0
 reactos/dll/win32/imm32               # Synced to Wine-2.22
 reactos/dll/win32/inetcomm            # Synced to WineStaging-2.16
 reactos/dll/win32/inetmib1            # Synced to WineStaging-2.9