[IMAGEHLP] Sync with Wine 3.0. CORE-14225

This commit is contained in:
Amine Khaldi 2018-01-19 00:37:52 +01:00
parent c4b0f2155f
commit fc87cf0bc3
3 changed files with 83 additions and 212 deletions

View file

@ -25,7 +25,8 @@
/*********************************************************************** /***********************************************************************
* Data * Data
*/ */
LIST_ENTRY image_list = { &image_list, &image_list };
static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
DECLSPEC_HIDDEN extern HANDLE IMAGEHLP_hHeap; DECLSPEC_HIDDEN extern HANDLE IMAGEHLP_hHeap;
@ -60,69 +61,57 @@ DWORD WINAPI GetImageUnusedHeaderBytes(
/*********************************************************************** /***********************************************************************
* ImageLoad (IMAGEHLP.@) * ImageLoad (IMAGEHLP.@)
*/ */
PLOADED_IMAGE WINAPI ImageLoad(PCSTR dll_name, PCSTR dll_path) PLOADED_IMAGE WINAPI ImageLoad(PCSTR DllName, PCSTR DllPath)
{ {
LOADED_IMAGE *image; PLOADED_IMAGE pLoadedImage;
TRACE("(%s, %s)\n", dll_name, dll_path); FIXME("(%s, %s): stub\n", DllName, DllPath);
image = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(*image)); pLoadedImage = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
if (!image) return NULL; if (pLoadedImage)
pLoadedImage->FileHeader = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(IMAGE_NT_HEADERS));
if (!MapAndLoad(dll_name, dll_path, image, TRUE, TRUE))
{ return pLoadedImage;
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.@) * ImageUnload (IMAGEHLP.@)
*/ */
BOOL WINAPI ImageUnload(PLOADED_IMAGE loaded_image) BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
{ {
LIST_ENTRY *entry, *mark; LIST_ENTRY *pCurrent, *pFind;
PLOADED_IMAGE image;
FIXME("(%p)\n", loaded_image); TRACE("(%p)\n", pLoadedImage);
if (!loaded_image) if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
{ {
/* No image loaded or null pointer */ /* No image loaded or null pointer */
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return FALSE; return FALSE;
} }
/* FIXME: do we really need to check this? */ pFind=&pLoadedImage->Links;
mark = &image_list; pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
for (entry = mark->Flink; entry != mark; entry = entry->Flink) while((pCurrent != pFind) &&
(pCurrent != NULL))
pCurrent = pCurrent->Flink;
if(!pCurrent)
{ {
image = CONTAINING_RECORD(entry, LOADED_IMAGE, Links); /* Not found */
if (image == loaded_image) SetLastError(ERROR_INVALID_PARAMETER);
break; return FALSE;
} }
if (entry == mark) if(pCurrent->Blink)
{ pCurrent->Blink->Flink = pCurrent->Flink;
/* Not found */ else
SetLastError(ERROR_INVALID_PARAMETER); IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
return FALSE; pCurrent->Flink, LOADED_IMAGE, Links):NULL;
}
entry->Blink->Flink = entry->Flink; if(pCurrent->Flink)
entry->Flink->Blink = entry->Blink; pCurrent->Flink->Blink = pCurrent->Blink;
UnMapAndLoad(loaded_image); return FALSE;
HeapFree(IMAGEHLP_hHeap, 0, loaded_image);
return TRUE;
} }
/*********************************************************************** /***********************************************************************

View file

@ -25,11 +25,9 @@
static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount); static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount);
/*********************************************************************** /***********************************************************************
* BindImage (IMAGEHLP.@) * BindImage (IMAGEHLP.@)
*
* NOTES
* See BindImageEx
*/ */
BOOL WINAPI BindImage( BOOL WINAPI BindImage(
PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath) PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath)
@ -39,138 +37,42 @@ BOOL WINAPI BindImage(
/*********************************************************************** /***********************************************************************
* BindImageEx (IMAGEHLP.@) * 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( BOOL WINAPI BindImageEx(
DWORD Flags, PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath, DWORD Flags, PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath,
PIMAGEHLP_STATUS_ROUTINE StatusRoutine) PIMAGEHLP_STATUS_ROUTINE StatusRoutine)
{ {
LOADED_IMAGE loaded_image; FIXME("(%d, %s, %s, %s, %p): stub\n",
const IMAGE_IMPORT_DESCRIPTOR *import_desc; Flags, debugstr_a(ImageName), debugstr_a(DllPath),
ULONG size; debugstr_a(SymbolPath), StatusRoutine
);
FIXME("(%d, %s, %s, %s, %p): semi-stub\n", return TRUE;
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;
} }
/*********************************************************************** /***********************************************************************
* CheckSum (internal) * CheckSum (internal)
*/ */
static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD ByteCount) static WORD CalcCheckSum(
DWORD StartValue, LPVOID BaseAddress, DWORD WordCount)
{ {
LPWORD Ptr; LPWORD Ptr;
DWORD Sum, i; DWORD Sum;
DWORD i;
Sum = StartValue; Sum = StartValue;
Ptr = (LPWORD)BaseAddress; Ptr = (LPWORD)BaseAddress;
for (i = ByteCount; i > 1; i -= 2) for (i = 0; i < WordCount; i++)
{ {
Sum += *Ptr; Sum += *Ptr;
if (HIWORD(Sum) != 0) if (HIWORD(Sum) != 0)
Sum = LOWORD(Sum) + HIWORD(Sum); {
Ptr++; Sum = LOWORD(Sum) + HIWORD(Sum);
} }
Ptr++;
}
if (i == 1) return (WORD)(LOWORD(Sum) + HIWORD(Sum));
Sum += *(BYTE *)Ptr;
return (WORD)(LOWORD(Sum) + HIWORD(Sum));
} }
@ -184,57 +86,37 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *) BaseAddress; IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *) BaseAddress;
PIMAGE_NT_HEADERS32 Header32; PIMAGE_NT_HEADERS32 Header32;
PIMAGE_NT_HEADERS64 Header64; PIMAGE_NT_HEADERS64 Header64;
PIMAGE_NT_HEADERS ret = NULL;
DWORD *ChecksumFile; DWORD *ChecksumFile;
DWORD CalcSum; DWORD CalcSum;
DWORD HdrSum = 0; DWORD HdrSum;
TRACE("(%p, %d, %p, %p)\n", TRACE("(%p, %d, %p, %p)\n",
BaseAddress, FileLength, HeaderSum, CheckSum 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)
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)
{ {
if (dos->e_magic != IMAGE_DOS_SIGNATURE) Header64 = (IMAGE_NT_HEADERS64 *)Header32;
#ifdef __REACTOS__ ChecksumFile = &Header64->OptionalHeader.CheckSum;
_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 else
{ return NULL;
/* nothing */
} HdrSum = *ChecksumFile;
__ENDTRY
/* Subtract image checksum from calculated checksum. */ /* Subtract image checksum from calculated checksum. */
/* fix low word of checksum */ /* fix low word of checksum */
@ -261,9 +143,9 @@ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
CalcSum += FileLength; CalcSum += FileLength;
*CheckSum = CalcSum; *CheckSum = CalcSum;
*HeaderSum = HdrSum; *HeaderSum = *ChecksumFile;
return ret; return (PIMAGE_NT_HEADERS) Header32;
} }
/*********************************************************************** /***********************************************************************

View 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/iccvid # Synced to Wine-3.0
reactos/dll/win32/ieframe # 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/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/imm32 # Synced to Wine-2.22
reactos/dll/win32/inetcomm # Synced to WineStaging-2.16 reactos/dll/win32/inetcomm # Synced to WineStaging-2.16
reactos/dll/win32/inetmib1 # Synced to WineStaging-2.9 reactos/dll/win32/inetmib1 # Synced to WineStaging-2.9