Alexandre Julliard : ntdll: Add a helper function to open a file from its Unix path.

Alexandre Julliard julliard at winehq.org
Fri Jul 10 16:30:30 CDT 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jul 10 07:56:02 2020 +0200

ntdll: Add a helper function to open a file from its Unix path.

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

---

 dlls/ntdll/unix/file.c         | 63 +++++++++++++++++++++++++-----------------
 dlls/ntdll/unix/loader.c       | 34 ++++++++---------------
 dlls/ntdll/unix/unix_private.h |  3 ++
 3 files changed, 53 insertions(+), 47 deletions(-)

diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index a0ad361fcb..e985c75a41 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -3528,6 +3528,42 @@ void CDECL set_show_dot_files( BOOL enable )
 }
 
 
+/******************************************************************************
+ *              open_unix_file
+ *
+ * Helper for NtCreateFile that takes a Unix path.
+ */
+NTSTATUS open_unix_file( HANDLE *handle, const char *unix_name, ACCESS_MASK access,
+                         OBJECT_ATTRIBUTES *attr, ULONG attributes, ULONG sharing, ULONG disposition,
+                         ULONG options, void *ea_buffer, ULONG ea_length )
+{
+    static UNICODE_STRING empty_string;
+    struct object_attributes *objattr;
+    OBJECT_ATTRIBUTES unix_attr = *attr;
+    NTSTATUS status;
+    data_size_t len;
+
+    unix_attr.ObjectName = &empty_string;  /* we send the unix name instead */
+    if ((status = alloc_object_attributes( &unix_attr, &objattr, &len ))) return status;
+
+    SERVER_START_REQ( create_file )
+    {
+        req->access     = access;
+        req->sharing    = sharing;
+        req->create     = disposition;
+        req->options    = options;
+        req->attrs      = attributes;
+        wine_server_add_data( req, objattr, len );
+        wine_server_add_data( req, unix_name, strlen(unix_name) );
+        status = wine_server_call( req );
+        *handle = wine_server_ptr_handle( reply->handle );
+    }
+    SERVER_END_REQ;
+    free( objattr );
+    return status;
+}
+
+
 /******************************************************************************
  *              NtCreateFile   (NTDLL.@)
  */
@@ -3580,31 +3616,8 @@ NTSTATUS WINAPI NtCreateFile( HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBU
 
     if (io->u.Status == STATUS_SUCCESS)
     {
-        static UNICODE_STRING empty_string;
-        OBJECT_ATTRIBUTES unix_attr = *attr;
-        data_size_t len;
-        struct object_attributes *objattr;
-
-        unix_attr.ObjectName = &empty_string;  /* we send the unix name instead */
-        if ((io->u.Status = alloc_object_attributes( &unix_attr, &objattr, &len )))
-        {
-            RtlFreeHeap( GetProcessHeap(), 0, unix_name );
-            return io->u.Status;
-        }
-        SERVER_START_REQ( create_file )
-        {
-            req->access     = access;
-            req->sharing    = sharing;
-            req->create     = disposition;
-            req->options    = options;
-            req->attrs      = attributes;
-            wine_server_add_data( req, objattr, len );
-            wine_server_add_data( req, unix_name, strlen(unix_name) );
-            io->u.Status = wine_server_call( req );
-            *handle = wine_server_ptr_handle( reply->handle );
-        }
-        SERVER_END_REQ;
-        free( objattr );
+        io->u.Status = open_unix_file( handle, unix_name, access, attr, attributes,
+                                       sharing, disposition, options, ea_buffer, ea_length );
         RtlFreeHeap( GetProcessHeap(), 0, unix_name );
     }
     else WARN( "%s not found (%x)\n", debugstr_us(attr->ObjectName), io->u.Status );
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 14fbfae8cd..c90ad5969e 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -990,31 +990,26 @@ static inline char *prepend( char *buffer, const char *str, size_t len )
  *
  * Open a file for a new dll. Helper for find_dll_file.
  */
-static NTSTATUS open_dll_file( const WCHAR *name, void **module, pe_image_info_t *image_info )
+static NTSTATUS open_dll_file( const char *name, void **module, pe_image_info_t *image_info )
 {
     struct builtin_module *builtin;
-    FILE_BASIC_INFORMATION info;
-    OBJECT_ATTRIBUTES attr;
+    OBJECT_ATTRIBUTES attr = { sizeof(attr) };
     IO_STATUS_BLOCK io;
-    UNICODE_STRING nt_name;
     LARGE_INTEGER size;
     FILE_OBJECTID_BUFFER id;
+    struct stat st;
     SIZE_T len = 0;
     NTSTATUS status;
     HANDLE handle, mapping;
 
-    RtlInitUnicodeString( &nt_name, name );
-    InitializeObjectAttributes( &attr, &nt_name, OBJ_CASE_INSENSITIVE, 0, NULL );
-    if ((status = NtOpenFile( &handle, GENERIC_READ | SYNCHRONIZE, &attr, &io,
-                              FILE_SHARE_READ | FILE_SHARE_DELETE,
-                              FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE )))
+    if ((status = open_unix_file( &handle, name, GENERIC_READ | SYNCHRONIZE, &attr, 0,
+                                  FILE_SHARE_READ | FILE_SHARE_DELETE, FILE_OPEN,
+                                  FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE, NULL, 0 )))
     {
-        if (status != STATUS_OBJECT_PATH_NOT_FOUND &&
-            status != STATUS_OBJECT_NAME_NOT_FOUND &&
-            !NtQueryAttributesFile( &attr, &info ))
+        if (status != STATUS_OBJECT_PATH_NOT_FOUND && status != STATUS_OBJECT_NAME_NOT_FOUND)
         {
             /* if the file exists but failed to open, report the error */
-            return status;
+            if (!stat( name, &st )) return status;
         }
         /* otherwise continue searching */
         return STATUS_DLL_NOT_FOUND;
@@ -1026,7 +1021,7 @@ static NTSTATUS open_dll_file( const WCHAR *name, void **module, pe_image_info_t
         {
             if (!memcmp( &builtin->id, id.ObjectId, sizeof(builtin->id) ))
             {
-                TRACE( "%s is the same file as existing module %p\n", debugstr_w(name),
+                TRACE( "%s is the same file as existing module %p\n", debugstr_a(name),
                        builtin->module );
                 NtClose( handle );
                 NtUnmapViewOfSection( NtCurrentProcess(), *module );
@@ -1057,12 +1052,12 @@ static NTSTATUS open_dll_file( const WCHAR *name, void **module, pe_image_info_t
     /* ignore non-builtins */
     if (!(image_info->image_flags & IMAGE_FLAGS_WineBuiltin))
     {
-        WARN( "%s found in WINEDLLPATH but not a builtin, ignoring\n", debugstr_w(name) );
+        WARN( "%s found in WINEDLLPATH but not a builtin, ignoring\n", debugstr_a(name) );
         status = STATUS_DLL_NOT_FOUND;
     }
     else if (image_info->cpu != client_cpu)
     {
-        TRACE( "%s is for CPU %u, continuing search\n", debugstr_w(name), image_info->cpu );
+        TRACE( "%s is for CPU %u, continuing search\n", debugstr_a(name), image_info->cpu );
         status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH;
     }
 
@@ -1082,15 +1077,10 @@ static NTSTATUS open_dll_file( const WCHAR *name, void **module, pe_image_info_t
  */
 static NTSTATUS open_builtin_file( char *name, void **module, pe_image_info_t *image_info )
 {
-    WCHAR *nt_name = NULL;
     NTSTATUS status;
     int fd;
 
-    if ((status = unix_to_nt_file_name( name, &nt_name ))) return status;
-
-    status = open_dll_file( nt_name, module, image_info );
-    RtlFreeHeap( GetProcessHeap(), 0, nt_name );
-
+    status = open_dll_file( name, module, image_info );
     if (status != STATUS_DLL_NOT_FOUND) return status;
 
     /* try .so file */
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 711a0bed2b..6090190ee0 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -237,6 +237,9 @@ extern NTSTATUS tape_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTI
 extern NTSTATUS errno_to_status( int err ) DECLSPEC_HIDDEN;
 extern NTSTATUS nt_to_unix_file_name( const UNICODE_STRING *nameW, char **name_ret, UINT disposition ) DECLSPEC_HIDDEN;
 extern NTSTATUS unix_to_nt_file_name( const char *name, WCHAR **nt ) DECLSPEC_HIDDEN;
+extern NTSTATUS open_unix_file( HANDLE *handle, const char *unix_name, ACCESS_MASK access,
+                                OBJECT_ATTRIBUTES *attr, ULONG attributes, ULONG sharing, ULONG disposition,
+                                ULONG options, void *ea_buffer, ULONG ea_length ) DECLSPEC_HIDDEN;
 extern void init_files(void) DECLSPEC_HIDDEN;
 extern void init_cpu_info(void) DECLSPEC_HIDDEN;
 




More information about the wine-cvs mailing list