ntdll: Use case sensitive search for \??\unix file names only.
Fixes crash on start in Planet Zoo and Jurassic World Evolution. Signed-off-by: Paul Gofman <pgofman@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
37238a74a5
commit
8898a69519
|
@ -263,7 +263,7 @@ BOOL WINAPI RemoveDirectoryW( LPCWSTR path )
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, FALSE );
|
||||
status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN );
|
||||
RtlFreeUnicodeString( &nt_name );
|
||||
if (!set_ntstatus( status ))
|
||||
{
|
||||
|
@ -342,7 +342,7 @@ char * CDECL wine_get_unix_file_name( LPCWSTR dosW )
|
|||
NTSTATUS status;
|
||||
|
||||
if (!RtlDosPathNameToNtPathName_U( dosW, &nt_name, NULL, NULL )) return NULL;
|
||||
status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN_IF, FALSE );
|
||||
status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN_IF );
|
||||
RtlFreeUnicodeString( &nt_name );
|
||||
if (status && status != STATUS_NO_SUCH_FILE)
|
||||
{
|
||||
|
|
|
@ -111,9 +111,9 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH NtQueryDirectoryFile( HANDLE handle, HANDLE ev
|
|||
* returned, but the unix name is still filled in properly.
|
||||
*/
|
||||
NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||
UINT disposition, BOOLEAN check_case )
|
||||
UINT disposition )
|
||||
{
|
||||
return unix_funcs->nt_to_unix_file_name( nameW, unix_name_ret, disposition, check_case );
|
||||
return unix_funcs->nt_to_unix_file_name( nameW, unix_name_ret, disposition );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1604,5 +1604,5 @@
|
|||
@ cdecl __wine_get_unix_codepage()
|
||||
|
||||
# Filesystem
|
||||
@ cdecl wine_nt_to_unix_file_name(ptr ptr long long)
|
||||
@ cdecl wine_nt_to_unix_file_name(ptr ptr long)
|
||||
@ cdecl wine_unix_to_nt_file_name(ptr ptr)
|
||||
|
|
|
@ -349,7 +349,7 @@ static void open_file_test(void)
|
|||
attr.Length = sizeof(attr);
|
||||
attr.RootDirectory = 0;
|
||||
attr.ObjectName = &nameW;
|
||||
attr.Attributes = OBJ_CASE_INSENSITIVE;
|
||||
attr.Attributes = 0;
|
||||
attr.SecurityDescriptor = NULL;
|
||||
attr.SecurityQualityOfService = NULL;
|
||||
status = pNtOpenFile( &dir, SYNCHRONIZE|FILE_LIST_DIRECTORY, &attr, &io,
|
||||
|
|
|
@ -3248,10 +3248,9 @@ static NTSTATUS nt_to_unix_file_name_attr( const OBJECT_ATTRIBUTES *attr, ANSI_S
|
|||
char *unix_name;
|
||||
int name_len, unix_len;
|
||||
NTSTATUS status;
|
||||
BOOLEAN check_case = !(attr->Attributes & OBJ_CASE_INSENSITIVE);
|
||||
|
||||
if (!attr->RootDirectory) /* without root dir fall back to normal lookup */
|
||||
return nt_to_unix_file_name( attr->ObjectName, unix_name_ret, disposition, check_case );
|
||||
return nt_to_unix_file_name( attr->ObjectName, unix_name_ret, disposition );
|
||||
|
||||
name = attr->ObjectName->Buffer;
|
||||
name_len = attr->ObjectName->Length / sizeof(WCHAR);
|
||||
|
@ -3280,7 +3279,7 @@ static NTSTATUS nt_to_unix_file_name_attr( const OBJECT_ATTRIBUTES *attr, ANSI_S
|
|||
if ((old_cwd = open( ".", O_RDONLY )) != -1 && fchdir( root_fd ) != -1)
|
||||
{
|
||||
status = lookup_unix_name( name, name_len, &unix_name, unix_len, 1,
|
||||
disposition, check_case );
|
||||
disposition, FALSE );
|
||||
if (fchdir( old_cwd ) == -1) chdir( "/" );
|
||||
}
|
||||
else status = STATUS_ACCESS_DENIED;
|
||||
|
@ -3317,7 +3316,7 @@ static NTSTATUS nt_to_unix_file_name_attr( const OBJECT_ATTRIBUTES *attr, ANSI_S
|
|||
* returned, but the unix name is still filled in properly.
|
||||
*/
|
||||
NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||
UINT disposition, BOOLEAN check_case )
|
||||
UINT disposition )
|
||||
{
|
||||
static const WCHAR unixW[] = {'u','n','i','x'};
|
||||
static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 };
|
||||
|
@ -3328,6 +3327,7 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u
|
|||
char *unix_name;
|
||||
int pos, ret, name_len, unix_len, prefix_len;
|
||||
WCHAR prefix[MAX_DIR_ENTRY_LEN + 1];
|
||||
BOOLEAN check_case = FALSE;
|
||||
BOOLEAN is_unix = FALSE;
|
||||
|
||||
name = nameW->Buffer;
|
||||
|
|
|
@ -931,7 +931,7 @@ static NTSTATUS CDECL load_so_dll( UNICODE_STRING *nt_name, void **module )
|
|||
NTSTATUS status;
|
||||
DWORD len;
|
||||
|
||||
if (nt_to_unix_file_name( nt_name, &unix_name, FILE_OPEN, FALSE )) return STATUS_DLL_NOT_FOUND;
|
||||
if (nt_to_unix_file_name( nt_name, &unix_name, FILE_OPEN )) return STATUS_DLL_NOT_FOUND;
|
||||
|
||||
/* remove .so extension from Windows name */
|
||||
len = nt_name->Length / sizeof(WCHAR);
|
||||
|
|
|
@ -665,7 +665,7 @@ static NTSTATUS fork_and_exec( UNICODE_STRING *path, int unixdir,
|
|||
ANSI_STRING unix_name;
|
||||
NTSTATUS status;
|
||||
|
||||
status = nt_to_unix_file_name( path, &unix_name, FILE_OPEN, FALSE );
|
||||
status = nt_to_unix_file_name( path, &unix_name, FILE_OPEN );
|
||||
if (status) return status;
|
||||
|
||||
#ifdef HAVE_PIPE2
|
||||
|
|
|
@ -125,7 +125,7 @@ extern NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT
|
|||
CONTEXT *context ) DECLSPEC_HIDDEN;
|
||||
|
||||
extern NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||
UINT disposition, BOOLEAN check_case ) DECLSPEC_HIDDEN;
|
||||
UINT disposition ) 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;
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ struct msghdr;
|
|||
struct _DISPATCHER_CONTEXT;
|
||||
|
||||
/* increment this when you change the function table */
|
||||
#define NTDLL_UNIXLIB_VERSION 71
|
||||
#define NTDLL_UNIXLIB_VERSION 72
|
||||
|
||||
struct unix_funcs
|
||||
{
|
||||
|
@ -329,7 +329,7 @@ struct unix_funcs
|
|||
|
||||
/* file functions */
|
||||
NTSTATUS (CDECL *nt_to_unix_file_name)( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||
UINT disposition, BOOLEAN check_case );
|
||||
UINT disposition );
|
||||
NTSTATUS (CDECL *unix_to_nt_file_name)( const ANSI_STRING *name, UNICODE_STRING *nt );
|
||||
void (CDECL *set_show_dot_files)( BOOL enable );
|
||||
|
||||
|
|
|
@ -3372,7 +3372,7 @@ NTSYSAPI void WINAPI TpWaitForWork(TP_WORK *,BOOL);
|
|||
/* Wine internal functions */
|
||||
|
||||
NTSYSAPI NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||
UINT disposition, BOOLEAN check_case );
|
||||
UINT disposition );
|
||||
NTSYSAPI NTSTATUS CDECL wine_unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt );
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue