From 5ebdeaaa372186b4c3a9098676c76423a1781154 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 9 Jul 2020 10:01:19 +0200 Subject: [PATCH] ntdll: Use char pointers instead of ANSI/UNICODE_STRING in unix_to_nt_file_name(). Signed-off-by: Alexandre Julliard --- dlls/ntdll/unix/env.c | 29 +++++----- dlls/ntdll/unix/file.c | 97 +++++++++++++++++++--------------- dlls/ntdll/unix/loader.c | 25 +++++---- dlls/ntdll/unix/unix_private.h | 2 +- 4 files changed, 79 insertions(+), 74 deletions(-) diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index c9764e5c6e5..039e5475feb 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -1057,16 +1057,14 @@ static void append_envW( WCHAR *env, SIZE_T *pos, const char *name, const WCHAR /* set an environment variable for one of the wine path variables */ static void add_path_var( WCHAR *env, SIZE_T *pos, const char *name, const char *path ) { - UNICODE_STRING nt_name; - ANSI_STRING unix_name; + WCHAR *nt_name; if (!path) append_envW( env, pos, name, NULL ); else { - RtlInitAnsiString( &unix_name, path ); - if (unix_to_nt_file_name( &unix_name, &nt_name )) return; - append_envW( env, pos, name, nt_name.Buffer ); - RtlFreeUnicodeString( &nt_name ); + if (unix_to_nt_file_name( path, &nt_name )) return; + append_envW( env, pos, name, nt_name ); + RtlFreeHeap( GetProcessHeap(), 0, nt_name ); } } @@ -1202,25 +1200,24 @@ void CDECL get_initial_directory( UNICODE_STRING *dir ) if (pwd) { - ANSI_STRING unix_name; - UNICODE_STRING nt_name; + WCHAR *nt_name; - RtlInitAnsiString( &unix_name, pwd ); - if (!unix_to_nt_file_name( &unix_name, &nt_name )) + if (!unix_to_nt_file_name( pwd, &nt_name )) { /* skip the \??\ prefix */ - if (nt_name.Length > 6 * sizeof(WCHAR) && nt_name.Buffer[5] == ':') + ULONG len = wcslen( nt_name ); + if (len > 6 && nt_name[5] == ':') { - dir->Length = nt_name.Length - 4 * sizeof(WCHAR); - memcpy( dir->Buffer, nt_name.Buffer + 4, dir->Length ); + dir->Length = (len - 4) * sizeof(WCHAR); + memcpy( dir->Buffer, nt_name + 4, dir->Length ); } else /* change \??\ to \\?\ */ { - dir->Length = nt_name.Length; - memcpy( dir->Buffer, nt_name.Buffer, dir->Length ); + dir->Length = len * sizeof(WCHAR); + memcpy( dir->Buffer, nt_name, dir->Length ); dir->Buffer[1] = '\\'; } - RtlFreeUnicodeString( &nt_name ); + RtlFreeHeap( GetProcessHeap(), 0, nt_name ); } } diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index 9b6158f2ccd..760fb4c2497 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -1767,7 +1767,7 @@ static NTSTATUS fill_file_info( const struct stat *st, ULONG attr, void *ptr, } -static NTSTATUS server_get_unix_name( HANDLE handle, ANSI_STRING *unix_name ) +static NTSTATUS server_get_unix_name( HANDLE handle, char **unix_name ) { data_size_t size = 1024; NTSTATUS ret; @@ -1777,7 +1777,6 @@ static NTSTATUS server_get_unix_name( HANDLE handle, ANSI_STRING *unix_name ) { name = RtlAllocateHeap( GetProcessHeap(), 0, size + 1 ); if (!name) return STATUS_NO_MEMORY; - unix_name->MaximumLength = size + 1; SERVER_START_REQ( get_handle_unix_name ) { @@ -1791,8 +1790,7 @@ static NTSTATUS server_get_unix_name( HANDLE handle, ANSI_STRING *unix_name ) if (!ret) { name[size] = 0; - unix_name->Buffer = name; - unix_name->Length = size; + *unix_name = name; break; } RtlFreeHeap( GetProcessHeap(), 0, name ); @@ -1801,15 +1799,15 @@ static NTSTATUS server_get_unix_name( HANDLE handle, ANSI_STRING *unix_name ) return ret; } -static NTSTATUS fill_name_info( const ANSI_STRING *unix_name, FILE_NAME_INFORMATION *info, LONG *name_len ) +static NTSTATUS fill_name_info( const char *unix_name, FILE_NAME_INFORMATION *info, LONG *name_len ) { - UNICODE_STRING nt_name; + WCHAR *nt_name; NTSTATUS status; if (!(status = unix_to_nt_file_name( unix_name, &nt_name ))) { - const WCHAR *ptr = nt_name.Buffer; - const WCHAR *end = ptr + (nt_name.Length / sizeof(WCHAR)); + const WCHAR *ptr = nt_name; + const WCHAR *end = ptr + wcslen( nt_name ); /* Skip the volume mount point. */ while (ptr != end && *ptr == '\\') ++ptr; @@ -1822,7 +1820,7 @@ static NTSTATUS fill_name_info( const ANSI_STRING *unix_name, FILE_NAME_INFORMAT else *name_len = info->FileNameLength; memcpy( info->FileName, ptr, *name_len ); - RtlFreeUnicodeString( &nt_name ); + RtlFreeHeap( GetProcessHeap(), 0, nt_name ); } return status; @@ -1953,7 +1951,7 @@ static struct mountmgr_unix_drive *get_mountmgr_fs_info( HANDLE handle, int fd ) struct mountmgr_unix_drive *drive; OBJECT_ATTRIBUTES attr; UNICODE_STRING string; - ANSI_STRING unix_name; + char *unix_name; IO_STATUS_BLOCK io; HANDLE mountmgr; NTSTATUS status; @@ -1962,8 +1960,8 @@ static struct mountmgr_unix_drive *get_mountmgr_fs_info( HANDLE handle, int fd ) if (server_get_unix_name( handle, &unix_name )) return NULL; - letter = find_dos_device( unix_name.Buffer ); - RtlFreeAnsiString( &unix_name ); + letter = find_dos_device( unix_name ); + RtlFreeHeap( GetProcessHeap(), 0, unix_name ); if (!(drive = RtlAllocateHeap( GetProcessHeap(), 0, 1024 ))) return NULL; @@ -3447,19 +3445,19 @@ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, char *nam /****************************************************************** * unix_to_nt_file_name */ -NTSTATUS CDECL unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt ) +NTSTATUS unix_to_nt_file_name( const char *name, WCHAR **nt ) { static const WCHAR unix_prefixW[] = {'\\','?','?','\\','u','n','i','x',0}; WCHAR dos_prefixW[] = {'\\','?','?','\\','A',':','\\',0}; const WCHAR *prefix = unix_prefixW; - unsigned int lenW, lenA = name->Length; - const char *path = name->Buffer; + unsigned int lenW, lenA = strlen(name); + const char *path = name; NTSTATUS status; - WCHAR *p; + WCHAR *p, *buffer; int drive; status = find_drive_rootA( &path, lenA, &drive ); - lenA -= (path - name->Buffer); + lenA -= path - name; if (status == STATUS_SUCCESS) { @@ -3470,18 +3468,29 @@ NTSTATUS CDECL unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt else if (status != STATUS_OBJECT_PATH_NOT_FOUND) return status; lenW = wcslen( prefix ); - if (!(nt->Buffer = RtlAllocateHeap( GetProcessHeap(), 0, (lenA + lenW + 1) * sizeof(WCHAR) ))) + if (!(buffer = RtlAllocateHeap( GetProcessHeap(), 0, (lenA + lenW + 1) * sizeof(WCHAR) ))) return STATUS_NO_MEMORY; - memcpy( nt->Buffer, prefix, lenW * sizeof(WCHAR) ); - lenW += ntdll_umbstowcs( path, lenA, nt->Buffer + lenW, lenA ); - nt->Buffer[lenW] = 0; - nt->Length = lenW * sizeof(WCHAR); - nt->MaximumLength = nt->Length + sizeof(WCHAR); - for (p = nt->Buffer; *p; p++) if (*p == '/') *p = '\\'; + memcpy( buffer, prefix, lenW * sizeof(WCHAR) ); + lenW += ntdll_umbstowcs( path, lenA, buffer + lenW, lenA ); + buffer[lenW] = 0; + for (p = buffer; *p; p++) if (*p == '/') *p = '\\'; + *nt = buffer; return STATUS_SUCCESS; } +/****************************************************************** + * wine_unix_to_nt_file_name + */ +NTSTATUS CDECL wine_unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt ) +{ + WCHAR *nt_name = NULL; + NTSTATUS status = unix_to_nt_file_name( name->Buffer, &nt_name ); + if (nt_name) RtlInitUnicodeString( nt, nt_name ); + return status; +} + + /*********************************************************************** * unmount_device * @@ -3974,7 +3983,7 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE handle, IO_STATUS_BLOCK *io, case FileAllInformation: { FILE_ALL_INFORMATION *info = ptr; - ANSI_STRING unix_name; + char *unix_name; if (fd_get_file_info( fd, options, &st, &attr ) == -1) io->u.Status = errno_to_status( errno ); else if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode)) @@ -3991,8 +4000,8 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE handle, IO_STATUS_BLOCK *io, info->ModeInformation.Mode = 0; /* FIXME */ info->AlignmentInformation.AlignmentRequirement = 1; /* FIXME */ - io->u.Status = fill_name_info( &unix_name, &info->NameInformation, &name_len ); - RtlFreeAnsiString( &unix_name ); + io->u.Status = fill_name_info( unix_name, &info->NameInformation, &name_len ); + RtlFreeHeap( GetProcessHeap(), 0, unix_name ); io->Information = FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName) + name_len; } } @@ -4038,13 +4047,13 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE handle, IO_STATUS_BLOCK *io, case FileNameInformation: { FILE_NAME_INFORMATION *info = ptr; - ANSI_STRING unix_name; + char *unix_name; if (!(io->u.Status = server_get_unix_name( handle, &unix_name ))) { LONG name_len = len - FIELD_OFFSET(FILE_NAME_INFORMATION, FileName); - io->u.Status = fill_name_info( &unix_name, info, &name_len ); - RtlFreeAnsiString( &unix_name ); + io->u.Status = fill_name_info( unix_name, info, &name_len ); + RtlFreeHeap( GetProcessHeap(), 0, unix_name ); io->Information = FIELD_OFFSET(FILE_NAME_INFORMATION, FileName) + name_len; } } @@ -4052,14 +4061,14 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE handle, IO_STATUS_BLOCK *io, case FileNetworkOpenInformation: { FILE_NETWORK_OPEN_INFORMATION *info = ptr; - ANSI_STRING unix_name; + char *unix_name; if (!(io->u.Status = server_get_unix_name( handle, &unix_name ))) { ULONG attributes; struct stat st; - if (get_file_info( unix_name.Buffer, &st, &attributes ) == -1) + if (get_file_info( unix_name, &st, &attributes ) == -1) io->u.Status = errno_to_status( errno ); else if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode)) io->u.Status = STATUS_INVALID_INFO_CLASS; @@ -4079,7 +4088,7 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE handle, IO_STATUS_BLOCK *io, info->EndOfFile = std.EndOfFile; info->FileAttributes = basic.FileAttributes; } - RtlFreeAnsiString( &unix_name ); + RtlFreeHeap( GetProcessHeap(), 0, unix_name ); } } break; @@ -6384,29 +6393,29 @@ NTSTATUS WINAPI NtQueryObject( HANDLE handle, OBJECT_INFORMATION_CLASS info_clas case ObjectNameInformation: { OBJECT_NAME_INFORMATION *p = ptr; - ANSI_STRING unix_name; + char *unix_name; + WCHAR *nt_name; /* first try as a file object */ if (!(status = server_get_unix_name( handle, &unix_name ))) { - UNICODE_STRING nt_name; - - if (!(status = unix_to_nt_file_name( &unix_name, &nt_name ))) + if (!(status = unix_to_nt_file_name( unix_name, &nt_name ))) { + ULONG size = (wcslen(nt_name) + 1) * sizeof(WCHAR); if (len < sizeof(*p)) status = STATUS_INFO_LENGTH_MISMATCH; - else if (len < sizeof(*p) + nt_name.MaximumLength) status = STATUS_BUFFER_OVERFLOW; + else if (len < sizeof(*p) + size) status = STATUS_BUFFER_OVERFLOW; else { p->Name.Buffer = (WCHAR *)(p + 1); - p->Name.Length = nt_name.Length; - p->Name.MaximumLength = nt_name.MaximumLength; - memcpy( p->Name.Buffer, nt_name.Buffer, nt_name.MaximumLength ); + p->Name.Length = size - sizeof(WCHAR); + p->Name.MaximumLength = size; + wcscpy( p->Name.Buffer, nt_name ); } - if (used_len) *used_len = sizeof(*p) + nt_name.MaximumLength; - RtlFreeUnicodeString( &nt_name ); + if (used_len) *used_len = sizeof(*p) + size; + RtlFreeHeap( GetProcessHeap(), 0, nt_name ); } - RtlFreeAnsiString( &unix_name ); + RtlFreeHeap( GetProcessHeap(), 0, unix_name ); break; } else if (status != STATUS_OBJECT_TYPE_MISMATCH) break; diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 461b325d213..14fbfae8cde 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -990,19 +990,21 @@ 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( UNICODE_STRING *nt_name, void **module, pe_image_info_t *image_info ) +static NTSTATUS open_dll_file( const WCHAR *name, void **module, pe_image_info_t *image_info ) { struct builtin_module *builtin; FILE_BASIC_INFORMATION info; OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK io; + UNICODE_STRING nt_name; LARGE_INTEGER size; FILE_OBJECTID_BUFFER id; SIZE_T len = 0; NTSTATUS status; HANDLE handle, mapping; - InitializeObjectAttributes( &attr, nt_name, OBJ_CASE_INSENSITIVE, 0, NULL ); + 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 ))) @@ -1024,7 +1026,7 @@ static NTSTATUS open_dll_file( UNICODE_STRING *nt_name, void **module, pe_image_ { if (!memcmp( &builtin->id, id.ObjectId, sizeof(builtin->id) )) { - TRACE( "%s is the same file as existing module %p\n", debugstr_w( nt_name->Buffer ), + TRACE( "%s is the same file as existing module %p\n", debugstr_w(name), builtin->module ); NtClose( handle ); NtUnmapViewOfSection( NtCurrentProcess(), *module ); @@ -1055,12 +1057,12 @@ static NTSTATUS open_dll_file( UNICODE_STRING *nt_name, void **module, pe_image_ /* ignore non-builtins */ if (!(image_info->image_flags & IMAGE_FLAGS_WineBuiltin)) { - WARN( "%s found in WINEDLLPATH but not a builtin, ignoring\n", debugstr_us(nt_name) ); + WARN( "%s found in WINEDLLPATH but not a builtin, ignoring\n", debugstr_w(name) ); status = STATUS_DLL_NOT_FOUND; } else if (image_info->cpu != client_cpu) { - TRACE( "%s is for CPU %u, continuing search\n", debugstr_us(nt_name), image_info->cpu ); + TRACE( "%s is for CPU %u, continuing search\n", debugstr_w(name), image_info->cpu ); status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH; } @@ -1080,17 +1082,14 @@ static NTSTATUS open_dll_file( UNICODE_STRING *nt_name, void **module, pe_image_ */ static NTSTATUS open_builtin_file( char *name, void **module, pe_image_info_t *image_info ) { - ANSI_STRING strA; - UNICODE_STRING nt_name; + WCHAR *nt_name = NULL; NTSTATUS status; int fd; - nt_name.Buffer = NULL; - RtlInitAnsiString( &strA, name ); - if ((status = unix_to_nt_file_name( &strA, &nt_name ))) return status; + if ((status = unix_to_nt_file_name( name, &nt_name ))) return status; - status = open_dll_file( &nt_name, module, image_info ); - RtlFreeUnicodeString( &nt_name ); + status = open_dll_file( nt_name, module, image_info ); + RtlFreeHeap( GetProcessHeap(), 0, nt_name ); if (status != STATUS_DLL_NOT_FOUND) return status; @@ -1534,7 +1533,7 @@ static struct unix_funcs unix_funcs = server_release_fd, server_init_process_done, wine_nt_to_unix_file_name, - unix_to_nt_file_name, + wine_unix_to_nt_file_name, set_show_dot_files, load_so_dll, load_builtin_dll, diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index d03e74b68b0..be3906cfd13 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -124,7 +124,6 @@ extern NTSTATUS CDECL exec_process( UNICODE_STRING *path, UNICODE_STRING *cmdlin extern NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, CONTEXT *context ) DECLSPEC_HIDDEN; -extern NTSTATUS CDECL unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt ) DECLSPEC_HIDDEN; extern void CDECL set_show_dot_files( BOOL enable ) DECLSPEC_HIDDEN; extern const char *home_dir DECLSPEC_HIDDEN; @@ -236,6 +235,7 @@ 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 void init_files(void) DECLSPEC_HIDDEN; extern void init_cpu_info(void) DECLSPEC_HIDDEN;