Make DIR_nt_to_unix return STATUS_NO_SUCH_FILE instead of
STATUS_OBJECT_NAME_NOT_FOUND to indicate that the last component didn't exist to allow distinguishing it from legitimate errors. Export it from ntdll, renamed to wine_nt_to_unix_file_name.
This commit is contained in:
parent
eb1711bf5e
commit
9db147e5e4
|
@ -1154,7 +1154,7 @@
|
||||||
@ varargs __wine_call_from_16_regs()
|
@ varargs __wine_call_from_16_regs()
|
||||||
|
|
||||||
# Unix files
|
# Unix files
|
||||||
@ cdecl wine_get_unix_file_name(wstr) ntdll.wine_get_unix_file_name
|
@ cdecl wine_get_unix_file_name(wstr)
|
||||||
|
|
||||||
# Init code
|
# Init code
|
||||||
@ cdecl __wine_kernel_init()
|
@ cdecl __wine_kernel_init()
|
||||||
|
|
|
@ -999,3 +999,23 @@ BOOL WINAPI MoveFileA( LPCSTR source, LPCSTR dest )
|
||||||
{
|
{
|
||||||
return MoveFileExA( source, dest, MOVEFILE_COPY_ALLOWED );
|
return MoveFileExA( source, dest, MOVEFILE_COPY_ALLOWED );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* wine_get_unix_file_name (KERNEL32.@) Not a Windows API
|
||||||
|
*
|
||||||
|
* Return the full Unix file name for a given path.
|
||||||
|
* Returned buffer must be freed by caller.
|
||||||
|
*/
|
||||||
|
char *wine_get_unix_file_name( LPCWSTR dosW )
|
||||||
|
{
|
||||||
|
UNICODE_STRING nt_name;
|
||||||
|
ANSI_STRING unix_name;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
|
if (!RtlDosPathNameToNtPathName_U( dosW, &nt_name, NULL, NULL )) return NULL;
|
||||||
|
status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FALSE, FALSE );
|
||||||
|
RtlFreeUnicodeString( &nt_name );
|
||||||
|
if (status && status != STATUS_NO_SUCH_FILE) return NULL;
|
||||||
|
return unix_name.Buffer;
|
||||||
|
}
|
||||||
|
|
|
@ -795,16 +795,16 @@ static inline int get_dos_prefix_len( const UNICODE_STRING *name )
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* DIR_nt_to_unix
|
* wine_nt_to_unix_file_name (NTDLL.@) Not a Windows API
|
||||||
*
|
*
|
||||||
* Convert a file name from NT namespace to Unix namespace.
|
* Convert a file name from NT namespace to Unix namespace.
|
||||||
*
|
*
|
||||||
* If check_last is 0, the last path element doesn't have to exist;
|
* If check_last is 0, the last path element doesn't have to exist;
|
||||||
* in that case STATUS_OBJECT_NAME_NOT_FOUND is returned, but the
|
* in that case STATUS_NO_SUCH_FILE is returned, but the
|
||||||
* unix name is still filled in properly.
|
* unix name is still filled in properly.
|
||||||
*/
|
*/
|
||||||
NTSTATUS DIR_nt_to_unix( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
NTSTATUS wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||||
int check_last, int check_case )
|
BOOLEAN check_last, BOOLEAN check_case )
|
||||||
{
|
{
|
||||||
static const WCHAR uncW[] = {'U','N','C','\\'};
|
static const WCHAR uncW[] = {'U','N','C','\\'};
|
||||||
static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 };
|
static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 };
|
||||||
|
@ -931,6 +931,7 @@ NTSTATUS DIR_nt_to_unix( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret
|
||||||
{
|
{
|
||||||
unix_name[pos] = '/';
|
unix_name[pos] = '/';
|
||||||
unix_name[pos + 1 + ret] = 0;
|
unix_name[pos + 1 + ret] = 0;
|
||||||
|
status = STATUS_NO_SUCH_FILE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -960,26 +961,6 @@ done:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* wine_get_unix_file_name (NTDLL.@) Not a Windows API
|
|
||||||
*
|
|
||||||
* Return the full Unix file name for a given path.
|
|
||||||
* Returned buffer must be freed by caller.
|
|
||||||
*/
|
|
||||||
char *wine_get_unix_file_name( LPCWSTR dosW )
|
|
||||||
{
|
|
||||||
UNICODE_STRING nt_name;
|
|
||||||
ANSI_STRING unix_name;
|
|
||||||
NTSTATUS status;
|
|
||||||
|
|
||||||
if (!RtlDosPathNameToNtPathName_U( dosW, &nt_name, NULL, NULL )) return NULL;
|
|
||||||
status = DIR_nt_to_unix( &nt_name, &unix_name, FALSE, FALSE );
|
|
||||||
RtlFreeUnicodeString( &nt_name );
|
|
||||||
if (status && status != STATUS_OBJECT_NAME_NOT_FOUND) return NULL;
|
|
||||||
return unix_name.Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* RtlDoesFileExists_U (NTDLL.@)
|
* RtlDoesFileExists_U (NTDLL.@)
|
||||||
*/
|
*/
|
||||||
|
@ -990,7 +971,7 @@ BOOLEAN WINAPI RtlDoesFileExists_U(LPCWSTR file_name)
|
||||||
BOOLEAN ret;
|
BOOLEAN ret;
|
||||||
|
|
||||||
if (!RtlDosPathNameToNtPathName_U( file_name, &nt_name, NULL, NULL )) return FALSE;
|
if (!RtlDosPathNameToNtPathName_U( file_name, &nt_name, NULL, NULL )) return FALSE;
|
||||||
ret = (DIR_nt_to_unix( &nt_name, &unix_name, TRUE, FALSE ) == STATUS_SUCCESS);
|
ret = (wine_nt_to_unix_file_name( &nt_name, &unix_name, TRUE, FALSE ) == STATUS_SUCCESS);
|
||||||
if (ret) RtlFreeAnsiString( &unix_name );
|
if (ret) RtlFreeAnsiString( &unix_name );
|
||||||
RtlFreeUnicodeString( &nt_name );
|
RtlFreeUnicodeString( &nt_name );
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -148,10 +148,10 @@ NTSTATUS WINAPI NtCreateFile( PHANDLE handle, ACCESS_MASK access, POBJECT_ATTRIB
|
||||||
|
|
||||||
check_last = (disposition == FILE_OPEN || disposition == FILE_OVERWRITE);
|
check_last = (disposition == FILE_OPEN || disposition == FILE_OVERWRITE);
|
||||||
|
|
||||||
io->u.Status = DIR_nt_to_unix( attr->ObjectName, &unix_name, check_last,
|
io->u.Status = wine_nt_to_unix_file_name( attr->ObjectName, &unix_name, check_last,
|
||||||
!(attr->Attributes & OBJ_CASE_INSENSITIVE) );
|
!(attr->Attributes & OBJ_CASE_INSENSITIVE) );
|
||||||
|
|
||||||
if (!check_last && io->u.Status == STATUS_OBJECT_NAME_NOT_FOUND)
|
if (!check_last && io->u.Status == STATUS_NO_SUCH_FILE)
|
||||||
{
|
{
|
||||||
created = TRUE;
|
created = TRUE;
|
||||||
io->u.Status = STATUS_SUCCESS;
|
io->u.Status = STATUS_SUCCESS;
|
||||||
|
@ -1025,7 +1025,7 @@ NTSTATUS WINAPI NtQueryFullAttributesFile( const OBJECT_ATTRIBUTES *attr,
|
||||||
ANSI_STRING unix_name;
|
ANSI_STRING unix_name;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
|
||||||
if (!(status = DIR_nt_to_unix( attr->ObjectName, &unix_name,
|
if (!(status = wine_nt_to_unix_file_name( attr->ObjectName, &unix_name,
|
||||||
TRUE, !(attr->Attributes & OBJ_CASE_INSENSITIVE) )))
|
TRUE, !(attr->Attributes & OBJ_CASE_INSENSITIVE) )))
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
|
@ -1124,7 +1124,7 @@
|
||||||
@ cdecl __wine_set_signal_handler(long ptr)
|
@ cdecl __wine_set_signal_handler(long ptr)
|
||||||
|
|
||||||
# Filesystem
|
# Filesystem
|
||||||
@ cdecl wine_get_unix_file_name(wstr)
|
@ cdecl wine_nt_to_unix_file_name(ptr ptr long long)
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# Wine dll separation hacks, these will go away, don't use them
|
# Wine dll separation hacks, these will go away, don't use them
|
||||||
|
|
|
@ -85,8 +85,6 @@ extern NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
|
||||||
/* file I/O */
|
/* file I/O */
|
||||||
extern NTSTATUS FILE_GetNtStatus(void);
|
extern NTSTATUS FILE_GetNtStatus(void);
|
||||||
extern BOOL DIR_is_hidden_file( const UNICODE_STRING *name );
|
extern BOOL DIR_is_hidden_file( const UNICODE_STRING *name );
|
||||||
extern NTSTATUS DIR_nt_to_unix( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
|
||||||
int check_last, int check_case );
|
|
||||||
|
|
||||||
/* virtual memory */
|
/* virtual memory */
|
||||||
typedef BOOL (*HANDLERPROC)(LPVOID, LPCVOID);
|
typedef BOOL (*HANDLERPROC)(LPVOID, LPCVOID);
|
||||||
|
|
|
@ -1511,6 +1511,11 @@ NTSTATUS WINAPI RtlWalkHeap(HANDLE,PVOID);
|
||||||
NTSTATUS WINAPI RtlpWaitForCriticalSection(RTL_CRITICAL_SECTION *);
|
NTSTATUS WINAPI RtlpWaitForCriticalSection(RTL_CRITICAL_SECTION *);
|
||||||
NTSTATUS WINAPI RtlpUnWaitCriticalSection(RTL_CRITICAL_SECTION *);
|
NTSTATUS WINAPI RtlpUnWaitCriticalSection(RTL_CRITICAL_SECTION *);
|
||||||
|
|
||||||
|
/* Wine internal functions */
|
||||||
|
|
||||||
|
extern NTSTATUS wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||||
|
BOOLEAN check_last, BOOLEAN check_case );
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Inline functions
|
* Inline functions
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -64,7 +64,7 @@ static int running_under_wine ()
|
||||||
HMODULE module = GetModuleHandleA("ntdll.dll");
|
HMODULE module = GetModuleHandleA("ntdll.dll");
|
||||||
|
|
||||||
if (!module) return 0;
|
if (!module) return 0;
|
||||||
return (GetProcAddress(module, "wine_get_unix_file_name") != NULL);
|
return (GetProcAddress(module, "wine_server_call") != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_version ()
|
void print_version ()
|
||||||
|
|
Loading…
Reference in New Issue