diff --git a/files/file.c b/files/file.c index 88b7ae6b7f56e487aa741282ce24eac2b6e62775..f68e67c3fe6fdda5fe5b88bb72494feeba270b57 100644 --- a/files/file.c +++ b/files/file.c @@ -603,8 +603,13 @@ HFILE32 FILE_OpenUnixFile( const char *name, int mode ) /*********************************************************************** * FILE_Open + * + * path[I] name of file to open + * mode[I] mode how to open, in unix notation + * shareMode[I] the sharing mode in the win OpenFile notation + * */ -HFILE32 FILE_Open( LPCSTR path, INT32 mode ) +HFILE32 FILE_Open( LPCSTR path, INT32 mode, INT32 shareMode ) { DOS_FULL_NAME full_name; const char *unixName; @@ -640,7 +645,7 @@ HFILE32 FILE_Open( LPCSTR path, INT32 mode ) unixName = full_name.long_name; } - dosMode = FILE_UnixToDosMode(mode); + dosMode = FILE_UnixToDosMode(mode)| shareMode; fileInUse = FILE_InUse(full_name.long_name,&oldMode); if(fileInUse) { @@ -1409,9 +1414,7 @@ HFILE32 WINAPI _lopen32( LPCSTR path, INT32 mode ) TRACE(file, "('%s',%04x)\n", path, mode ); unixMode= FILE_DOSToUnixMode(mode); - unixMode |= (mode &0x70); /* transfer the OF_SHARE options to handle - them in FILE_Open*/ - return FILE_Open( path, unixMode ); + return FILE_Open( path, unixMode , (mode & 0x70)); } diff --git a/include/file.h b/include/file.h index b8fdff45e2d4d7237d291c153b64f5a69cf2c8f8..e7ab5a88b93a3ab1ad038ca90cb0d77cb23faacb 100644 --- a/include/file.h +++ b/include/file.h @@ -67,7 +67,7 @@ extern HFILE32 FILE_DupUnixHandle( int fd ); extern BOOL32 FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info ); extern HFILE32 FILE_Dup( HFILE32 hFile ); extern HFILE32 FILE_Dup2( HFILE32 hFile1, HFILE32 hFile2 ); -extern HFILE32 FILE_Open( LPCSTR path, INT32 mode ); +extern HFILE32 FILE_Open( LPCSTR path, INT32 mode ,INT32 sharemode); extern HFILE32 FILE_OpenUnixFile( LPCSTR path, INT32 mode ); extern BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type ); extern LPVOID FILE_mmap( HFILE32 hFile, LPVOID start, diff --git a/misc/crtdll.c b/misc/crtdll.c index 62eda7df3ce63993b8663de7e6692acfec4bb7b8..d174e710de0a41aa62c8e485b14872065ea7e122 100644 --- a/misc/crtdll.c +++ b/misc/crtdll.c @@ -295,7 +295,7 @@ DWORD __cdecl CRTDLL_fopen(LPCSTR path, LPCSTR mode) else if (strchr(mode,'b')) TRACE(crtdll, "%s in BINARY mode\n",path); - dos_fildes=FILE_Open(path, flagmode); + dos_fildes=FILE_Open(path, flagmode,0); unix_fildes=FILE_GetUnixHandle(dos_fildes); file = fdopen(unix_fildes,mode); @@ -1199,7 +1199,7 @@ HFILE32 __cdecl CRTDLL__open(LPCSTR path,INT32 flags) TRACE(crtdll,"CRTDLL_open file unsupported flags 0x%04x\n",flags); /* End Fixme */ - ret = FILE_Open(path,wineflags); + ret = FILE_Open(path,wineflags,0); TRACE(crtdll,"CRTDLL_open file %s mode 0x%04x (lccmode 0x%04x) got dfh %d\n", path,wineflags,flags,ret); return ret; diff --git a/msdos/vxd.c b/msdos/vxd.c index 04afafbd439afde55e631dad0b907a2d03ce9939..35eaeeb7ab54555a49c97b6e461764473655a4e4 100644 --- a/msdos/vxd.c +++ b/msdos/vxd.c @@ -607,7 +607,7 @@ void VXD_Win32s( CONTEXT *context ) IMAGE_NT_HEADERS *nt_header = PE_HEADER(module->baseAddr); IMAGE_SECTION_HEADER *pe_seg = PE_SECTIONS(module->baseAddr); - HFILE32 image = FILE_Open(module->pathName, O_RDONLY); + HFILE32 image = FILE_Open(module->pathName, O_RDONLY,0); BOOL32 error = (image == INVALID_HANDLE_VALUE32); UINT32 i; diff --git a/win32/file.c b/win32/file.c index e08475d1cb0c99518acb70d80102256b3b74dfb7..43f22b80cc138f8957c9bc487c8e9f4cf0d1f5a9 100644 --- a/win32/file.c +++ b/win32/file.c @@ -27,6 +27,7 @@ DWORD ErrnoToLastError(int errno_num); static int TranslateCreationFlags(DWORD create_flags); static int TranslateAccessFlags(DWORD access_flags); +static int TranslateShareFlags(DWORD share_flags); /*********************************************************************** * WriteFile (KERNEL32.578) @@ -129,13 +130,14 @@ HFILE32 WINAPI CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing, LPSECURITY_ATTRIBUTES security, DWORD creation, DWORD attributes, HANDLE32 template) { - int access_flags, create_flags; + int access_flags, create_flags, share_flags; HFILE32 to_dup = HFILE_ERROR32; /* handle to dup */ /* Translate the various flags to Unix-style. */ access_flags = TranslateAccessFlags(access); create_flags = TranslateCreationFlags(creation); + share_flags = TranslateShareFlags(sharing); if(template) FIXME(file, "template handles not supported.\n"); @@ -183,7 +185,7 @@ HFILE32 WINAPI CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing, handle = HFILE_ERROR32; return handle; } - return FILE_Open( filename, access_flags | create_flags ); + return FILE_Open( filename, access_flags | create_flags,share_flags ); } @@ -252,8 +254,29 @@ static int TranslateCreationFlags(DWORD create_flags) return rc; } - - +static int TranslateShareFlags(DWORD share_flags) +/* +OPEN_SHARE_DENYNONE FILE_SHARE_READ | FILE_SHARE_WRITE +OPEN_SHARE_DENYREAD FILE_SHARE_WRITE +OPEN_SHARE_DENYREADWRITE 0 +OPEN_SHARE_DENYWRITE FILE_SHARE_READ +*/ +{ + switch(share_flags) + { + case FILE_SHARE_READ | FILE_SHARE_WRITE: + return OF_SHARE_DENY_NONE; + case FILE_SHARE_WRITE: + return OF_SHARE_DENY_READ; + case FILE_SHARE_READ: + return OF_SHARE_DENY_WRITE; + case 0: + return OF_SHARE_EXCLUSIVE; + default: + } + FIXME(file,"unknown sharing flags 0x%04lx\n",share_flags); + return OF_SHARE_EXCLUSIVE; +} /************************************************************************** * SetFileAttributes16 (KERNEL.421) */