Alexandre Julliard : ntdll: Make wine_nt_to_unix_file_name() and wine_unix_to_nt_file_name() follow NT syscall conventions.

Alexandre Julliard julliard at winehq.org
Mon Aug 2 16:43:35 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Aug  2 15:54:05 2021 +0200

ntdll: Make wine_nt_to_unix_file_name() and wine_unix_to_nt_file_name() follow NT syscall conventions.

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

---

 dlls/gdi32/freetype.c  |  8 +++++---
 dlls/kernel32/path.c   |  8 +++++---
 dlls/ntdll/ntdll.spec  |  4 ++--
 dlls/ntdll/path.c      |  6 ++++--
 dlls/ntdll/unix/file.c | 11 +++++------
 include/winternl.h     |  6 +++---
 6 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index ee14bd25119..54af7562321 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -1352,7 +1352,7 @@ static int add_unix_face( const char *unix_name, const WCHAR *file, void *data_p
 static WCHAR *get_dos_file_name( LPCSTR str )
 {
     WCHAR *buffer;
-    SIZE_T len = strlen(str) + 1;
+    ULONG len = strlen(str) + 1;
 
     len += 8;  /* \??\unix prefix */
     if (!(buffer = RtlAllocateHeap( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return NULL;
@@ -1374,11 +1374,13 @@ static WCHAR *get_dos_file_name( LPCSTR str )
 static char *get_unix_file_name( LPCWSTR dosW )
 {
     UNICODE_STRING nt_name;
+    OBJECT_ATTRIBUTES attr;
     NTSTATUS status;
-    SIZE_T size = 256;
+    ULONG size = 256;
     char *buffer;
 
     if (!RtlDosPathNameToNtPathName_U( dosW, &nt_name, NULL, NULL )) return NULL;
+    InitializeObjectAttributes( &attr, &nt_name, 0, 0, NULL );
     for (;;)
     {
         if (!(buffer = RtlAllocateHeap( GetProcessHeap(), 0, size )))
@@ -1386,7 +1388,7 @@ static char *get_unix_file_name( LPCWSTR dosW )
             RtlFreeUnicodeString( &nt_name );
             return NULL;
         }
-        status = wine_nt_to_unix_file_name( &nt_name, buffer, &size, FILE_OPEN_IF );
+        status = wine_nt_to_unix_file_name( &attr, buffer, &size, FILE_OPEN_IF );
         if (status != STATUS_BUFFER_TOO_SMALL) break;
         RtlFreeHeap( GetProcessHeap(), 0, buffer );
     }
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 023dff826d6..957e9fca01d 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -275,11 +275,13 @@ DWORD /*BOOLEAN*/ WINAPI KERNEL32_Wow64EnableWow64FsRedirection( BOOLEAN enable
 char * CDECL wine_get_unix_file_name( LPCWSTR dosW )
 {
     UNICODE_STRING nt_name;
+    OBJECT_ATTRIBUTES attr;
     NTSTATUS status;
-    SIZE_T size = 256;
+    ULONG size = 256;
     char *buffer;
 
     if (!RtlDosPathNameToNtPathName_U( dosW, &nt_name, NULL, NULL )) return NULL;
+    InitializeObjectAttributes( &attr, &nt_name, 0, 0, NULL );
     for (;;)
     {
         if (!(buffer = HeapAlloc( GetProcessHeap(), 0, size )))
@@ -287,7 +289,7 @@ char * CDECL wine_get_unix_file_name( LPCWSTR dosW )
             RtlFreeUnicodeString( &nt_name );
             return NULL;
         }
-        status = wine_nt_to_unix_file_name( &nt_name, buffer, &size, FILE_OPEN_IF );
+        status = wine_nt_to_unix_file_name( &attr, buffer, &size, FILE_OPEN_IF );
         if (status != STATUS_BUFFER_TOO_SMALL) break;
         HeapFree( GetProcessHeap(), 0, buffer );
     }
@@ -313,7 +315,7 @@ WCHAR * CDECL wine_get_dos_file_name( LPCSTR str )
     UNICODE_STRING nt_name;
     NTSTATUS status;
     WCHAR *buffer;
-    SIZE_T len = strlen(str) + 1;
+    ULONG len = strlen(str) + 1;
 
     if (str[0] != '/')  /* relative path name */
     {
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index aad7bd89d14..5ac5a16ed44 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1645,5 +1645,5 @@
 @ cdecl wine_get_host_version(ptr ptr)
 
 # Filesystem
-@ cdecl -syscall wine_nt_to_unix_file_name(ptr ptr ptr long)
-@ cdecl -syscall wine_unix_to_nt_file_name(str ptr ptr)
+@ stdcall -syscall wine_nt_to_unix_file_name(ptr ptr ptr long)
+@ stdcall -syscall wine_unix_to_nt_file_name(str ptr ptr)
diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c
index 53be23fe4ec..131b0e33683 100644
--- a/dlls/ntdll/path.c
+++ b/dlls/ntdll/path.c
@@ -606,17 +606,19 @@ static ULONG get_full_path_helper(LPCWSTR name, LPWSTR buffer, ULONG size)
         {
             char *unix_name;
             WCHAR *nt_str;
-            SIZE_T buflen;
+            ULONG buflen;
             NTSTATUS status;
             UNICODE_STRING str;
+            OBJECT_ATTRIBUTES attr;
 
             nt_str = RtlAllocateHeap( GetProcessHeap(), 0, (wcslen(name) + 9) * sizeof(WCHAR) );
             wcscpy( nt_str, L"\\??\\unix" );
             wcscat( nt_str, name );
             RtlInitUnicodeString( &str, nt_str );
+            InitializeObjectAttributes( &attr, &str, 0, 0, NULL );
             buflen = 3 * wcslen(name) + 1;
             unix_name = RtlAllocateHeap( GetProcessHeap(), 0, buflen );
-            status = wine_nt_to_unix_file_name( &str, unix_name, &buflen, FILE_OPEN_IF );
+            status = wine_nt_to_unix_file_name( &attr, unix_name, &buflen, FILE_OPEN_IF );
             if (!status || status == STATUS_NO_SUCH_FILE)
             {
                 buflen = wcslen(name) + 9;
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index 10cbd64be70..45e444d8576 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -3435,17 +3435,16 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U
  * element doesn't have to exist; in that case STATUS_NO_SUCH_FILE is
  * returned, but the unix name is still filled in properly.
  */
-NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, char *nameA, SIZE_T *size,
+NTSTATUS WINAPI wine_nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char *nameA, ULONG *size,
                                           UINT disposition )
 {
     char *buffer = NULL;
     NTSTATUS status;
     UNICODE_STRING redir;
-    OBJECT_ATTRIBUTES attr;
+    OBJECT_ATTRIBUTES new_attr = *attr;
 
-    InitializeObjectAttributes( &attr, (UNICODE_STRING *)nameW, OBJ_CASE_INSENSITIVE, 0, NULL );
-    get_redirect( &attr, &redir );
-    status = nt_to_unix_file_name( &attr, &buffer, disposition );
+    get_redirect( &new_attr, &redir );
+    status = nt_to_unix_file_name( &new_attr, &buffer, disposition );
 
     if (buffer)
     {
@@ -3576,7 +3575,7 @@ NTSTATUS unix_to_nt_file_name( const char *name, WCHAR **nt )
 /******************************************************************
  *           wine_unix_to_nt_file_name
  */
-NTSTATUS CDECL wine_unix_to_nt_file_name( const char *name, WCHAR *buffer, SIZE_T *size )
+NTSTATUS WINAPI wine_unix_to_nt_file_name( const char *name, WCHAR *buffer, ULONG *size )
 {
     WCHAR *nt_name = NULL;
     NTSTATUS status;
diff --git a/include/winternl.h b/include/winternl.h
index f42261a9797..663d8aceaaa 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -4508,9 +4508,9 @@ NTSYSAPI void      WINAPI TpWaitForWork(TP_WORK *,BOOL);
 
 /* Wine internal functions */
 
-NTSYSAPI NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, char *nameA, SIZE_T *size,
-                                                   UINT disposition );
-NTSYSAPI NTSTATUS CDECL wine_unix_to_nt_file_name( const char *name, WCHAR *buffer, SIZE_T *size );
+NTSYSAPI NTSTATUS WINAPI wine_nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char *nameA, ULONG *size,
+                                                    UINT disposition );
+NTSYSAPI NTSTATUS WINAPI wine_unix_to_nt_file_name( const char *name, WCHAR *buffer, ULONG *size );
 
 
 /***********************************************************************




More information about the wine-cvs mailing list