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)
  */