ReadFile() and WriteFile() choke on non-zero lpOverlapped.

Eric Pouech Eric.Pouech at wanadoo.fr
Sat Feb 3 12:19:35 CST 2001


Eric Kohl wrote:
> 
> Hello!
> 
> I'm currently debugging a database-application that uses the M$ Jet Engine
> 3.5. This db-engine does not behave very well. It opens an exisisting
> database-file (FILE_FLAG_OVERLAPPED is *not* set) and reads or writes using
> calls to ReadFile() and WriteFile() with non-zero lpOverlapped pointers. In
> this case calls to ReadFile() or WriteFile() return FALSE.
> 
> IMO ReadFile() and WriteFile() should check whether FILE_FLAG_OVERLAPPED is
> set. Unfortunately there is no method to retrieve the full file attributes
> from wineserver. Is a new server call required?
a quick hack would be to extend the get_file_info request to add to the
flags field the high WORD from inner file object

(the low word contains the FILE_ATTRIBUTE_??? flags and we should get the bits
from the stat operation)

however, it would add a stat to the file for every call which is not what
you want in all cases

Index: server/file.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/server/file.c,v
retrieving revision 1.36
diff -u -r1.36 file.c
--- server/file.c       2001/01/12 23:02:39     1.36
+++ server/file.c       2001/02/03 18:17:22
@@ -267,6 +267,8 @@
     if (S_ISDIR(st.st_mode)) req->attr = FILE_ATTRIBUTE_DIRECTORY;
     else req->attr = FILE_ATTRIBUTE_ARCHIVE;
     if (!(st.st_mode & S_IWUSR)) req->attr |= FILE_ATTRIBUTE_READONLY;
+    /* copy back only the FILE_FLAG_??? bits */
+    req->attr |= file->flags & 0xffff0000;
     req->access_time = st.st_atime;
     req->write_time  = st.st_mtime;
     req->size_high   = 0;


-- 
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle



More information about the wine-devel mailing list