Alexandre Julliard : ntdll: Fill the image information data also for .so builtins.
Alexandre Julliard
julliard at winehq.org
Tue Jan 26 15:54:06 CST 2021
Module: wine
Branch: master
Commit: 6b90b96e2181385d7ff01b408eb95d246e5a0bde
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6b90b96e2181385d7ff01b408eb95d246e5a0bde
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 26 11:55:02 2021 +0100
ntdll: Fill the image information data also for .so builtins.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/loader.c | 48 +++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 43 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 955b1817ac3..5e2d5aeff7c 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -945,10 +945,43 @@ static void load_libwine(void)
}
+/***********************************************************************
+ * fill_builtin_image_info
+ */
+static void fill_builtin_image_info( void *module, pe_image_info_t *info )
+{
+ const IMAGE_DOS_HEADER *dos = (const IMAGE_DOS_HEADER *)module;
+ const IMAGE_NT_HEADERS *nt = (IMAGE_NT_HEADERS *)((const BYTE *)dos + dos->e_lfanew);
+
+ info->base = nt->OptionalHeader.ImageBase;
+ info->entry_point = info->base + nt->OptionalHeader.AddressOfEntryPoint;
+ info->map_size = nt->OptionalHeader.SizeOfImage;
+ info->stack_size = nt->OptionalHeader.SizeOfStackReserve;
+ info->stack_commit = nt->OptionalHeader.SizeOfStackCommit;
+ info->zerobits = 0;
+ info->subsystem = nt->OptionalHeader.Subsystem;
+ info->subsystem_minor = nt->OptionalHeader.MinorSubsystemVersion;
+ info->subsystem_major = nt->OptionalHeader.MajorSubsystemVersion;
+ info->osversion_major = nt->OptionalHeader.MajorOperatingSystemVersion;
+ info->osversion_minor = nt->OptionalHeader.MinorOperatingSystemVersion;
+ info->image_charact = nt->FileHeader.Characteristics;
+ info->dll_charact = nt->OptionalHeader.DllCharacteristics;
+ info->machine = nt->FileHeader.Machine;
+ info->contains_code = TRUE;
+ info->image_flags = IMAGE_FLAGS_WineBuiltin;
+ info->loader_flags = 0;
+ info->header_size = nt->OptionalHeader.SizeOfHeaders;
+ info->file_size = nt->OptionalHeader.SizeOfImage;
+ info->checksum = nt->OptionalHeader.CheckSum;
+ info->cpu = client_cpu;
+ info->__pad = 0;
+}
+
+
/***********************************************************************
* dlopen_dll
*/
-static NTSTATUS dlopen_dll( const char *so_name, void **ret_module )
+static NTSTATUS dlopen_dll( const char *so_name, void **ret_module, pe_image_info_t *image_info )
{
struct builtin_module *builtin;
void *module, *handle;
@@ -988,6 +1021,8 @@ static NTSTATUS dlopen_dll( const char *so_name, void **ret_module )
return STATUS_INVALID_IMAGE_FORMAT;
}
+ fill_builtin_image_info( module, image_info );
+
if (add_builtin_module( module, handle, NULL ))
{
dlclose( handle );
@@ -998,6 +1033,7 @@ static NTSTATUS dlopen_dll( const char *so_name, void **ret_module )
return STATUS_SUCCESS;
already_loaded:
+ fill_builtin_image_info( builtin->module, image_info );
*ret_module = builtin->module;
dlclose( handle );
return STATUS_SUCCESS;
@@ -1060,6 +1096,7 @@ done:
static NTSTATUS CDECL load_so_dll( UNICODE_STRING *nt_name, void **module )
{
static const WCHAR soW[] = {'.','s','o',0};
+ pe_image_info_t info;
char *unix_name;
NTSTATUS status;
DWORD len;
@@ -1070,7 +1107,7 @@ static NTSTATUS CDECL load_so_dll( UNICODE_STRING *nt_name, void **module )
len = nt_name->Length / sizeof(WCHAR);
if (len > 3 && !wcsicmp( nt_name->Buffer + len - 3, soW )) nt_name->Length -= 3 * sizeof(WCHAR);
- status = dlopen_dll( unix_name, module );
+ status = dlopen_dll( unix_name, module, &info );
free( unix_name );
return status;
}
@@ -1223,10 +1260,11 @@ static NTSTATUS open_builtin_file( char *name, HANDLE *mapping, void **module,
{
if (check_library_arch( fd ))
{
- if (!dlopen_dll( name, module ))
+ pe_image_info_t info;
+
+ if (!dlopen_dll( name, module, &info ))
{
- memset( image_info, 0, sizeof(*image_info) );
- image_info->u.ImageFlags = IMAGE_FLAGS_WineBuiltin;
+ virtual_fill_image_information( &info, image_info );
status = STATUS_SUCCESS;
}
else
More information about the wine-cvs
mailing list