From: Rémi Bernon rbernon@codeweavers.com
--- dlls/ntdll/unix/loader.c | 12 +++++----- dlls/ntdll/unix/unix_private.h | 2 +- dlls/ntdll/unix/virtual.c | 40 +++++++++++++++++----------------- 3 files changed, 26 insertions(+), 28 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 7243be49489..42111cec8ca 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -1636,17 +1636,15 @@ done: * Load the builtin dll if specified by load order configuration. * Return STATUS_IMAGE_ALREADY_LOADED if we should keep the native one that we have found. */ -NTSTATUS load_builtin( const pe_image_info_t *image_info, WCHAR *filename, +NTSTATUS load_builtin( const pe_image_info_t *image_info, UNICODE_STRING *nt_name, void **module, SIZE_T *size, ULONG_PTR zero_bits ) { WORD machine = image_info->machine; /* request same machine as the native one */ NTSTATUS status; - UNICODE_STRING nt_name; SECTION_IMAGE_INFORMATION info; enum loadorder loadorder;
- init_unicode_string( &nt_name, filename ); - loadorder = get_load_order( &nt_name ); + loadorder = get_load_order( nt_name );
if (loadorder == LO_DISABLED) return STATUS_DLL_NOT_FOUND;
@@ -1657,7 +1655,7 @@ NTSTATUS load_builtin( const pe_image_info_t *image_info, WCHAR *filename, } else if (image_info->image_flags & IMAGE_FLAGS_WineFakeDll) { - TRACE( "%s is a fake Wine dll\n", debugstr_w(filename) ); + TRACE( "%s is a fake Wine dll\n", debugstr_us(nt_name) ); if (loadorder == LO_NATIVE) return STATUS_DLL_NOT_FOUND; loadorder = LO_BUILTIN; /* builtin with no fallback since mapping a fake dll is not useful */ } @@ -1668,9 +1666,9 @@ NTSTATUS load_builtin( const pe_image_info_t *image_info, WCHAR *filename, case LO_NATIVE_BUILTIN: return STATUS_IMAGE_ALREADY_LOADED; case LO_BUILTIN: - return find_builtin_dll( &nt_name, module, size, &info, zero_bits, machine, FALSE ); + return find_builtin_dll( nt_name, module, size, &info, zero_bits, machine, FALSE ); default: - status = find_builtin_dll( &nt_name, module, size, &info, zero_bits, machine, (loadorder == LO_DEFAULT) ); + status = find_builtin_dll( nt_name, module, size, &info, zero_bits, machine, (loadorder == LO_DEFAULT) ); if (status == STATUS_DLL_NOT_FOUND || status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) return STATUS_IMAGE_ALREADY_LOADED; return status; diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 9b3d92c7620..7ee7012a175 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -152,7 +152,7 @@ extern void *create_startup_info( const UNICODE_STRING *nt_image, const RTL_USER DWORD *info_size ) DECLSPEC_HIDDEN; extern char **build_envp( const WCHAR *envW ) DECLSPEC_HIDDEN; extern NTSTATUS exec_wineloader( char **argv, int socketfd, const pe_image_info_t *pe_info ) DECLSPEC_HIDDEN; -extern NTSTATUS load_builtin( const pe_image_info_t *image_info, WCHAR *filename, +extern NTSTATUS load_builtin( const pe_image_info_t *image_info, UNICODE_STRING *nt_name, void **addr_ptr, SIZE_T *size_ptr, ULONG_PTR zero_bits ) DECLSPEC_HIDDEN; extern BOOL is_builtin_path( const UNICODE_STRING *path, WORD *machine ) DECLSPEC_HIDDEN; extern NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *curdir, WCHAR **image, diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 2a00ac52811..6576248a27f 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -2202,7 +2202,7 @@ static NTSTATUS map_pe_header( void *ptr, size_t size, int fd, BOOL *removable ) * Map an executable (PE format) image into an existing view. * virtual_mutex must be held by caller. */ -static NTSTATUS map_image_into_view( struct file_view *view, const WCHAR *filename, int fd, void *orig_base, +static NTSTATUS map_image_into_view( struct file_view *view, UNICODE_STRING *nt_name, int fd, void *orig_base, SIZE_T header_size, ULONG image_flags, int shared_fd, BOOL removable ) { IMAGE_DOS_HEADER *dos; @@ -2218,7 +2218,7 @@ static NTSTATUS map_image_into_view( struct file_view *view, const WCHAR *filena char *ptr = view->base; SIZE_T total_size = view->size;
- TRACE_(module)( "mapping PE file %s at %p-%p\n", debugstr_w(filename), ptr, ptr + total_size ); + TRACE_(module)( "mapping PE file %s at %p-%p\n", debugstr_us(nt_name), ptr, ptr + total_size );
/* map the header */
@@ -2292,7 +2292,7 @@ static NTSTATUS map_image_into_view( struct file_view *view, const WCHAR *filena if (sec->VirtualAddress > total_size || end > total_size || end < sec->VirtualAddress) { WARN_(module)( "%s section %.8s too large (%x+%lx/%lx)\n", - debugstr_w(filename), sec->Name, (int)sec->VirtualAddress, map_size, total_size ); + debugstr_us(nt_name), sec->Name, (int)sec->VirtualAddress, map_size, total_size ); return status; }
@@ -2300,13 +2300,13 @@ static NTSTATUS map_image_into_view( struct file_view *view, const WCHAR *filena (sec->Characteristics & IMAGE_SCN_MEM_WRITE)) { TRACE_(module)( "%s mapping shared section %.8s at %p off %x (%x) size %lx (%lx) flags %x\n", - debugstr_w(filename), sec->Name, ptr + sec->VirtualAddress, + debugstr_us(nt_name), sec->Name, ptr + sec->VirtualAddress, (int)sec->PointerToRawData, (int)pos, file_size, map_size, (int)sec->Characteristics ); if (map_file_into_view( view, shared_fd, sec->VirtualAddress, map_size, pos, VPROT_COMMITTED | VPROT_READ | VPROT_WRITE, FALSE ) != STATUS_SUCCESS) { - ERR_(module)( "Could not map %s shared section %.8s\n", debugstr_w(filename), sec->Name ); + ERR_(module)( "Could not map %s shared section %.8s\n", debugstr_us(nt_name), sec->Name ); return status; }
@@ -2327,7 +2327,7 @@ static NTSTATUS map_image_into_view( struct file_view *view, const WCHAR *filena }
TRACE_(module)( "mapping %s section %.8s at %p off %x size %x virt %x flags %x\n", - debugstr_w(filename), sec->Name, ptr + sec->VirtualAddress, + debugstr_us(nt_name), sec->Name, ptr + sec->VirtualAddress, (int)sec->PointerToRawData, (int)sec->SizeOfRawData, (int)sec->Misc.VirtualSize, (int)sec->Characteristics );
@@ -2345,7 +2345,7 @@ static NTSTATUS map_image_into_view( struct file_view *view, const WCHAR *filena removable ) != STATUS_SUCCESS) { ERR_(module)( "Could not map %s section %.8s, file probably truncated\n", - debugstr_w(filename), sec->Name ); + debugstr_us(nt_name), sec->Name ); return status; }
@@ -2381,7 +2381,7 @@ static NTSTATUS map_image_into_view( struct file_view *view, const WCHAR *filena
if (!set_vprot( view, ptr + sec->VirtualAddress, size, vprot ) && (vprot & VPROT_EXEC)) ERR( "failed to set %08x protection on %s section %.8s, noexec filesystem?\n", - (int)sec->Characteristics, debugstr_w(filename), sec->Name ); + (int)sec->Characteristics, debugstr_us(nt_name), sec->Name ); }
#ifdef VALGRIND_LOAD_PDB_DEBUGINFO @@ -2446,7 +2446,7 @@ static unsigned int get_mapping_info( HANDLE handle, ACCESS_MASK access, unsigne */ static NTSTATUS virtual_map_image( HANDLE mapping, ACCESS_MASK access, void **addr_ptr, SIZE_T *size_ptr, ULONG_PTR zero_bits, HANDLE shared_file, ULONG alloc_type, - pe_image_info_t *image_info, WCHAR *filename, BOOL is_builtin ) + pe_image_info_t *image_info, UNICODE_STRING *nt_name, BOOL is_builtin ) { unsigned int vprot = SEC_IMAGE | SEC_FILE | VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY; int unix_fd = -1, needs_close; @@ -2479,7 +2479,7 @@ static NTSTATUS virtual_map_image( HANDLE mapping, ACCESS_MASK access, void **ad if (status) status = map_view( &view, NULL, size, alloc_type & MEM_TOP_DOWN, vprot, get_zero_bits_mask( zero_bits ), 0 ); if (status) goto done;
- status = map_image_into_view( view, filename, unix_fd, base, image_info->header_size, + status = map_image_into_view( view, nt_name, unix_fd, base, image_info->header_size, image_info->image_flags, shared_fd, needs_close ); if (status == STATUS_SUCCESS) { @@ -2524,7 +2524,6 @@ static unsigned int virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG_P ACCESS_MASK access; SIZE_T size; pe_image_info_t *image_info = NULL; - WCHAR *filename; void *base; int unix_handle = -1, needs_close; unsigned int vprot, sec_flags; @@ -2560,12 +2559,13 @@ static unsigned int virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG_P
if (image_info) { - filename = (WCHAR *)(image_info + 1); + UNICODE_STRING nt_name; + init_unicode_string( &nt_name, (WCHAR *)(image_info + 1) ); /* check if we can replace that mapping with the builtin */ - res = load_builtin( image_info, filename, addr_ptr, size_ptr, zero_bits ); + res = load_builtin( image_info, &nt_name, addr_ptr, size_ptr, zero_bits ); if (res == STATUS_IMAGE_ALREADY_LOADED) res = virtual_map_image( handle, access, addr_ptr, size_ptr, zero_bits, shared_file, - alloc_type, image_info, filename, FALSE ); + alloc_type, image_info, &nt_name, FALSE ); if (shared_file) NtClose( shared_file ); free( image_info ); return res; @@ -2787,8 +2787,8 @@ NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module, SIZE_T *size HANDLE shared_file; pe_image_info_t *image_info = NULL; ACCESS_MASK access = SECTION_MAP_READ | SECTION_MAP_EXECUTE; + UNICODE_STRING nt_name; NTSTATUS status; - WCHAR *filename;
if ((status = get_mapping_info( mapping, access, &sec_flags, &full_size, &shared_file, &image_info ))) return status; @@ -2797,27 +2797,27 @@ NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module, SIZE_T *size
*module = NULL; *size = 0; - filename = (WCHAR *)(image_info + 1); + init_unicode_string( &nt_name, (WCHAR *)(image_info + 1) );
if (!(image_info->image_flags & IMAGE_FLAGS_WineBuiltin)) /* ignore non-builtins */ { - WARN( "%s found in WINEDLLPATH but not a builtin, ignoring\n", debugstr_w(filename) ); + WARN( "%s found in WINEDLLPATH but not a builtin, ignoring\n", debugstr_us(&nt_name) ); status = STATUS_DLL_NOT_FOUND; } else if (machine && image_info->machine != machine) { - TRACE( "%s is for arch %04x, continuing search\n", debugstr_w(filename), image_info->machine ); + TRACE( "%s is for arch %04x, continuing search\n", debugstr_us(&nt_name), image_info->machine ); status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH; } else if (prefer_native && (image_info->dll_charact & IMAGE_DLLCHARACTERISTICS_PREFER_NATIVE)) { - TRACE( "%s has prefer-native flag, ignoring builtin\n", debugstr_w(filename) ); + TRACE( "%s has prefer-native flag, ignoring builtin\n", debugstr_us(&nt_name) ); status = STATUS_IMAGE_ALREADY_LOADED; } else { status = virtual_map_image( mapping, SECTION_MAP_READ | SECTION_MAP_EXECUTE, - module, size, zero_bits, shared_file, 0, image_info, filename, TRUE ); + module, size, zero_bits, shared_file, 0, image_info, &nt_name, TRUE ); virtual_fill_image_information( image_info, info ); }