/* * NTDLL directory functions * * Copyright 1993 Erik Bos * Copyright 2003 Eric Pouech * Copyright 1996, 2004 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include "ntstatus.h" #define WIN32_NO_STATUS #define NONAMELESSUNION #include "windef.h" #include "winnt.h" #include "winternl.h" #include "ddk/wdm.h" #include "ntdll_misc.h" #include "wine/server.h" #include "wine/list.h" #include "wine/debug.h" #include "wine/exception.h" #define IS_OPTION_TRUE(ch) ((ch) == 'y' || (ch) == 'Y' || (ch) == 't' || (ch) == 'T' || (ch) == '1') static BOOL show_dot_files; /*********************************************************************** * init_directories */ void init_directories(void) { static const WCHAR WineW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e',0}; static const WCHAR ShowDotFilesW[] = {'S','h','o','w','D','o','t','F','i','l','e','s',0}; char tmp[80]; HANDLE root, hkey; DWORD dummy; OBJECT_ATTRIBUTES attr; UNICODE_STRING nameW; RtlOpenCurrentUser( KEY_ALL_ACCESS, &root ); attr.Length = sizeof(attr); attr.RootDirectory = root; attr.ObjectName = &nameW; attr.Attributes = 0; attr.SecurityDescriptor = NULL; attr.SecurityQualityOfService = NULL; RtlInitUnicodeString( &nameW, WineW ); /* @@ Wine registry key: HKCU\Software\Wine */ if (!NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr )) { RtlInitUnicodeString( &nameW, ShowDotFilesW ); if (!NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation, tmp, sizeof(tmp), &dummy )) { WCHAR *str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)tmp)->Data; show_dot_files = IS_OPTION_TRUE( str[0] ); } NtClose( hkey ); } NtClose( root ); unix_funcs->set_show_dot_files( show_dot_files ); } /****************************************************************************** * NtQueryDirectoryFile [NTDLL.@] * ZwQueryDirectoryFile [NTDLL.@] */ NTSTATUS WINAPI DECLSPEC_HOTPATCH NtQueryDirectoryFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc_routine, PVOID apc_context, PIO_STATUS_BLOCK io, PVOID buffer, ULONG length, FILE_INFORMATION_CLASS info_class, BOOLEAN single_entry, PUNICODE_STRING mask, BOOLEAN restart_scan ) { return unix_funcs->NtQueryDirectoryFile( handle, event, apc_routine, apc_context, io, buffer, length, info_class, single_entry, mask, restart_scan ); } /****************************************************************************** * wine_nt_to_unix_file_name (NTDLL.@) Not a Windows API * * Convert a file name from NT namespace to Unix namespace. * * If disposition is not FILE_OPEN or FILE_OVERWRITE, the last path * 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, ANSI_STRING *unix_name_ret, UINT disposition, BOOLEAN check_case ) { return unix_funcs->nt_to_unix_file_name( nameW, unix_name_ret, disposition, check_case ); } /****************************************************************** * RtlWow64EnableFsRedirection (NTDLL.@) */ NTSTATUS WINAPI RtlWow64EnableFsRedirection( BOOLEAN enable ) { if (!is_wow64) return STATUS_NOT_IMPLEMENTED; ntdll_get_thread_data()->wow64_redir = enable; return STATUS_SUCCESS; } /****************************************************************** * RtlWow64EnableFsRedirectionEx (NTDLL.@) */ NTSTATUS WINAPI RtlWow64EnableFsRedirectionEx( ULONG disable, ULONG *old_value ) { if (!is_wow64) return STATUS_NOT_IMPLEMENTED; __TRY { *old_value = !ntdll_get_thread_data()->wow64_redir; } __EXCEPT_PAGE_FAULT { return STATUS_ACCESS_VIOLATION; } __ENDTRY ntdll_get_thread_data()->wow64_redir = !disable; return STATUS_SUCCESS; } /****************************************************************** * RtlDoesFileExists_U (NTDLL.@) */ BOOLEAN WINAPI RtlDoesFileExists_U(LPCWSTR file_name) { UNICODE_STRING nt_name; FILE_BASIC_INFORMATION basic_info; OBJECT_ATTRIBUTES attr; BOOLEAN ret; if (!RtlDosPathNameToNtPathName_U( file_name, &nt_name, NULL, NULL )) return FALSE; attr.Length = sizeof(attr); attr.RootDirectory = 0; attr.ObjectName = &nt_name; attr.Attributes = OBJ_CASE_INSENSITIVE; attr.SecurityDescriptor = NULL; attr.SecurityQualityOfService = NULL; ret = NtQueryAttributesFile(&attr, &basic_info) == STATUS_SUCCESS; RtlFreeUnicodeString( &nt_name ); return ret; }