Allow direct device access ( cdrom, floppy)
Uwe Bonnes
bon at elektron.ikp.physik.tu-darmstadt.de
Sat Dec 13 15:49:32 CST 2003
Hallo,
appended patch opens the devicefile connected to a drive as connected by the
user in ~/.wine/config [Drive X] "Device" = "/dev/yyy".
The appropriate action on that file ( read, write, set_file_pointer, ...) succeed
according the the righte the user has on that device.
That way, I am able to open a unencrypted DVD with "DVD Shrink", inspect the
structure and watch the movie, without mounting the DVD. ( For encryted DVD, I
have on my disk the needed translation of the DeviceIOControls).
On the server side, my implementation needs to add "set_file_pointer" to
"struct fd_ops", that's the reason why so many files get touched.
Changelog:
wine/include/wine/server_protocol.h,wine/include/file.h,wine/files/file.c,
wine/files/dos_fs.c,wine/dlls/kernel/device.c, wine/server/device.c,
wine/server/fd.c, wine/server/file.c, wine/server/file.h,
wine/server/named_pipe.c, wine/server/process.c,
wine/server/request.c,wine/server/serial.c, wine/server/signal.c,
wine/server/smb.c, wine/server/sock.c , wine/server/trace.c,
wine/server/thread.c
Handle the device file connected to a device
Bye
--
Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: wine/include/wine/server_protocol.h
===================================================================
RCS file: /home/wine/wine/include/wine/server_protocol.h,v
retrieving revision 1.92
diff -u -w -r1.92 server_protocol.h
--- wine/include/wine/server_protocol.h 11 Dec 2003 05:34:53 -0000 1.92
+++ wine/include/wine/server_protocol.h 13 Dec 2003 21:18:32 -0000
@@ -1509,8 +1509,10 @@
{
struct request_header __header;
unsigned int access;
+ unsigned int attributes;
int inherit;
int id;
+ /* VARARG(device,string); */
};
struct create_device_reply
{
Index: wine/include/file.h
===================================================================
RCS file: /home/wine/wine/include/file.h,v
retrieving revision 1.62
diff -u -w -r1.62 file.h
--- wine/include/file.h 2 Dec 2003 04:19:56 -0000 1.62
+++ wine/include/file.h 13 Dec 2003 21:18:33 -0000
@@ -76,7 +76,7 @@
LPSECURITY_ATTRIBUTES sa, DWORD creation,
DWORD attributes, HANDLE template, BOOL fail_read_only,
UINT drive_type );
-extern HANDLE FILE_CreateDevice( int client_id, DWORD access, LPSECURITY_ATTRIBUTES sa );
+extern HANDLE FILE_CreateDevice( int client_id, DWORD access, DWORD attributes, LPSECURITY_ATTRIBUTES sa );
extern LONG WINAPI WIN16_hread(HFILE16,SEGPTR,LONG);
@@ -98,6 +98,6 @@
DOS_FULL_NAME *full );
/* win32/device.c */
-extern HANDLE DEVICE_Open( LPCWSTR filename, DWORD access, LPSECURITY_ATTRIBUTES sa );
+extern HANDLE DEVICE_Open( LPCWSTR filename, DWORD access, DWORD attributes, LPSECURITY_ATTRIBUTES sa );
#endif /* __WINE_FILE_H */
Index: wine/files/file.c
===================================================================
RCS file: /home/wine/wine/files/file.c,v
retrieving revision 1.196
diff -u -w -r1.196 file.c
--- wine/files/file.c 12 Dec 2003 04:10:52 -0000 1.196
+++ wine/files/file.c 13 Dec 2003 21:18:37 -0000
@@ -271,14 +271,17 @@
* Same as FILE_CreateFile but for a device
* Returns 0 on failure.
*/
-HANDLE FILE_CreateDevice( int client_id, DWORD access, LPSECURITY_ATTRIBUTES sa )
+HANDLE FILE_CreateDevice( int client_id, DWORD access, DWORD attributes, LPSECURITY_ATTRIBUTES sa )
{
+ const char * devicename = DRIVE_GetDevice( client_id&0xff);
HANDLE ret;
SERVER_START_REQ( create_device )
{
req->access = access;
req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
+ req->attributes = attributes;
req->id = client_id;
+ wine_server_add_data( req, devicename, (devicename)?strlen(devicename):0 );
SetLastError(0);
wine_server_call_err( req );
ret = reply->handle;
@@ -393,12 +396,12 @@
}
else if (isalphaW(filename[4]) && filename[5] == ':' && filename[6] == '\0')
{
- ret = FILE_CreateDevice( (toupperW(filename[4]) - 'A') | 0x20000, access, sa );
+ ret = FILE_CreateDevice( (toupperW(filename[4]) - 'A') | 0x20000, access, attributes, sa );
goto done;
}
else if (!DOSFS_GetDevice( filename ))
{
- ret = DEVICE_Open( filename+4, access, sa );
+ ret = DEVICE_Open( filename+4, access, attributes, sa );
goto done;
}
else
Index: wine/files/dos_fs.c
===================================================================
RCS file: /home/wine/wine/files/dos_fs.c,v
retrieving revision 1.143
diff -u -w -r1.143 dos_fs.c
--- wine/files/dos_fs.c 27 Nov 2003 00:59:36 -0000 1.143
+++ wine/files/dos_fs.c 13 Dec 2003 21:18:45 -0000
@@ -973,7 +973,7 @@
!strcmpiW(DOSFS_Devices[i].name, hpscanW) ||
!strcmpiW(DOSFS_Devices[i].name, emmxxxx0W))
{
- return FILE_CreateDevice( i, access, sa );
+ return FILE_CreateDevice( i, access, attributes, sa );
}
if( (handle=DOSFS_CreateCommPort(DOSFS_Devices[i].name,access,attributes,sa)) )
Index: wine/dlls/kernel/device.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/device.c,v
retrieving revision 1.5
diff -u -w -r1.5 device.c
--- wine/dlls/kernel/device.c 4 Dec 2003 21:05:13 -0000 1.5
+++ wine/dlls/kernel/device.c 13 Dec 2003 21:18:47 -0000
@@ -270,7 +270,7 @@
{ NULL, 0, NULL }
};
-HANDLE DEVICE_Open( LPCWSTR filenameW, DWORD access, LPSECURITY_ATTRIBUTES sa )
+HANDLE DEVICE_Open( LPCWSTR filenameW, DWORD access, DWORD attributes, LPSECURITY_ATTRIBUTES sa )
{
const struct VxDInfo *info;
char filename[MAX_PATH];
@@ -283,7 +283,7 @@
for (info = VxDList; info->name; info++)
if (!strncasecmp( info->name, filename, strlen(info->name) ))
- return FILE_CreateDevice( info->id | 0x10000, access, sa );
+ return FILE_CreateDevice( info->id | 0x10000, access, access, sa );
FIXME( "Unknown/unsupported VxD %s. Try setting Windows version to 'nt40' or 'win31'.\n",
filename);
Index: wine/server/device.c
===================================================================
RCS file: /home/wine/wine/server/device.c,v
retrieving revision 1.18
diff -u -w -r1.18 device.c
--- wine/server/device.c 5 Sep 2003 23:15:41 -0000 1.18
+++ wine/server/device.c 13 Dec 2003 21:18:48 -0000
@@ -24,16 +24,23 @@
* client-side device support.
*/
+#include "config.h"
+
#include <assert.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
#include "windef.h"
#include "winbase.h"
+#include "file.h"
#include "handle.h"
#include "thread.h"
#include "request.h"
@@ -42,37 +49,150 @@
{
struct object obj; /* object header */
int id; /* client identifier */
+ struct fd *fd; /* accociated device file */
};
static void device_dump( struct object *obj, int verbose );
+static struct fd *device_get_fd( struct object *obj );
+static void device_destroy(struct object *obj);
+static int device_get_file_info( struct fd *fd, struct get_file_info_reply *reply, int *flags );
+static int device_set_file_pointer( struct fd *fd, unsigned int *low, int *high, int whence );
static const struct object_ops device_ops =
{
sizeof(struct device), /* size */
device_dump, /* dump */
- no_add_queue, /* add_queue */
- NULL, /* remove_queue */
- NULL, /* signaled */
- NULL, /* satisfied */
- no_get_fd, /* get_fd */
- no_destroy /* destroy */
+ default_fd_add_queue, /* add_queue */
+ default_fd_remove_queue, /* remove_queue */
+ default_fd_signaled, /* signaled */
+ no_satisfied, /* satisfied */
+ device_get_fd, /* get_fd */
+ device_destroy /* destroy */
};
-static struct device *create_device( int id )
+static const struct fd_ops device_fd_ops =
+{
+ NULL, /* get_poll_events */
+ default_poll_event, /* poll_event */
+ no_flush, /* flush */
+ device_get_file_info, /* get_file_info */
+ device_set_file_pointer, /* device_set_file_pointer*/
+ no_queue_async /* queue_async */
+};
+
+static struct device *create_device( int id, unsigned int access, unsigned int attributes,
+ const char *nameptr, size_t len )
{
struct device *dev;
+ int fd=-1, flags = 0, myerr;
+ char *name;
+
+ if ((len) && (name = mem_alloc( len + 1 )) && (access/*!=QUERY_ACCESS*/))
+ {
+ memcpy( name, nameptr, len );
+ name[len] = 0;
+
+ switch(access & (GENERIC_READ | GENERIC_WRITE))
+ {
+ case GENERIC_READ: flags |= O_RDONLY; break;
+ case GENERIC_WRITE: flags |= O_WRONLY; break;
+ case GENERIC_READ|GENERIC_WRITE: flags |= O_RDWR; break;
+ default: break;
+ }
+
+ flags |= O_NONBLOCK;
+
+ fd = open( name, flags );
+ myerr = errno;
+ if ((fd == -1) && ((myerr == EROFS) ||(myerr == EACCES)))
+ {
+ flags &= ~O_RDWR;
+ flags &= ~O_WRONLY;
+ fd = open( name, flags );
+ }
+ free( name );
+ }
+
if ((dev = alloc_object( &device_ops )))
{
dev->id = id;
+ if (fd != -1)
+ {
+ dev->fd = create_anonymous_fd( &device_fd_ops, fd, &dev->obj );
+ }
+ else
+ dev->fd = 0;
}
return dev;
}
+static struct fd *device_get_fd( struct object *obj )
+{
+ struct device *dev = (struct device *)obj;
+ assert( obj->ops == &device_ops );
+ return ( dev->fd )?(struct fd *)grab_object( dev->fd ):0;
+}
+
+static void device_destroy( struct object *obj)
+{
+ struct device *dev = (struct device *)obj;
+ if (dev->fd)
+ release_object( dev->fd );
+}
+
static void device_dump( struct object *obj, int verbose )
{
struct device *dev = (struct device *)obj;
assert( obj->ops == &device_ops );
- fprintf( stderr, "Device id=%08x\n", dev->id );
+ fprintf( stderr, "Device id=%08x fd=%p\n", dev->id , dev->fd);
+}
+
+static int device_get_file_info( struct fd *fd, struct get_file_info_reply *reply, int *flags )
+{
+ struct file *file = get_fd_user( fd );
+ if (reply)
+ {
+ if (file)
+ reply->type = FILE_TYPE_DISK;
+ else
+ reply->type = FD_TYPE_INVALID;
+ reply->attr = 0;
+ reply->access_time = 0;
+ reply->write_time = 0;
+ reply->size_high = 0;
+ reply->size_low = 0;
+ reply->links = 0;
+ reply->index_high = 0;
+ reply->index_low = 0;
+ reply->serial = 0;
+ }
+ *flags = 0;
+ return FD_TYPE_DEFAULT;
+}
+
+static int device_set_file_pointer( struct fd *fd, unsigned int *low, int *high, int whence )
+{
+ struct file *file = get_fd_user( fd );
+ off_t result,xto;
+ int unix_fd = get_unix_fd( fd );
+
+ xto = *low+((off_t)*high<<32);
+ if (!(file)) return 0;
+ if ((result = lseek( unix_fd, xto, whence))==-1)
+ {
+ /* Check for seek before start of file */
+
+ /* also check EPERM due to SuSE7 2.2.16 lseek() EPERM kernel bug */
+ if (((errno == EINVAL) || (errno == EPERM))
+ && (whence != SEEK_SET) && (*high < 0))
+ set_error( 0xc0010000 | ERROR_NEGATIVE_SEEK /* FIXME */ );
+ else
+ file_set_error();
+ return 0;
+ }
+ *low = result & 0xffffffff;
+ *high = result >> 32;
+ return 1;
}
/* create a device */
@@ -81,7 +201,7 @@
struct device *dev;
reply->handle = 0;
- if ((dev = create_device( req->id )))
+ if ((dev = create_device( req->id , req->access, req->attributes, get_req_data(), get_req_data_size())))
{
reply->handle = alloc_handle( current->process, dev, req->access, req->inherit );
release_object( dev );
Index: wine/server/fd.c
===================================================================
RCS file: /home/wine/wine/server/fd.c,v
retrieving revision 1.14
diff -u -w -r1.14 fd.c
--- wine/server/fd.c 1 Dec 2003 23:01:12 -0000 1.14
+++ wine/server/fd.c 13 Dec 2003 21:18:51 -0000
@@ -988,6 +988,15 @@
return FD_TYPE_INVALID;
}
+/* default get_file_info() routine */
+int no_set_file_pointer( struct fd *fd, unsigned int *low, int *high, int whence )
+{
+ set_error( STATUS_OBJECT_TYPE_MISMATCH );
+ *low = 0xffffffff;
+ *high = 0xffffffff;
+ return 0;
+}
+
/* default queue_async() routine */
void no_queue_async( struct fd *fd, void* ptr, unsigned int status, int type, int count )
{
@@ -1048,7 +1057,7 @@
}
}
-/* get a file information */
+/* set a file information */
DECL_HANDLER(get_file_info)
{
struct fd *fd = get_handle_fd_obj( current->process, req->handle, 0 );
@@ -1058,6 +1067,28 @@
int flags;
fd->fd_ops->get_file_info( fd, reply, &flags );
release_object( fd );
+ }
+}
+
+/* get a file information */
+DECL_HANDLER(set_file_pointer)
+{
+ struct fd *fd = get_handle_fd_obj( current->process, req->handle, 0 );
+ int high = req->high;
+ int low = req->low;
+
+
+ if (fd)
+ {
+ fd->fd_ops->set_file_pointer( fd, &low, &high, req->whence);
+ release_object( fd );
+ reply->new_low = low;
+ reply->new_high = high;
+ }
+ else
+ {
+ reply->new_low = 0xffffffff;
+ reply->new_high = 0xffffffff;
}
}
Index: wine/server/file.c
===================================================================
RCS file: /home/wine/wine/server/file.c,v
retrieving revision 1.73
diff -u -w -r1.73 file.c
--- wine/server/file.c 10 Dec 2003 02:14:23 -0000 1.73
+++ wine/server/file.c 13 Dec 2003 21:18:52 -0000
@@ -76,6 +76,7 @@
static void file_poll_event( struct fd *fd, int event );
static int file_flush( struct fd *fd, struct event **event );
static int file_get_info( struct fd *fd, struct get_file_info_reply *reply, int *flags );
+static int file_set_file_pointer( struct fd *fd, unsigned int *low, int *high, int whence );
static void file_queue_async( struct fd *fd, void *ptr, unsigned int status, int type, int count );
static const struct object_ops file_ops =
@@ -96,6 +97,7 @@
file_poll_event, /* poll_event */
file_flush, /* flush */
file_get_info, /* get_file_info */
+ file_set_file_pointer, /* set_file_pointer */
file_queue_async /* queue_async */
};
@@ -358,6 +360,32 @@
return FD_TYPE_DEFAULT;
}
+static int file_set_file_pointer( struct fd *fd, unsigned int *low, int *high, int whence )
+{
+ struct file *file;
+ off_t result,xto;
+ int unix_fd = get_unix_fd( fd );
+
+ file= get_fd_user( fd );
+ xto = *low+((off_t)*high<<32);
+ if (!(file)) return 0;
+ if ((result = lseek( unix_fd, xto, whence))==-1)
+ {
+ /* Check for seek before start of file */
+
+ /* also check EPERM due to SuSE7 2.2.16 lseek() EPERM kernel bug */
+ if (((errno == EINVAL) || (errno == EPERM))
+ && (whence != SEEK_SET) && (*high < 0))
+ set_error( 0xc0010000 | ERROR_NEGATIVE_SEEK /* FIXME */ );
+ else
+ file_set_error();
+ return 0;
+ }
+ *low = result & 0xffffffff;
+ *high = result >> 32;
+ return 1;
+}
+
static void file_queue_async(struct fd *fd, void *ptr, unsigned int status, int type, int count)
{
struct file *file = get_fd_user( fd );
@@ -477,33 +505,6 @@
return get_unix_fd( file->fd );
}
-static int set_file_pointer( obj_handle_t handle, unsigned int *low, int *high, int whence )
-{
- struct file *file;
- off_t result,xto;
-
- xto = *low+((off_t)*high<<32);
- if (!(file = get_file_obj( current->process, handle, 0 )))
- return 0;
- if ((result = lseek( get_file_unix_fd(file), xto, whence))==-1)
- {
- /* Check for seek before start of file */
-
- /* also check EPERM due to SuSE7 2.2.16 lseek() EPERM kernel bug */
- if (((errno == EINVAL) || (errno == EPERM))
- && (whence != SEEK_SET) && (*high < 0))
- set_win32_error( ERROR_NEGATIVE_SEEK );
- else
- file_set_error();
- release_object( file );
- return 0;
- }
- *low = result & 0xffffffff;
- *high = result >> 32;
- release_object( file );
- return 1;
-}
-
/* extend a file beyond the current end of file */
static int extend_file( struct file *file, off_t size )
{
@@ -623,16 +624,6 @@
reply->handle = alloc_handle( current->process, file, req->access, req->inherit );
release_object( file );
}
-}
-
-/* set a file current position */
-DECL_HANDLER(set_file_pointer)
-{
- int high = req->high;
- int low = req->low;
- set_file_pointer( req->handle, &low, &high, req->whence );
- reply->new_low = low;
- reply->new_high = high;
}
/* truncate (or extend) a file */
Index: wine/server/file.h
===================================================================
RCS file: /home/wine/wine/server/file.h,v
retrieving revision 1.10
diff -u -w -r1.10 file.h
--- wine/server/file.h 8 Oct 2003 00:25:33 -0000 1.10
+++ wine/server/file.h 13 Dec 2003 21:18:53 -0000
@@ -38,6 +38,8 @@
int (*flush)(struct fd *, struct event **);
/* get file information */
int (*get_file_info)(struct fd *,struct get_file_info_reply *, int *flags);
+ /* set file pointer (if appropriate)*/
+ int (*set_file_pointer)(struct fd *, unsigned int *low, int *high, int whence );
/* queue an async operation - see register_async handler in async.c*/
void (*queue_async)(struct fd *, void* ptr, unsigned int status, int type, int count);
};
@@ -63,6 +65,7 @@
extern void default_poll_event( struct fd *fd, int event );
extern int no_flush( struct fd *fd, struct event **event );
extern int no_get_file_info( struct fd *fd, struct get_file_info_reply *info, int *flags );
+extern int no_set_file_pointer( struct fd *fd, unsigned int *low, int *high, int whence );
extern void no_queue_async( struct fd *fd, void* ptr, unsigned int status, int type, int count );
extern void main_loop(void);
Index: wine/server/named_pipe.c
===================================================================
RCS file: /home/wine/wine/server/named_pipe.c,v
retrieving revision 1.27
diff -u -w -r1.27 named_pipe.c
--- wine/server/named_pipe.c 5 Sep 2003 23:15:41 -0000 1.27
+++ wine/server/named_pipe.c 13 Dec 2003 21:18:55 -0000
@@ -152,6 +152,7 @@
default_poll_event, /* poll_event */
pipe_server_flush, /* flush */
pipe_end_get_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
no_queue_async /* queue_async */
};
@@ -179,6 +180,7 @@
default_poll_event, /* poll_event */
pipe_client_flush, /* flush */
pipe_end_get_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
no_queue_async /* queue_async */
};
Index: wine/server/process.c
===================================================================
RCS file: /home/wine/wine/server/process.c,v
retrieving revision 1.115
diff -u -w -r1.115 process.c
--- wine/server/process.c 10 Dec 2003 04:08:06 -0000 1.115
+++ wine/server/process.c 13 Dec 2003 21:18:58 -0000
@@ -76,6 +76,7 @@
process_poll_event, /* poll_event */
no_flush, /* flush */
no_get_file_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
no_queue_async /* queue_async */
};
Index: wine/server/request.c
===================================================================
RCS file: /home/wine/wine/server/request.c,v
retrieving revision 1.80
diff -u -w -r1.80 request.c
--- wine/server/request.c 18 Jun 2003 19:45:22 -0000 1.80
+++ wine/server/request.c 13 Dec 2003 21:19:00 -0000
@@ -100,6 +100,7 @@
master_socket_poll_event, /* poll_event */
no_flush, /* flush */
no_get_file_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
no_queue_async /* queue_async */
};
Index: wine/server/serial.c
===================================================================
RCS file: /home/wine/wine/server/serial.c,v
retrieving revision 1.31
diff -u -w -r1.31 serial.c
--- wine/server/serial.c 5 Sep 2003 23:15:41 -0000 1.31
+++ wine/server/serial.c 13 Dec 2003 21:19:01 -0000
@@ -107,6 +107,7 @@
serial_poll_event, /* poll_event */
serial_flush, /* flush */
serial_get_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
serial_queue_async /* queue_async */
};
Index: wine/server/signal.c
===================================================================
RCS file: /home/wine/wine/server/signal.c,v
retrieving revision 1.6
diff -u -w -r1.6 signal.c
--- wine/server/signal.c 24 Oct 2003 04:29:01 -0000 1.6
+++ wine/server/signal.c 13 Dec 2003 21:19:02 -0000
@@ -71,6 +71,7 @@
handler_poll_event, /* poll_event */
no_flush, /* flush */
no_get_file_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
no_queue_async /* queue_async */
};
Index: wine/server/smb.c
===================================================================
RCS file: /home/wine/wine/server/smb.c,v
retrieving revision 1.10
diff -u -w -r1.10 smb.c
--- wine/server/smb.c 5 Sep 2003 23:15:41 -0000 1.10
+++ wine/server/smb.c 13 Dec 2003 21:19:03 -0000
@@ -89,6 +89,7 @@
default_poll_event, /* poll_event */
no_flush, /* flush */
smb_get_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
no_queue_async /* queue_async */
};
Index: wine/server/sock.c
===================================================================
RCS file: /home/wine/wine/server/sock.c,v
retrieving revision 1.46
diff -u -w -r1.46 sock.c
--- wine/server/sock.c 5 Sep 2003 23:15:41 -0000 1.46
+++ wine/server/sock.c 13 Dec 2003 21:19:05 -0000
@@ -117,6 +117,7 @@
sock_poll_event, /* poll_event */
no_flush, /* flush */
sock_get_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
sock_queue_async /* queue_async */
};
Index: wine/server/trace.c
===================================================================
RCS file: /home/wine/wine/server/trace.c,v
retrieving revision 1.190
diff -u -w -r1.190 trace.c
--- wine/server/trace.c 11 Dec 2003 05:34:53 -0000 1.190
+++ wine/server/trace.c 13 Dec 2003 21:19:13 -0000
@@ -1349,8 +1349,11 @@
static void dump_create_device_request( const struct create_device_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
+ fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " id=%d", req->id );
+ fprintf( stderr, " id=%d,", req->id );
+ fprintf( stderr, " device=" );
+ dump_varargs_string( cur_size );
}
static void dump_create_device_reply( const struct create_device_reply *req )
Index: wine/server/thread.c
===================================================================
RCS file: /home/wine/wine/server/thread.c,v
retrieving revision 1.103
diff -u -w -r1.103 thread.c
--- wine/server/thread.c 27 Oct 2003 22:10:22 -0000 1.103
+++ wine/server/thread.c 13 Dec 2003 21:19:15 -0000
@@ -100,6 +100,7 @@
thread_poll_event, /* poll_event */
no_flush, /* flush */
no_get_file_info, /* get_file_info */
+ no_set_file_pointer, /* set_file_pointer*/
no_queue_async /* queue_async */
};
More information about the wine-patches
mailing list