Alexandre Julliard : ntdll: Return the mapping size in virtual_map_builtin_module().

Alexandre Julliard julliard at winehq.org
Mon Mar 22 17:15:52 CDT 2021


Module: wine
Branch: master
Commit: 5dcd3c1dd97de2f20a4ed886ffe3e72be2ab8da0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5dcd3c1dd97de2f20a4ed886ffe3e72be2ab8da0

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Mar 22 09:56:48 2021 +0100

ntdll: Return the mapping size in virtual_map_builtin_module().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/loader.c       | 42 ++++++++++++++++++++++++++++--------------
 dlls/ntdll/unix/unix_private.h |  2 +-
 dlls/ntdll/unix/virtual.c      |  6 +++---
 3 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index f7bdb055871..25be205c696 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -1234,7 +1234,7 @@ static inline char *prepend( char *buffer, const char *str, size_t len )
  * Open a file for a new dll. Helper for open_builtin_file.
  */
 static NTSTATUS open_dll_file( const char *name, OBJECT_ATTRIBUTES *attr, void **module,
-                               SECTION_IMAGE_INFORMATION *image_info, BOOL prefer_native )
+                               SIZE_T *size_ptr, SECTION_IMAGE_INFORMATION *image_info, BOOL prefer_native )
 {
     LARGE_INTEGER size;
     NTSTATUS status;
@@ -1281,7 +1281,7 @@ static NTSTATUS open_dll_file( const char *name, OBJECT_ATTRIBUTES *attr, void *
         NtClose( mapping );
         return STATUS_IMAGE_ALREADY_LOADED;
     }
-    status = virtual_map_builtin_module( mapping, module );
+    status = virtual_map_builtin_module( mapping, module, size_ptr );
     NtClose( mapping );
     return status;
 }
@@ -1290,14 +1290,14 @@ static NTSTATUS open_dll_file( const char *name, OBJECT_ATTRIBUTES *attr, void *
 /***********************************************************************
  *           open_builtin_file
  */
-static NTSTATUS open_builtin_file( char *name, OBJECT_ATTRIBUTES *attr, void **module,
+static NTSTATUS open_builtin_file( char *name, OBJECT_ATTRIBUTES *attr, void **module, SIZE_T *size,
                                    SECTION_IMAGE_INFORMATION *image_info, BOOL prefer_native )
 {
     NTSTATUS status;
     int fd;
 
     *module = NULL;
-    status = open_dll_file( name, attr, module, image_info, prefer_native );
+    status = open_dll_file( name, attr, module, size, image_info, prefer_native );
     if (status != STATUS_DLL_NOT_FOUND) return status;
 
     /* try .so file */
@@ -1325,10 +1325,10 @@ static NTSTATUS open_builtin_file( char *name, OBJECT_ATTRIBUTES *attr, void **m
 
 
 /***********************************************************************
- *           load_builtin_dll
+ *           find_builtin_dll
  */
-static NTSTATUS CDECL load_builtin_dll( UNICODE_STRING *nt_name, void **module,
-                                        SECTION_IMAGE_INFORMATION *image_info, BOOL prefer_native )
+static NTSTATUS find_builtin_dll( UNICODE_STRING *nt_name, void **module, SIZE_T *size_ptr,
+                                  SECTION_IMAGE_INFORMATION *image_info, BOOL prefer_native )
 {
     unsigned int i, pos, namepos, namelen, maxlen = 0;
     unsigned int len = nt_name->Length / sizeof(WCHAR);
@@ -1369,7 +1369,7 @@ static NTSTATUS CDECL load_builtin_dll( UNICODE_STRING *nt_name, void **module,
         ptr = prepend( ptr, ptr, namelen );
         ptr = prepend( ptr, "/dlls", sizeof("/dlls") - 1 );
         ptr = prepend( ptr, build_dir, strlen(build_dir) );
-        status = open_builtin_file( ptr, &attr, module, image_info, prefer_native );
+        status = open_builtin_file( ptr, &attr, module, size_ptr, image_info, prefer_native );
         if (status != STATUS_DLL_NOT_FOUND) goto done;
 
         /* now as a program */
@@ -1380,7 +1380,7 @@ static NTSTATUS CDECL load_builtin_dll( UNICODE_STRING *nt_name, void **module,
         ptr = prepend( ptr, ptr, namelen );
         ptr = prepend( ptr, "/programs", sizeof("/programs") - 1 );
         ptr = prepend( ptr, build_dir, strlen(build_dir) );
-        status = open_builtin_file( ptr, &attr, module, image_info, prefer_native );
+        status = open_builtin_file( ptr, &attr, module, size_ptr, image_info, prefer_native );
         if (status != STATUS_DLL_NOT_FOUND) goto done;
     }
 
@@ -1388,17 +1388,15 @@ static NTSTATUS CDECL load_builtin_dll( UNICODE_STRING *nt_name, void **module,
     {
         file[pos + len + 1] = 0;
         ptr = prepend( file + pos, dll_paths[i], strlen(dll_paths[i]) );
-        status = open_builtin_file( ptr, &attr, module, image_info, prefer_native );
+        status = open_builtin_file( ptr, &attr, module, size_ptr, image_info, prefer_native );
         if (status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) found_image = TRUE;
         else if (status != STATUS_DLL_NOT_FOUND) goto done;
     }
 
     if (found_image) status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH;
     WARN( "cannot find builtin library for %s\n", debugstr_us(nt_name) );
-
 done:
-    if (status == STATUS_IMAGE_NOT_AT_BASE) status = STATUS_SUCCESS;
-    if (!status && ext)
+    if (status >= 0 && ext)
     {
         strcpy( ext, ".so" );
         set_builtin_unix_info( *module, ptr, NULL, NULL );
@@ -1408,6 +1406,21 @@ done:
 }
 
 
+/***********************************************************************
+ *           load_builtin_dll
+ */
+static NTSTATUS CDECL load_builtin_dll( UNICODE_STRING *nt_name, void **module,
+                                        SECTION_IMAGE_INFORMATION *image_info, BOOL prefer_native )
+{
+    SIZE_T size;
+    NTSTATUS status;
+
+    status = find_builtin_dll( nt_name, module, &size, image_info, prefer_native );
+    if (status == STATUS_IMAGE_NOT_AT_BASE) status = STATUS_SUCCESS;
+    return status;
+}
+
+
 #ifdef __FreeBSD__
 /* The PT_LOAD segments are sorted in increasing order, and the first
  * starts at the beginning of the ELF file. By parsing the file, we can
@@ -1500,12 +1513,13 @@ static void load_ntdll(void)
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING str;
     void *module;
+    SIZE_T size = 0;
     char *name = build_path( dll_dir, "ntdll.dll.so" );
 
     init_unicode_string( &str, path );
     InitializeObjectAttributes( &attr, &str, 0, 0, NULL );
     name[strlen(name) - 3] = 0;  /* remove .so */
-    status = open_builtin_file( name, &attr, &module, &info, FALSE );
+    status = open_builtin_file( name, &attr, &module, &size, &info, FALSE );
     if (status == STATUS_IMAGE_NOT_AT_BASE) relocate_ntdll( module );
     else if (status) fatal_error( "failed to load %s error %x\n", name, status );
     free( name );
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 1307364d5d3..e527f5f799b 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -178,7 +178,7 @@ extern void *anon_mmap_alloc( size_t size, int prot ) DECLSPEC_HIDDEN;
 extern void virtual_init(void) DECLSPEC_HIDDEN;
 extern ULONG_PTR get_system_affinity_mask(void) DECLSPEC_HIDDEN;
 extern void virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info ) DECLSPEC_HIDDEN;
-extern NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module ) DECLSPEC_HIDDEN;
+extern NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module, SIZE_T *size ) DECLSPEC_HIDDEN;
 extern NTSTATUS virtual_create_builtin_view( void *module, const UNICODE_STRING *nt_name,
                                              pe_image_info_t *info, void *so_handle ) DECLSPEC_HIDDEN;
 extern TEB *virtual_alloc_first_teb(void) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index d00178d6261..a38b8478371 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -2732,14 +2732,13 @@ void virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info )
 /***********************************************************************
  *           virtual_map_builtin_module
  */
-NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module )
+NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module, SIZE_T *size )
 {
     mem_size_t full_size;
     unsigned int sec_flags;
     HANDLE shared_file;
     pe_image_info_t *image_info = NULL;
     ACCESS_MASK access = SECTION_MAP_READ | SECTION_MAP_EXECUTE;
-    SIZE_T size = 0;
     NTSTATUS status;
     WCHAR *filename;
 
@@ -2749,9 +2748,10 @@ NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module )
     if (!image_info) return STATUS_INVALID_PARAMETER;
 
     *module = NULL;
+    *size = 0;
     filename = (WCHAR *)(image_info + 1);
     status = virtual_map_image( mapping, SECTION_MAP_READ | SECTION_MAP_EXECUTE,
-                                module, &size, 0, shared_file, 0, image_info, filename, TRUE );
+                                module, size, 0, shared_file, 0, image_info, filename, TRUE );
     if (shared_file) NtClose( shared_file );
     free( image_info );
     return status;




More information about the wine-cvs mailing list