Commit b70e0c8e authored by Alexandre Julliard's avatar Alexandre Julliard

Removed the FailReadOnly option, this is now the default behavior.

parent 5e80d6f5
...@@ -312,7 +312,7 @@ HANDLE VOLUME_OpenDevice( LPCWSTR name, DWORD access, DWORD sharing, ...@@ -312,7 +312,7 @@ HANDLE VOLUME_OpenDevice( LPCWSTR name, DWORD access, DWORD sharing,
{ {
TRACE("trying %s\n", buffer ); TRACE("trying %s\n", buffer );
ret = FILE_CreateFile( buffer, access, sharing, sa, OPEN_EXISTING, 0, 0, TRUE, DRIVE_FIXED ); ret = FILE_CreateFile( buffer, access, sharing, sa, OPEN_EXISTING, 0, 0, DRIVE_FIXED );
if (ret || GetLastError() != ERROR_FILE_NOT_FOUND) break; if (ret || GetLastError() != ERROR_FILE_NOT_FOUND) break;
if (!dev) break; if (!dev) break;
......
...@@ -106,7 +106,7 @@ static HANDLE open_vxd_handle( LPCWSTR name ) ...@@ -106,7 +106,7 @@ static HANDLE open_vxd_handle( LPCWSTR name )
unix_name[len1] = '/'; unix_name[len1] = '/';
WideCharToMultiByte( CP_UNIXCP, 0, name, -1, unix_name + len1 + 1, len2, NULL, NULL); WideCharToMultiByte( CP_UNIXCP, 0, name, -1, unix_name + len1 + 1, len2, NULL, NULL);
ret = FILE_CreateFile( unix_name, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, ret = FILE_CreateFile( unix_name, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_ALWAYS, 0, 0, TRUE, DRIVE_FIXED ); OPEN_ALWAYS, 0, 0, DRIVE_FIXED );
HeapFree( GetProcessHeap(), 0, unix_name ); HeapFree( GetProcessHeap(), 0, unix_name );
return ret; return ret;
} }
......
...@@ -60,12 +60,6 @@ Used to specify the drive type this drive appears as in Windows ...@@ -60,12 +60,6 @@ Used to specify the drive type this drive appears as in Windows
or DOS programs; supported types are "floppy", "hd", "cdrom" or DOS programs; supported types are "floppy", "hd", "cdrom"
and "network". and "network".
.PP .PP
.I format: """FailReadOnly""=""<boolean>"""
.br
Read-only files may not be opened in write mode (the default is to
allow opening read-only files for writing, because most Windows
programs always request read-write access, even on CD-ROM drives...).
.PP
.B [wine] .B [wine]
.br .br
.I format: """windows""=""<directory>""" .I format: """windows""=""<directory>"""
......
...@@ -71,7 +71,6 @@ typedef struct ...@@ -71,7 +71,6 @@ typedef struct
char *unix_cwd; /* cwd in Unix format without leading or trailing / */ char *unix_cwd; /* cwd in Unix format without leading or trailing / */
char *device; /* raw device path */ char *device; /* raw device path */
UINT type; /* drive type */ UINT type; /* drive type */
UINT flags; /* drive flags */
dev_t dev; /* unix device number */ dev_t dev; /* unix device number */
ino_t ino; /* unix inode number */ ino_t ino; /* unix inode number */
} DOSDRIVE; } DOSDRIVE;
...@@ -104,8 +103,6 @@ inline static char *heap_strdup( const char *str ) ...@@ -104,8 +103,6 @@ inline static char *heap_strdup( const char *str )
return p; return p;
} }
#define IS_OPTION_TRUE(ch) ((ch) == 'y' || (ch) == 'Y' || (ch) == 't' || (ch) == 'T' || (ch) == '1')
extern void CDROM_InitRegistry(int dev); extern void CDROM_InitRegistry(int dev);
/*********************************************************************** /***********************************************************************
...@@ -150,7 +147,6 @@ int DRIVE_Init(void) ...@@ -150,7 +147,6 @@ int DRIVE_Init(void)
static const WCHAR PathW[] = {'P','a','t','h',0}; static const WCHAR PathW[] = {'P','a','t','h',0};
static const WCHAR TypeW[] = {'T','y','p','e',0}; static const WCHAR TypeW[] = {'T','y','p','e',0};
static const WCHAR DeviceW[] = {'D','e','v','i','c','e',0}; static const WCHAR DeviceW[] = {'D','e','v','i','c','e',0};
static const WCHAR FailReadOnlyW[] = {'F','a','i','l','R','e','a','d','O','n','l','y',0};
attr.Length = sizeof(attr); attr.Length = sizeof(attr);
attr.RootDirectory = 0; attr.RootDirectory = 0;
...@@ -187,7 +183,6 @@ int DRIVE_Init(void) ...@@ -187,7 +183,6 @@ int DRIVE_Init(void)
drive->dos_cwd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(drive->dos_cwd[0])); drive->dos_cwd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(drive->dos_cwd[0]));
drive->unix_cwd = heap_strdup( "" ); drive->unix_cwd = heap_strdup( "" );
drive->device = NULL; drive->device = NULL;
drive->flags = 0;
drive->dev = drive_stat_buffer.st_dev; drive->dev = drive_stat_buffer.st_dev;
drive->ino = drive_stat_buffer.st_ino; drive->ino = drive_stat_buffer.st_ino;
drive->type = DRIVE_FIXED; drive->type = DRIVE_FIXED;
...@@ -254,7 +249,6 @@ int DRIVE_Init(void) ...@@ -254,7 +249,6 @@ int DRIVE_Init(void)
drive->dos_cwd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(drive->dos_cwd[0])); drive->dos_cwd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(drive->dos_cwd[0]));
drive->unix_cwd = heap_strdup( "" ); drive->unix_cwd = heap_strdup( "" );
drive->device = NULL; drive->device = NULL;
drive->flags = 0;
drive->dev = drive_stat_buffer.st_dev; drive->dev = drive_stat_buffer.st_dev;
drive->ino = drive_stat_buffer.st_ino; drive->ino = drive_stat_buffer.st_ino;
drive->type = DRIVE_FIXED; drive->type = DRIVE_FIXED;
...@@ -291,22 +285,14 @@ int DRIVE_Init(void) ...@@ -291,22 +285,14 @@ int DRIVE_Init(void)
} }
} }
/* Get the FailReadOnly flag */
RtlInitUnicodeString( &nameW, FailReadOnlyW );
if (!NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation, tmp, sizeof(tmp), &dummy ))
{
WCHAR *data = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)tmp)->Data;
if (IS_OPTION_TRUE(data[0])) drive->flags |= DRIVE_FAIL_READ_ONLY;
}
/* Make the first hard disk the current drive */ /* Make the first hard disk the current drive */
if ((DRIVE_CurDrive == -1) && (drive->type == DRIVE_FIXED)) if ((DRIVE_CurDrive == -1) && (drive->type == DRIVE_FIXED))
DRIVE_CurDrive = i; DRIVE_CurDrive = i;
count++; count++;
TRACE("Drive %c: path=%s type=%s flags=%08x dev=%x ino=%x\n", TRACE("Drive %c: path=%s type=%s dev=%x ino=%x\n",
'A' + i, drive->root, debugstr_w(DRIVE_Types[drive->type]), 'A' + i, drive->root, debugstr_w(DRIVE_Types[drive->type]),
drive->flags, (int)drive->dev, (int)drive->ino ); (int)drive->dev, (int)drive->ino );
} }
next: next:
...@@ -322,7 +308,6 @@ int DRIVE_Init(void) ...@@ -322,7 +308,6 @@ int DRIVE_Init(void)
DOSDrives[2].unix_cwd = heap_strdup( "" ); DOSDrives[2].unix_cwd = heap_strdup( "" );
DOSDrives[2].type = DRIVE_FIXED; DOSDrives[2].type = DRIVE_FIXED;
DOSDrives[2].device = NULL; DOSDrives[2].device = NULL;
DOSDrives[2].flags = 0;
DRIVE_CurDrive = 2; DRIVE_CurDrive = 2;
} }
...@@ -375,7 +360,7 @@ int DRIVE_GetCurrentDrive(void) ...@@ -375,7 +360,7 @@ int DRIVE_GetCurrentDrive(void)
/*********************************************************************** /***********************************************************************
* DRIVE_SetCurrentDrive * DRIVE_SetCurrentDrive
*/ */
int DRIVE_SetCurrentDrive( int drive ) static int DRIVE_SetCurrentDrive( int drive )
{ {
TDB *pTask = GlobalLock16(GetCurrentTask()); TDB *pTask = GlobalLock16(GetCurrentTask());
if (!DRIVE_IsValid( drive )) if (!DRIVE_IsValid( drive ))
...@@ -603,15 +588,6 @@ static UINT DRIVE_GetType( int drive ) ...@@ -603,15 +588,6 @@ static UINT DRIVE_GetType( int drive )
/*********************************************************************** /***********************************************************************
* DRIVE_GetFlags
*/
UINT DRIVE_GetFlags( int drive )
{
if ((drive < 0) || (drive >= MAX_DOS_DRIVES)) return 0;
return DOSDrives[drive].flags;
}
/***********************************************************************
* DRIVE_Chdir * DRIVE_Chdir
*/ */
int DRIVE_Chdir( int drive, LPCWSTR path ) int DRIVE_Chdir( int drive, LPCWSTR path )
......
...@@ -183,8 +183,7 @@ void FILE_SetDosError(void) ...@@ -183,8 +183,7 @@ void FILE_SetDosError(void)
*/ */
HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing, HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
LPSECURITY_ATTRIBUTES sa, DWORD creation, LPSECURITY_ATTRIBUTES sa, DWORD creation,
DWORD attributes, HANDLE template, BOOL fail_read_only, DWORD attributes, HANDLE template, UINT drive_type )
UINT drive_type )
{ {
unsigned int err; unsigned int err;
UINT disp, options; UINT disp, options;
...@@ -213,53 +212,37 @@ HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing, ...@@ -213,53 +212,37 @@ HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
options |= FILE_RANDOM_ACCESS; options |= FILE_RANDOM_ACCESS;
attributes &= FILE_ATTRIBUTE_VALID_FLAGS; attributes &= FILE_ATTRIBUTE_VALID_FLAGS;
for (;;) SERVER_START_REQ( create_file )
{ {
SERVER_START_REQ( create_file ) req->access = access;
{ req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
req->access = access; req->sharing = sharing;
req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle); req->create = disp;
req->sharing = sharing; req->options = options;
req->create = disp; req->attrs = attributes;
req->options = options; req->removable = (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM);
req->attrs = attributes; wine_server_add_data( req, filename, strlen(filename) );
req->removable = (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM); SetLastError(0);
wine_server_add_data( req, filename, strlen(filename) ); err = wine_server_call( req );
SetLastError(0); ret = reply->handle;
err = wine_server_call( req ); }
ret = reply->handle; SERVER_END_REQ;
}
SERVER_END_REQ;
/* If write access failed, retry without GENERIC_WRITE */
if (!ret && !fail_read_only && (access & GENERIC_WRITE))
{
if ((err == STATUS_MEDIA_WRITE_PROTECTED) || (err == STATUS_ACCESS_DENIED))
{
TRACE("Write access failed for file '%s', trying without "
"write access\n", filename);
access &= ~GENERIC_WRITE;
continue;
}
}
if (err)
{
/* In the case file creation was rejected due to CREATE_NEW flag
* was specified and file with that name already exists, correct
* last error is ERROR_FILE_EXISTS and not ERROR_ALREADY_EXISTS.
* Note: RtlNtStatusToDosError is not the subject to blame here.
*/
if (err == STATUS_OBJECT_NAME_COLLISION)
SetLastError( ERROR_FILE_EXISTS );
else
SetLastError( RtlNtStatusToDosError(err) );
}
if (!ret) WARN("Unable to create file '%s' (GLE %ld)\n", filename, GetLastError()); if (err)
return ret; {
/* In the case file creation was rejected due to CREATE_NEW flag
* was specified and file with that name already exists, correct
* last error is ERROR_FILE_EXISTS and not ERROR_ALREADY_EXISTS.
* Note: RtlNtStatusToDosError is not the subject to blame here.
*/
if (err == STATUS_OBJECT_NAME_COLLISION)
SetLastError( ERROR_FILE_EXISTS );
else
SetLastError( RtlNtStatusToDosError(err) );
} }
if (!ret) WARN("Unable to create file '%s' (GLE %ld)\n", filename, GetLastError());
return ret;
} }
...@@ -381,7 +364,7 @@ HANDLE WINAPI CreateFileW( LPCWSTR filename, DWORD access, DWORD sharing, ...@@ -381,7 +364,7 @@ HANDLE WINAPI CreateFileW( LPCWSTR filename, DWORD access, DWORD sharing,
if (device) if (device)
{ {
ret = FILE_CreateFile( device, access, sharing, sa, creation, ret = FILE_CreateFile( device, access, sharing, sa, creation,
attributes, template, TRUE, DRIVE_FIXED ); attributes, template, DRIVE_FIXED );
} }
else else
{ {
...@@ -459,7 +442,6 @@ HANDLE WINAPI CreateFileW( LPCWSTR filename, DWORD access, DWORD sharing, ...@@ -459,7 +442,6 @@ HANDLE WINAPI CreateFileW( LPCWSTR filename, DWORD access, DWORD sharing,
ret = FILE_CreateFile( full_name.long_name, access, sharing, ret = FILE_CreateFile( full_name.long_name, access, sharing,
sa, creation, attributes, template, sa, creation, attributes, template,
DRIVE_GetFlags(full_name.drive) & DRIVE_FAIL_READ_ONLY,
GetDriveTypeW( full_name.short_name ) ); GetDriveTypeW( full_name.short_name ) );
done: done:
if (!ret) ret = INVALID_HANDLE_VALUE; if (!ret) ret = INVALID_HANDLE_VALUE;
...@@ -1238,7 +1220,7 @@ BOOL WINAPI DeleteFileW( LPCWSTR path ) ...@@ -1238,7 +1220,7 @@ BOOL WINAPI DeleteFileW( LPCWSTR path )
/* check if we are allowed to delete the source */ /* check if we are allowed to delete the source */
hFile = FILE_CreateFile( full_name.long_name, GENERIC_READ|GENERIC_WRITE, 0, hFile = FILE_CreateFile( full_name.long_name, GENERIC_READ|GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0, TRUE, NULL, OPEN_EXISTING, 0, 0,
GetDriveTypeW( full_name.short_name ) ); GetDriveTypeW( full_name.short_name ) );
if (!hFile) return FALSE; if (!hFile) return FALSE;
...@@ -1521,7 +1503,7 @@ BOOL WINAPI MoveFileExW( LPCWSTR fn1, LPCWSTR fn2, DWORD flag ) ...@@ -1521,7 +1503,7 @@ BOOL WINAPI MoveFileExW( LPCWSTR fn1, LPCWSTR fn2, DWORD flag )
/* check if we are allowed to rename the source */ /* check if we are allowed to rename the source */
hFile = FILE_CreateFile( full_name1.long_name, 0, 0, hFile = FILE_CreateFile( full_name1.long_name, 0, 0,
NULL, OPEN_EXISTING, 0, 0, TRUE, NULL, OPEN_EXISTING, 0, 0,
GetDriveTypeW( full_name1.short_name ) ); GetDriveTypeW( full_name1.short_name ) );
if (!hFile) if (!hFile)
{ {
...@@ -1534,7 +1516,7 @@ BOOL WINAPI MoveFileExW( LPCWSTR fn1, LPCWSTR fn2, DWORD flag ) ...@@ -1534,7 +1516,7 @@ BOOL WINAPI MoveFileExW( LPCWSTR fn1, LPCWSTR fn2, DWORD flag )
/* check, if we are allowed to delete the destination, /* check, if we are allowed to delete the destination,
** (but the file not being there is fine) */ ** (but the file not being there is fine) */
hFile = FILE_CreateFile( full_name2.long_name, GENERIC_READ|GENERIC_WRITE, 0, hFile = FILE_CreateFile( full_name2.long_name, GENERIC_READ|GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0, TRUE, NULL, OPEN_EXISTING, 0, 0,
GetDriveTypeW( full_name2.short_name ) ); GetDriveTypeW( full_name2.short_name ) );
if(!hFile && GetLastError() != ERROR_FILE_NOT_FOUND) return FALSE; if(!hFile && GetLastError() != ERROR_FILE_NOT_FOUND) return FALSE;
CloseHandle(hFile); CloseHandle(hFile);
......
...@@ -41,33 +41,24 @@ extern void FILE_SetDosError(void); ...@@ -41,33 +41,24 @@ extern void FILE_SetDosError(void);
extern BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info, BOOL *is_symlink ); extern BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info, BOOL *is_symlink );
extern HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing, extern HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
LPSECURITY_ATTRIBUTES sa, DWORD creation, LPSECURITY_ATTRIBUTES sa, DWORD creation,
DWORD attributes, HANDLE template, BOOL fail_read_only, DWORD attributes, HANDLE template, UINT drive_type );
UINT drive_type );
/* files/directory.c */ /* files/directory.c */
extern int DIR_Init(void); extern int DIR_Init(void);
/* files/dos_fs.c */ /* files/dos_fs.c */
extern BOOL DOSFS_FindUnixName( const DOS_FULL_NAME *path, LPCWSTR name, char *long_buf, extern BOOL DOSFS_GetFullName( LPCWSTR name, BOOL check_last, DOS_FULL_NAME *full );
INT long_len, LPWSTR short_buf );
extern BOOL DOSFS_GetFullName( LPCWSTR name, BOOL check_last,
DOS_FULL_NAME *full );
/* drive.c */ /* drive.c */
#define DRIVE_FAIL_READ_ONLY 0x0001 /* Fail opening read-only files for writing */
extern int DRIVE_Init(void); extern int DRIVE_Init(void);
extern int DRIVE_IsValid( int drive ); extern int DRIVE_IsValid( int drive );
extern int DRIVE_GetCurrentDrive(void); extern int DRIVE_GetCurrentDrive(void);
extern int DRIVE_SetCurrentDrive( int drive );
extern int DRIVE_FindDriveRoot( const char **path ); extern int DRIVE_FindDriveRoot( const char **path );
extern int DRIVE_FindDriveRootW( LPCWSTR *path ); extern int DRIVE_FindDriveRootW( LPCWSTR *path );
extern const char * DRIVE_GetRoot( int drive ); extern const char * DRIVE_GetRoot( int drive );
extern LPCWSTR DRIVE_GetDosCwd( int drive ); extern LPCWSTR DRIVE_GetDosCwd( int drive );
extern const char * DRIVE_GetUnixCwd( int drive ); extern const char * DRIVE_GetUnixCwd( int drive );
extern const char * DRIVE_GetDevice( int drive ); extern const char * DRIVE_GetDevice( int drive );
extern UINT DRIVE_GetFlags( int drive );
extern int DRIVE_Chdir( int drive, LPCWSTR path ); extern int DRIVE_Chdir( int drive, LPCWSTR path );
extern WCHAR *DRIVE_BuildEnv(void); extern WCHAR *DRIVE_BuildEnv(void);
......
...@@ -1201,7 +1201,7 @@ static void load_wine_registry(HKEY hkey,LPCSTR fn) ...@@ -1201,7 +1201,7 @@ static void load_wine_registry(HKEY hkey,LPCSTR fn)
{ {
HANDLE file; HANDLE file;
if ((file = FILE_CreateFile( fn, GENERIC_READ, 0, NULL, OPEN_EXISTING, if ((file = FILE_CreateFile( fn, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0, TRUE, DRIVE_UNKNOWN ))) FILE_ATTRIBUTE_NORMAL, 0, DRIVE_FIXED )))
{ {
SERVER_START_REQ( load_registry ) SERVER_START_REQ( load_registry )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment