Removed the FailReadOnly option, this is now the default behavior.
This commit is contained in:
parent
5e80d6f5f0
commit
b70e0c8ea6
|
@ -312,7 +312,7 @@ HANDLE VOLUME_OpenDevice( LPCWSTR name, DWORD access, DWORD sharing,
|
|||
{
|
||||
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 (!dev) break;
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ static HANDLE open_vxd_handle( LPCWSTR name )
|
|||
unix_name[len1] = '/';
|
||||
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,
|
||||
OPEN_ALWAYS, 0, 0, TRUE, DRIVE_FIXED );
|
||||
OPEN_ALWAYS, 0, 0, DRIVE_FIXED );
|
||||
HeapFree( GetProcessHeap(), 0, unix_name );
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
and "network".
|
||||
.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]
|
||||
.br
|
||||
.I format: """windows""=""<directory>"""
|
||||
|
|
|
@ -71,7 +71,6 @@ typedef struct
|
|||
char *unix_cwd; /* cwd in Unix format without leading or trailing / */
|
||||
char *device; /* raw device path */
|
||||
UINT type; /* drive type */
|
||||
UINT flags; /* drive flags */
|
||||
dev_t dev; /* unix device number */
|
||||
ino_t ino; /* unix inode number */
|
||||
} DOSDRIVE;
|
||||
|
@ -104,8 +103,6 @@ inline static char *heap_strdup( const char *str )
|
|||
return p;
|
||||
}
|
||||
|
||||
#define IS_OPTION_TRUE(ch) ((ch) == 'y' || (ch) == 'Y' || (ch) == 't' || (ch) == 'T' || (ch) == '1')
|
||||
|
||||
extern void CDROM_InitRegistry(int dev);
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -150,7 +147,6 @@ int DRIVE_Init(void)
|
|||
static const WCHAR PathW[] = {'P','a','t','h',0};
|
||||
static const WCHAR TypeW[] = {'T','y','p','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.RootDirectory = 0;
|
||||
|
@ -187,7 +183,6 @@ int DRIVE_Init(void)
|
|||
drive->dos_cwd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(drive->dos_cwd[0]));
|
||||
drive->unix_cwd = heap_strdup( "" );
|
||||
drive->device = NULL;
|
||||
drive->flags = 0;
|
||||
drive->dev = drive_stat_buffer.st_dev;
|
||||
drive->ino = drive_stat_buffer.st_ino;
|
||||
drive->type = DRIVE_FIXED;
|
||||
|
@ -254,7 +249,6 @@ int DRIVE_Init(void)
|
|||
drive->dos_cwd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(drive->dos_cwd[0]));
|
||||
drive->unix_cwd = heap_strdup( "" );
|
||||
drive->device = NULL;
|
||||
drive->flags = 0;
|
||||
drive->dev = drive_stat_buffer.st_dev;
|
||||
drive->ino = drive_stat_buffer.st_ino;
|
||||
drive->type = DRIVE_FIXED;
|
||||
|
@ -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 */
|
||||
if ((DRIVE_CurDrive == -1) && (drive->type == DRIVE_FIXED))
|
||||
DRIVE_CurDrive = i;
|
||||
|
||||
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]),
|
||||
drive->flags, (int)drive->dev, (int)drive->ino );
|
||||
(int)drive->dev, (int)drive->ino );
|
||||
}
|
||||
|
||||
next:
|
||||
|
@ -322,7 +308,6 @@ int DRIVE_Init(void)
|
|||
DOSDrives[2].unix_cwd = heap_strdup( "" );
|
||||
DOSDrives[2].type = DRIVE_FIXED;
|
||||
DOSDrives[2].device = NULL;
|
||||
DOSDrives[2].flags = 0;
|
||||
DRIVE_CurDrive = 2;
|
||||
}
|
||||
|
||||
|
@ -375,7 +360,7 @@ int DRIVE_GetCurrentDrive(void)
|
|||
/***********************************************************************
|
||||
* DRIVE_SetCurrentDrive
|
||||
*/
|
||||
int DRIVE_SetCurrentDrive( int drive )
|
||||
static int DRIVE_SetCurrentDrive( int drive )
|
||||
{
|
||||
TDB *pTask = GlobalLock16(GetCurrentTask());
|
||||
if (!DRIVE_IsValid( drive ))
|
||||
|
@ -602,15 +587,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
|
||||
*/
|
||||
|
|
86
files/file.c
86
files/file.c
|
@ -183,8 +183,7 @@ void FILE_SetDosError(void)
|
|||
*/
|
||||
HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
|
||||
LPSECURITY_ATTRIBUTES sa, DWORD creation,
|
||||
DWORD attributes, HANDLE template, BOOL fail_read_only,
|
||||
UINT drive_type )
|
||||
DWORD attributes, HANDLE template, UINT drive_type )
|
||||
{
|
||||
unsigned int err;
|
||||
UINT disp, options;
|
||||
|
@ -213,53 +212,37 @@ HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
|
|||
options |= FILE_RANDOM_ACCESS;
|
||||
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->sharing = sharing;
|
||||
req->create = disp;
|
||||
req->options = options;
|
||||
req->attrs = attributes;
|
||||
req->removable = (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM);
|
||||
wine_server_add_data( req, filename, strlen(filename) );
|
||||
SetLastError(0);
|
||||
err = wine_server_call( req );
|
||||
ret = reply->handle;
|
||||
}
|
||||
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());
|
||||
return ret;
|
||||
req->access = access;
|
||||
req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
|
||||
req->sharing = sharing;
|
||||
req->create = disp;
|
||||
req->options = options;
|
||||
req->attrs = attributes;
|
||||
req->removable = (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM);
|
||||
wine_server_add_data( req, filename, strlen(filename) );
|
||||
SetLastError(0);
|
||||
err = wine_server_call( req );
|
||||
ret = reply->handle;
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
|
||||
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());
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -381,7 +364,7 @@ HANDLE WINAPI CreateFileW( LPCWSTR filename, DWORD access, DWORD sharing,
|
|||
if (device)
|
||||
{
|
||||
ret = FILE_CreateFile( device, access, sharing, sa, creation,
|
||||
attributes, template, TRUE, DRIVE_FIXED );
|
||||
attributes, template, DRIVE_FIXED );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -459,7 +442,6 @@ HANDLE WINAPI CreateFileW( LPCWSTR filename, DWORD access, DWORD sharing,
|
|||
|
||||
ret = FILE_CreateFile( full_name.long_name, access, sharing,
|
||||
sa, creation, attributes, template,
|
||||
DRIVE_GetFlags(full_name.drive) & DRIVE_FAIL_READ_ONLY,
|
||||
GetDriveTypeW( full_name.short_name ) );
|
||||
done:
|
||||
if (!ret) ret = INVALID_HANDLE_VALUE;
|
||||
|
@ -1238,7 +1220,7 @@ BOOL WINAPI DeleteFileW( LPCWSTR path )
|
|||
|
||||
/* check if we are allowed to delete the source */
|
||||
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 ) );
|
||||
if (!hFile) return FALSE;
|
||||
|
||||
|
@ -1521,7 +1503,7 @@ BOOL WINAPI MoveFileExW( LPCWSTR fn1, LPCWSTR fn2, DWORD flag )
|
|||
|
||||
/* check if we are allowed to rename the source */
|
||||
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 ) );
|
||||
if (!hFile)
|
||||
{
|
||||
|
@ -1534,7 +1516,7 @@ BOOL WINAPI MoveFileExW( LPCWSTR fn1, LPCWSTR fn2, DWORD flag )
|
|||
/* check, if we are allowed to delete the destination,
|
||||
** (but the file not being there is fine) */
|
||||
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 ) );
|
||||
if(!hFile && GetLastError() != ERROR_FILE_NOT_FOUND) return FALSE;
|
||||
CloseHandle(hFile);
|
||||
|
|
|
@ -41,33 +41,24 @@ extern void FILE_SetDosError(void);
|
|||
extern BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info, BOOL *is_symlink );
|
||||
extern HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
|
||||
LPSECURITY_ATTRIBUTES sa, DWORD creation,
|
||||
DWORD attributes, HANDLE template, BOOL fail_read_only,
|
||||
UINT drive_type );
|
||||
DWORD attributes, HANDLE template, UINT drive_type );
|
||||
|
||||
/* files/directory.c */
|
||||
extern int DIR_Init(void);
|
||||
|
||||
/* files/dos_fs.c */
|
||||
extern BOOL DOSFS_FindUnixName( const DOS_FULL_NAME *path, LPCWSTR name, char *long_buf,
|
||||
INT long_len, LPWSTR short_buf );
|
||||
extern BOOL DOSFS_GetFullName( LPCWSTR name, BOOL check_last,
|
||||
DOS_FULL_NAME *full );
|
||||
extern BOOL DOSFS_GetFullName( LPCWSTR name, BOOL check_last, DOS_FULL_NAME *full );
|
||||
|
||||
/* drive.c */
|
||||
|
||||
#define DRIVE_FAIL_READ_ONLY 0x0001 /* Fail opening read-only files for writing */
|
||||
|
||||
extern int DRIVE_Init(void);
|
||||
extern int DRIVE_IsValid( int drive );
|
||||
extern int DRIVE_GetCurrentDrive(void);
|
||||
extern int DRIVE_SetCurrentDrive( int drive );
|
||||
extern int DRIVE_FindDriveRoot( const char **path );
|
||||
extern int DRIVE_FindDriveRootW( LPCWSTR *path );
|
||||
extern const char * DRIVE_GetRoot( int drive );
|
||||
extern LPCWSTR DRIVE_GetDosCwd( int drive );
|
||||
extern const char * DRIVE_GetUnixCwd( int drive );
|
||||
extern const char * DRIVE_GetDevice( int drive );
|
||||
extern UINT DRIVE_GetFlags( int drive );
|
||||
extern int DRIVE_Chdir( int drive, LPCWSTR path );
|
||||
extern WCHAR *DRIVE_BuildEnv(void);
|
||||
|
||||
|
|
|
@ -1201,7 +1201,7 @@ static void load_wine_registry(HKEY hkey,LPCSTR fn)
|
|||
{
|
||||
HANDLE file;
|
||||
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 )
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue