diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c
index 6ec746a..a99bf8e 100644
--- a/dlls/ntdll/exception.c
+++ b/dlls/ntdll/exception.c
@@ -95,11 +95,14 @@
     int ret;
     SERVER_START_REQ
     {
-        struct exception_event_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->record  = *rec;
+        struct exception_event_request *req = server_alloc_req( sizeof(*req),
+                                                                sizeof(*rec)+sizeof(*context) );
+        CONTEXT *context_ptr = server_data_ptr(req);
+        EXCEPTION_RECORD *rec_ptr = (EXCEPTION_RECORD *)(context_ptr + 1);
         req->first   = first_chance;
-        req->context = *context;
-        if (!server_call_noerr( REQ_EXCEPTION_EVENT )) *context = req->context;
+        *rec_ptr     = *rec;
+        *context_ptr = *context;
+        if (!server_call_noerr( REQ_EXCEPTION_EVENT )) *context = *context_ptr;
         ret = req->status;
     }
     SERVER_END_REQ;
diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c
index 41eee91..7ffb0a8 100644
--- a/dlls/winsock/socket.c
+++ b/dlls/winsock/socket.c
@@ -86,6 +86,7 @@
 #include "wine/port.h"
 #include "services.h"
 #include "server.h"
+#include "file.h"
 #include "debugtools.h"
 
 
@@ -222,11 +223,7 @@
 
 static int _get_sock_fd(SOCKET s)
 {
-    struct get_read_fd_request *req = get_req_buffer();
-    int fd;
-    
-    req->handle = s;
-    server_call_fd( REQ_GET_READ_FD, -1, &fd );
+    int fd = FILE_GetUnixHandle( s, GENERIC_READ );
     if (fd == -1)
         FIXME("handle %d is not a socket (GLE %ld)\n",s,GetLastError());
     return fd;    
@@ -235,37 +232,53 @@
 static void _enable_event(SOCKET s, unsigned int event,
 			  unsigned int sstate, unsigned int cstate)
 {
-    struct enable_socket_event_request *req = get_req_buffer();
-    
-    req->handle = s;
-    req->mask   = event;
-    req->sstate = sstate;
-    req->cstate = cstate;
-    sock_server_call( REQ_ENABLE_SOCKET_EVENT );
+    SERVER_START_REQ
+    {
+        struct enable_socket_event_request *req = server_alloc_req( sizeof(*req), 0 );
+
+        req->handle = s;
+        req->mask   = event;
+        req->sstate = sstate;
+        req->cstate = cstate;
+        sock_server_call( REQ_ENABLE_SOCKET_EVENT );
+    }
+    SERVER_END_REQ;
 }
 
 static int _is_blocking(SOCKET s)
 {
-    struct get_socket_event_request *req = get_req_buffer();
-    
-    req->handle  = s;
-    req->service = FALSE;
-    req->s_event = 0;
-    req->c_event = 0;
-    sock_server_call( REQ_GET_SOCKET_EVENT );
-    return (req->state & WS_FD_NONBLOCKING) == 0;
+    int ret;
+    SERVER_START_REQ
+    {
+        struct get_socket_event_request *req = server_alloc_req( sizeof(*req), 0 );
+
+        req->handle  = s;
+        req->service = FALSE;
+        req->s_event = 0;
+        req->c_event = 0;
+        sock_server_call( REQ_GET_SOCKET_EVENT );
+        ret = (req->state & WS_FD_NONBLOCKING) == 0;
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 static unsigned int _get_sock_mask(SOCKET s)
 {
-    struct get_socket_event_request *req = get_req_buffer();
-    
-    req->handle  = s;
-    req->service = FALSE;
-    req->s_event = 0;
-    req->c_event = 0;
-    sock_server_call( REQ_GET_SOCKET_EVENT );
-    return req->mask;
+    unsigned int ret;
+    SERVER_START_REQ
+    {
+        struct get_socket_event_request *req = server_alloc_req( sizeof(*req), 0 );
+
+        req->handle  = s;
+        req->service = FALSE;
+        req->s_event = 0;
+        req->c_event = 0;
+        sock_server_call( REQ_GET_SOCKET_EVENT );
+        ret = req->mask;
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 static void _sync_sock_state(SOCKET s)
@@ -277,14 +290,20 @@
 
 static int _get_sock_error(SOCKET s, unsigned int bit)
 {
-    struct get_socket_event_request *req = get_req_buffer();
-    
-    req->handle  = s;
-    req->service = FALSE;
-    req->s_event = 0;
-    req->c_event = 0;
-    sock_server_call( REQ_GET_SOCKET_EVENT );
-    return req->errors[bit];
+    int ret;
+    SERVER_START_REQ
+    {
+        struct get_socket_event_request *req = server_alloc_req( sizeof(*req),
+                                                                 FD_MAX_EVENTS*sizeof(int) );
+        req->handle  = s;
+        req->service = FALSE;
+        req->s_event = 0;
+        req->c_event = 0;
+        sock_server_call( REQ_GET_SOCKET_EVENT );
+        ret = *((int *)server_data_ptr(req) + bit);
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 static LPWSINFO lpFirstIData = NULL;
@@ -803,12 +822,12 @@
 #ifdef HAVE_IPX
     struct ws_sockaddr_ipx*  addr2 = (struct ws_sockaddr_ipx *)addr;
 #endif
-    struct accept_socket_request *req = get_req_buffer();
 
     TRACE("(%08x): socket %04x\n", 
 				  (unsigned)pwsi, (UINT16)s ); 
     if( _check_ws(pwsi, s) )
     {
+        SOCKET as;
 	if (_is_blocking(s))
 	{
 	    /* block here */
@@ -820,13 +839,19 @@
 	    SetLastError(_get_sock_error(s, FD_ACCEPT_BIT));
 	    /* FIXME: care about the error? */
 	}
-	req->lhandle = s;
-	req->access  = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
-	req->inherit = TRUE;
-	sock_server_call( REQ_ACCEPT_SOCKET );
-	if( req->handle >= 0 )
+        SERVER_START_REQ
+        {
+            struct accept_socket_request *req = server_alloc_req( sizeof(*req), 0 );
+
+            req->lhandle = s;
+            req->access  = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
+            req->inherit = TRUE;
+            sock_server_call( REQ_ACCEPT_SOCKET );
+            as = req->handle;
+        }
+        SERVER_END_REQ;
+	if( as >= 0 )
 	{
-	    SOCKET as = req->handle;
 	    unsigned omask = _get_sock_mask( s );
 	    int fd = _get_sock_fd( as );
 	    if( getpeername(fd, addr, addrlen32) != -1 )
@@ -2152,7 +2177,7 @@
 SOCKET WINAPI WSOCK32_socket(INT af, INT type, INT protocol)
 {
   LPWSINFO      pwsi = WINSOCK_GetIData();
-  struct create_socket_request *req = get_req_buffer();
+  SOCKET ret;
 
   TRACE("(%08x): af=%d type=%d protocol=%d\n", 
 			  (unsigned)pwsi, af, type, protocol);
@@ -2195,17 +2220,22 @@
           default: SetLastError(WSAEPROTOTYPE); return INVALID_SOCKET;
         }
 
-    req->family   = af;
-    req->type     = type;
-    req->protocol = protocol;
-    req->access   = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
-    req->inherit  = TRUE;
-    sock_server_call( REQ_CREATE_SOCKET );
-    if ( req->handle >= 0)
+    SERVER_START_REQ
     {
-	TRACE("\tcreated %04x\n", req->handle);
-
-	return req->handle;
+        struct create_socket_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->family   = af;
+        req->type     = type;
+        req->protocol = protocol;
+        req->access   = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
+        req->inherit  = TRUE;
+        sock_server_call( REQ_CREATE_SOCKET );
+        ret = req->handle;
+    }
+    SERVER_END_REQ;
+    if ( ret >= 0)
+    {
+        TRACE("\tcreated %04x\n", ret );
+        return ret;
     }
 
     if (GetLastError() == WSAEACCES) /* raw socket denied */
@@ -2518,20 +2548,25 @@
 int WINAPI WSAEnumNetworkEvents(SOCKET s, WSAEVENT hEvent, LPWSANETWORKEVENTS lpEvent)
 {
     LPWSINFO      pwsi = WINSOCK_GetIData();
-    struct get_socket_event_request *req = get_req_buffer();
 
     TRACE("(%08x): %08x, hEvent %08x, lpEvent %08x\n",
 			  (unsigned)pwsi, s, hEvent, (unsigned)lpEvent );
     if( _check_ws(pwsi, s) )
     {
-	req->handle  = s;
-	req->service = TRUE;
-	req->s_event = 0;
-	req->c_event = hEvent;
-	sock_server_call( REQ_GET_SOCKET_EVENT );
-	lpEvent->lNetworkEvents = req->pmask;
-	memcpy(lpEvent->iErrorCode, req->errors, sizeof(lpEvent->iErrorCode));
-	return 0;
+        SERVER_START_REQ
+        {
+            struct get_socket_event_request *req = server_alloc_req( sizeof(*req),
+                                                                     sizeof(lpEvent->iErrorCode) );
+            req->handle  = s;
+            req->service = TRUE;
+            req->s_event = 0;
+            req->c_event = hEvent;
+            sock_server_call( REQ_GET_SOCKET_EVENT );
+            lpEvent->lNetworkEvents = req->pmask;
+            memcpy(lpEvent->iErrorCode, server_data_ptr(req), server_data_size(req) );
+        }
+        SERVER_END_REQ;
+        return 0;
     }
     else SetLastError(WSAEINVAL);
     return SOCKET_ERROR; 
@@ -2543,17 +2578,21 @@
 int WINAPI WSAEventSelect(SOCKET s, WSAEVENT hEvent, LONG lEvent)
 {
     LPWSINFO      pwsi = WINSOCK_GetIData();
-    struct set_socket_event_request *req = get_req_buffer();
 
     TRACE("(%08x): %08x, hEvent %08x, event %08x\n",
 			  (unsigned)pwsi, s, hEvent, (unsigned)lEvent );
     if( _check_ws(pwsi, s) )
     {
-	req->handle = s;
-	req->mask   = lEvent;
-	req->event  = hEvent;
-	sock_server_call( REQ_SET_SOCKET_EVENT );
-	return 0;
+        SERVER_START_REQ
+        {
+            struct set_socket_event_request *req = server_alloc_req( sizeof(*req), 0 );
+            req->handle = s;
+            req->mask   = lEvent;
+            req->event  = hEvent;
+            sock_server_call( REQ_SET_SOCKET_EVENT );
+        }
+        SERVER_END_REQ;
+        return 0;
     }
     else SetLastError(WSAEINVAL);
     return SOCKET_ERROR; 
@@ -2567,23 +2606,30 @@
 {
     ws_select_info *info = (ws_select_info*)ptr;
     LPWSINFO      pwsi = info->pwsi;
-    struct get_socket_event_request *req = get_req_buffer();
     unsigned int i, pmask, orphan = FALSE;
+    int errors[FD_MAX_EVENTS];
 
     TRACE("socket %08x, event %08x\n", info->sock, info->event);
     SetLastError(0);
-    req->handle  = info->sock;
-    req->service = TRUE;
-    req->s_event = info->event; /* <== avoid race conditions */
-    req->c_event = info->event;
-    sock_server_call( REQ_GET_SOCKET_EVENT );
+    SERVER_START_REQ
+    {
+        struct get_socket_event_request *req = server_alloc_req( sizeof(*req), sizeof(errors) );
+        req->handle  = info->sock;
+        req->service = TRUE;
+        req->s_event = info->event; /* <== avoid race conditions */
+        req->c_event = info->event;
+        sock_server_call( REQ_GET_SOCKET_EVENT );
+        pmask = req->pmask;
+        memcpy( errors, server_data_ptr(req), server_data_size(req) );
+    }
+    SERVER_END_REQ;
     if ( (GetLastError() == WSAENOTSOCK) || (GetLastError() == WSAEINVAL) )
     {
 	/* orphaned event (socket closed or something) */
 	pmask = WS_FD_SERVEVENT;
 	orphan = TRUE;
-    } else
-	pmask = req->pmask;
+    }
+
     /* check for accepted sockets that needs to inherit WSAAsyncSelect */
     if (pmask & WS_FD_SERVEVENT) {
 	int q;
@@ -2602,9 +2648,9 @@
     /* dispatch network events */
     for (i=0; i<FD_MAX_EVENTS; i++)
 	if (pmask & (1<<i)) {
-	    TRACE("post: event bit %d, error %d\n", i, req->errors[i]);
+	    TRACE("post: event bit %d, error %d\n", i, errors[i]);
 	    PostMessageA(info->hWnd, info->uMsg, info->sock,
-			 WSAMAKESELECTREPLY(1<<i, req->errors[i]));
+			 WSAMAKESELECTREPLY(1<<i, errors[i]));
 	}
     /* cleanup */
     if (orphan)
diff --git a/files/dos_fs.c b/files/dos_fs.c
index a11dab2..f4f099a 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -621,16 +621,21 @@
  */
 const DOS_DEVICE *DOSFS_GetDeviceByHandle( HFILE hFile )
 {
-    struct get_file_info_request *req = get_req_buffer();
-
-    req->handle = hFile;
-    if (!server_call( REQ_GET_FILE_INFO ) && (req->type == FILE_TYPE_UNKNOWN))
+    const DOS_DEVICE *ret = NULL;
+    SERVER_START_REQ
     {
-        if ((req->attr >= 0) &&
-            (req->attr < sizeof(DOSFS_Devices)/sizeof(DOSFS_Devices[0])))
-            return &DOSFS_Devices[req->attr];
+        struct get_file_info_request *req = server_alloc_req( sizeof(*req), 0 );
+
+        req->handle = hFile;
+        if (!server_call( REQ_GET_FILE_INFO ) && (req->type == FILE_TYPE_UNKNOWN))
+        {
+            if ((req->attr >= 0) &&
+                (req->attr < sizeof(DOSFS_Devices)/sizeof(DOSFS_Devices[0])))
+                ret = &DOSFS_Devices[req->attr];
+        }
     }
-    return NULL;
+    SERVER_END_REQ;
+    return ret;
 }
 
 
diff --git a/files/file.c b/files/file.c
index c619724..38cd03b 100644
--- a/files/file.c
+++ b/files/file.c
@@ -319,6 +319,31 @@
 
 
 /***********************************************************************
+ *           FILE_GetUnixHandle
+ *
+ * Retrieve the Unix handle corresponding to a file handle.
+ */
+int FILE_GetUnixHandle( HANDLE handle, DWORD access )
+{
+    int unix_handle = -1;
+    if (access == GENERIC_READ)
+    {
+        struct get_read_fd_request *req = get_req_buffer();
+        req->handle = handle;
+        server_call_fd( REQ_GET_READ_FD, -1, &unix_handle );
+    }
+    else if (access == GENERIC_WRITE)
+    {
+        struct get_write_fd_request *req = get_req_buffer();
+        req->handle = handle;
+        server_call_fd( REQ_GET_WRITE_FD, -1, &unix_handle );
+    }
+    else ERR( "bad access %08lx\n", access );
+    return unix_handle;
+}
+
+
+/***********************************************************************
  *           FILE_CreateFile
  *
  * Implementation of CreateFile. Takes a Unix path name.
@@ -328,21 +353,35 @@
                         DWORD attributes, HANDLE template, BOOL fail_read_only )
 {
     DWORD err;
-    struct create_file_request *req = get_req_buffer();
+    HANDLE ret;
+    size_t len = strlen(filename);
+
+    if (len > REQUEST_MAX_VAR_SIZE)
+    {
+        FIXME("filename '%s' too long\n", filename );
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return -1;
+    }
 
  restart:
-    req->access  = access;
-    req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-    req->sharing = sharing;
-    req->create  = creation;
-    req->attrs   = attributes;
-    lstrcpynA( req->name, filename, server_remaining(req->name) );
-    SetLastError(0);
-    err = server_call( REQ_CREATE_FILE );
+    SERVER_START_REQ
+    {
+        struct create_file_request *req = server_alloc_req( sizeof(*req), len );
+        req->access  = access;
+        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
+        req->sharing = sharing;
+        req->create  = creation;
+        req->attrs   = attributes;
+        memcpy( server_data_ptr(req), filename, len );
+        SetLastError(0);
+        err = server_call( REQ_CREATE_FILE );
+        ret = req->handle;
+    }
+    SERVER_END_REQ;
 
     /* If write access failed, retry without GENERIC_WRITE */
 
-    if ((req->handle == -1) && !fail_read_only && (access & GENERIC_WRITE)) 
+    if ((ret == -1) && !fail_read_only && (access & GENERIC_WRITE)) 
     {
 	if ((err == STATUS_MEDIA_WRITE_PROTECTED) || (err == STATUS_ACCESS_DENIED))
         {
@@ -353,11 +392,11 @@
         }
     }
 
-    if (req->handle == -1)
+    if (ret == -1)
 	WARN("Unable to create file '%s' (GLE %ld)\n", filename,
 	     GetLastError());
 
-    return req->handle;
+    return ret;
 }
 
 
@@ -1140,7 +1179,6 @@
 BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead,
                         LPDWORD bytesRead, LPOVERLAPPED overlapped )
 {
-    struct get_read_fd_request *req = get_req_buffer();
     int unix_handle, result;
 
     TRACE("%d %p %ld\n", hFile, buffer, bytesToRead );
@@ -1153,8 +1191,7 @@
       return FALSE;
     }
 
-    req->handle = hFile;
-    server_call_fd( REQ_GET_READ_FD, -1, &unix_handle );
+    unix_handle = FILE_GetUnixHandle( hFile, GENERIC_READ );
     if (unix_handle == -1) return FALSE;
     while ((result = read( unix_handle, buffer, bytesToRead )) == -1)
     {
@@ -1176,7 +1213,6 @@
 BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
                          LPDWORD bytesWritten, LPOVERLAPPED overlapped )
 {
-    struct get_write_fd_request *req = get_req_buffer();
     int unix_handle, result;
 
     TRACE("%d %p %ld\n", hFile, buffer, bytesToWrite );
@@ -1189,8 +1225,7 @@
       return FALSE;
     }
 
-    req->handle = hFile;
-    server_call_fd( REQ_GET_WRITE_FD, -1, &unix_handle );
+    unix_handle = FILE_GetUnixHandle( hFile, GENERIC_WRITE );
     if (unix_handle == -1) return FALSE;
     while ((result = write( unix_handle, buffer, bytesToWrite )) == -1)
     {
diff --git a/include/file.h b/include/file.h
index 9cca731..6303c74 100644
--- a/include/file.h
+++ b/include/file.h
@@ -33,6 +33,7 @@
 /* files/file.c */
 extern void FILE_SetDosError(void);
 extern HFILE FILE_DupUnixHandle( int fd, DWORD access );
+extern int FILE_GetUnixHandle( HANDLE handle, DWORD access );
 extern BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info );
 extern HFILE16 FILE_Dup2( HFILE16 hFile1, HFILE16 hFile2 );
 extern HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
diff --git a/include/server.h b/include/server.h
index 777f396..04046f8 100644
--- a/include/server.h
+++ b/include/server.h
@@ -41,6 +41,9 @@
     int pad[16]; /* the max request size is 16 ints */
 };
 
+/* max size of the variable part of a request */
+#define REQUEST_MAX_VAR_SIZE  1024
+
 /* a path name for server requests (Unicode) */
 typedef WCHAR path_t[MAX_PATH+1];
 
@@ -131,7 +134,7 @@
     IN  int          hstderr;      /* handle for stderr */
     IN  int          cmd_show;     /* main window show mode */
     IN  int          alloc_fd;     /* create the fd pair right now? */
-    IN  char         filename[1];  /* file name of main exe */
+    IN  VARARG(filename,string);   /* file name of main exe */
 };
 
 
@@ -183,7 +186,7 @@
     OUT int          hstdout;      /* handle for stdout */
     OUT int          hstderr;      /* handle for stderr */
     OUT int          cmd_show;     /* main window show mode */
-    OUT char         filename[1];  /* file name of main exe */
+    OUT VARARG(filename,string);   /* file name of main exe */
 };
 
 
@@ -529,7 +532,7 @@
     IN  int          create;        /* file create action */
     IN  unsigned int attrs;         /* file attributes for creation */
     OUT int          handle;        /* handle to the file */
-    IN  char         name[1];       /* file name */
+    IN  VARARG(filename,string);    /* file name */
 };
 
 
@@ -694,7 +697,7 @@
     OUT unsigned int mask;          /* event mask */
     OUT unsigned int pmask;         /* pending events */
     OUT unsigned int state;         /* status bits */
-    OUT int          errors[1];     /* event errors */
+    OUT VARARG(errors,ints);        /* event errors */
 };
 
 
@@ -774,7 +777,7 @@
     IN  int          mask;          /* setting mask (see below) */
     IN  int          cursor_size;   /* size of cursor (percentage filled) */
     IN  int          cursor_visible;/* cursor visibility flag */
-    IN  char         title[1];      /* console title */
+    IN  VARARG(title,string);       /* console title */
 };
 #define SET_CONSOLE_INFO_CURSOR 0x01
 #define SET_CONSOLE_INFO_TITLE  0x02
@@ -787,7 +790,7 @@
     OUT int          cursor_size;   /* size of cursor (percentage filled) */
     OUT int          cursor_visible;/* cursor visibility flag */
     OUT int          pid;           /* pid of xterm (hack) */
-    OUT char         title[1];      /* console title */
+    OUT VARARG(title,string);       /* console title */
 };
 
 
@@ -796,9 +799,8 @@
 {
     REQUEST_HEADER;                 /* request header */
     IN  int          handle;        /* handle to the console input */
-    IN  int          count;         /* number of input records */
     OUT int          written;       /* number of records written */
- /* INPUT_RECORD records[0]; */     /* input records */
+    IN  VARARG(rec,input_records);  /* input records */
 };
 
 /* Fetch input records from a console input queue */
@@ -806,10 +808,9 @@
 {
     REQUEST_HEADER;                 /* request header */
     IN  int          handle;        /* handle to the console input */
-    IN  int          count;         /* max number of records to retrieve */
     IN  int          flush;         /* flush the retrieved records from the queue? */
     OUT int          read;          /* number of records read */
- /* INPUT_RECORD records[0]; */     /* input records */
+    OUT VARARG(rec,input_records);  /* input records */
 };
 
 
@@ -947,10 +948,10 @@
 struct exception_event_request
 {
     REQUEST_HEADER;                /* request header */
-    IN  EXCEPTION_RECORD record;   /* exception record */
     IN  int              first;    /* first chance exception? */
-    IN  CONTEXT          context;  /* thread context */
     OUT int              status;   /* event continuation status */
+    IN  VARARG(record,exc_event);  /* thread context followed by exception record */
+    OUT VARARG(context,context);   /* modified thread context */
 };
 
 
@@ -1213,7 +1214,7 @@
     REQUEST_HEADER;                /* request header */
     IN  int          handle;       /* thread handle */
     IN  unsigned int flags;        /* context flags */
-    OUT CONTEXT      context;      /* thread context */
+    OUT VARARG(context,context);   /* thread context */
 };
 
 
@@ -1223,7 +1224,7 @@
     REQUEST_HEADER;                /* request header */
     IN  int          handle;       /* thread handle */
     IN  unsigned int flags;        /* context flags */
-    IN  CONTEXT      context;      /* thread context */
+    IN  VARARG(context,context);   /* thread context */
 };
 
 
@@ -1540,7 +1541,7 @@
     struct wait_input_idle_request wait_input_idle;
 };
 
-#define SERVER_PROTOCOL_VERSION 19
+#define SERVER_PROTOCOL_VERSION 20
 
 /* ### make_requests end ### */
 /* Everything above this line is generated automatically by tools/make_requests */
diff --git a/loader/dos/module.c b/loader/dos/module.c
index 7892d46..f75d85a 100644
--- a/loader/dos/module.c
+++ b/loader/dos/module.c
@@ -33,10 +33,9 @@
 #include "dosexe.h"
 #include "dosmod.h"
 #include "options.h"
-#include "server.h"
 #include "vga.h"
 
-DEFAULT_DEBUG_CHANNEL(module)
+DEFAULT_DEBUG_CHANNEL(module);
 
 #ifdef MZ_SUPPORTED
 
@@ -378,8 +377,6 @@
   int write_fd[2],x_fd;
   pid_t child;
   char *fname,*farg,arg[16],fproc[64],path[256],*fpath;
-  struct get_read_fd_request *r_req = get_req_buffer();
-  struct get_write_fd_request *w_req = get_req_buffer();
 
   if (!lpDosTask) return FALSE;
   /* create pipes */
@@ -390,10 +387,8 @@
     return FALSE;
   }
 
-  r_req->handle = lpDosTask->hReadPipe;
-  server_call_fd( REQ_GET_READ_FD, -1, &lpDosTask->read_pipe );
-  w_req->handle = lpDosTask->hXPipe;
-  server_call_fd( REQ_GET_WRITE_FD, -1, &x_fd );
+  lpDosTask->read_pipe = FILE_GetUnixHandle( lpDosTask->hReadPipe, GENERIC_READ );
+  x_fd = FILE_GetUnixHandle( lpDosTask->hXPipe, GENERIC_WRITE );
 
   TRACE("win32 pipe: read=%d, write=%d, unix pipe: read=%d, write=%d\n",
 	       lpDosTask->hReadPipe,lpDosTask->hXPipe,lpDosTask->read_pipe,x_fd);
diff --git a/memory/virtual.c b/memory/virtual.c
index 8eda710..eb345a7 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -471,10 +471,7 @@
 
     if (shared_size)
     {
-        struct get_read_fd_request *req = get_req_buffer();
-        req->handle = shared_file;
-        server_call_fd( REQ_GET_READ_FD, -1, &shared_fd );
-        if (shared_fd == -1) goto error;
+        if ((shared_fd = FILE_GetUnixHandle( shared_file, GENERIC_READ )) == -1) goto error;
         CloseHandle( shared_file );  /* we no longer need it */
         shared_file = INVALID_HANDLE_VALUE; 
     }
diff --git a/misc/comm.c b/misc/comm.c
index f93aef8..33a8f50 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -1620,13 +1620,9 @@
  *  Returns a file descriptor for reading.
  *  Make sure to close the handle afterwards!
  */
-static int COMM_GetReadFd( HANDLE handle)
+inline static int COMM_GetReadFd( HANDLE handle)
 {
-    int fd;
-    struct get_read_fd_request *req = get_req_buffer();
-    req->handle = handle;
-    server_call_fd( REQ_GET_READ_FD, -1, &fd );
-    return fd;
+    return FILE_GetUnixHandle( handle, GENERIC_READ );
 }
 
 /*****************************************************************************
@@ -1634,13 +1630,9 @@
  *  Returns a file descriptor for writing.
  *  Make sure to close the handle afterwards!
  */
-static int COMM_GetWriteFd( HANDLE handle)
+inline static int COMM_GetWriteFd( HANDLE handle)
 {
-    int fd = -1;
-    struct get_write_fd_request *req = get_req_buffer();
-    req->handle = handle;
-    server_call_fd( REQ_GET_WRITE_FD, -1, &fd );
-    return fd;
+    return FILE_GetUnixHandle( handle, GENERIC_WRITE );
 }
 
 /* FIXME: having these global for win32 for now */
diff --git a/scheduler/client.c b/scheduler/client.c
index 03d4afe..4fb8318 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -133,6 +133,7 @@
     size_t size = sizeof(*req) + var_size;
 
     assert( fixed_size <= sizeof(*req) );
+    assert( var_size <= REQUEST_MAX_VAR_SIZE );
 
     if ((char *)req + size > (char *)NtCurrentTeb()->buffer_info)
         server_protocol_error( "buffer overflow %d bytes\n",
diff --git a/scheduler/process.c b/scheduler/process.c
index a82486d..1c4bb0a 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -39,7 +39,7 @@
 PDB current_process;
 
 static char **main_exe_argv;
-static char *main_exe_name;
+static char main_exe_name[MAX_PATH];
 static HFILE main_exe_file = -1;
 
 
@@ -185,15 +185,18 @@
     /* Retrieve startup info from the server */
     SERVER_START_REQ
     {
-        struct init_process_request *req = server_alloc_req( sizeof(*req), 0 );
+        struct init_process_request *req = server_alloc_req( sizeof(*req),
+                                                             sizeof(main_exe_name)-1 );
 
         req->ldt_copy  = ldt_copy;
         req->ldt_flags = ldt_flags_copy;
         req->ppid      = getppid();
         if ((ret = !server_call( REQ_INIT_PROCESS )))
         {
-            main_exe_file               = req->exe_file;
-            if (req->filename[0]) main_exe_name = strdup( req->filename );
+            size_t len = server_data_size( req );
+            memcpy( main_exe_name, server_data_ptr(req), len );
+            main_exe_name[len] = 0;
+            main_exe_file = req->exe_file;
             current_startupinfo.dwFlags     = req->start_flags;
             current_startupinfo.wShowWindow = req->cmd_show;
             current_envdb.hStdin   = current_startupinfo.hStdInput  = req->hstdin;
@@ -367,17 +370,16 @@
  *           PROCESS_Start
  *
  * Startup routine of a new Win32 process once the main module has been loaded.
- * The filename is free'd by this routine.
  */
-static void PROCESS_Start( HMODULE main_module, HFILE hFile, LPSTR filename ) WINE_NORETURN;
-static void PROCESS_Start( HMODULE main_module, HFILE hFile, LPSTR filename )
+static void PROCESS_Start( HMODULE main_module, HFILE hFile, LPCSTR filename ) WINE_NORETURN;
+static void PROCESS_Start( HMODULE main_module, HFILE hFile, LPCSTR filename )
 {
     if (!filename)
     {
         /* if no explicit filename, use argv[0] */
-        if (!(filename = malloc( MAX_PATH ))) ExitProcess(1);
-        if (!GetLongPathNameA( full_argv0, filename, MAX_PATH ))
-            lstrcpynA( filename, full_argv0, MAX_PATH );
+        filename = main_exe_name;
+        if (!GetLongPathNameA( full_argv0, main_exe_name, sizeof(main_exe_name) ))
+            lstrcpynA( main_exe_name, full_argv0, sizeof(main_exe_name) );
     }
 
     /* load main module */
@@ -387,7 +389,6 @@
     /* Create 32-bit MODREF */
     if (!PE_CreateModule( main_module, filename, 0, hFile, FALSE ))
         goto error;
-    free( filename );
 
     /* allocate main thread stack */
     if (!THREAD_InitStack( NtCurrentTeb(),
@@ -416,23 +417,17 @@
 
     main_exe_argv = ++argv;  /* remove argv[0] (wine itself) */
 
-    if (!main_exe_name)
+    if (!main_exe_name[0])
     {
-        char buffer[MAX_PATH];
         if (!argv[0]) OPTIONS_Usage();
 
         /* open the exe file */
-        if (!SearchPathA( NULL, argv[0], ".exe", sizeof(buffer), buffer, NULL ) &&
-            !SearchPathA( NULL, argv[0], NULL, sizeof(buffer), buffer, NULL ))
+        if (!SearchPathA( NULL, argv[0], ".exe", sizeof(main_exe_name), main_exe_name, NULL ) &&
+            !SearchPathA( NULL, argv[0], NULL, sizeof(main_exe_name), main_exe_name, NULL ))
         {
             MESSAGE( "%s: cannot find '%s'\n", argv0, argv[0] );
             goto error;
         }
-        if (!(main_exe_name = strdup(buffer)))
-        {
-            MESSAGE( "%s: out of memory\n", argv0 );
-            ExitProcess(1);
-        }
     }
 
     if (main_exe_file == INVALID_HANDLE_VALUE)
@@ -723,54 +718,64 @@
     const char *unixdir = NULL;
     DOS_FULL_NAME full_name;
     HANDLE load_done_evt = -1;
-    struct new_process_request *req = get_req_buffer();
 
     info->hThread = info->hProcess = INVALID_HANDLE_VALUE;
-    
-    /* create the process on the server side */
 
-    req->inherit_all  = inherit;
-    req->create_flags = flags;
-    req->start_flags  = startup->dwFlags;
-    req->exe_file     = hFile;
-    if (startup->dwFlags & STARTF_USESTDHANDLES)
+    if (lpCurrentDirectory)
     {
-        req->hstdin  = startup->hStdInput;
-        req->hstdout = startup->hStdOutput;
-        req->hstderr = startup->hStdError;
+        if (DOSFS_GetFullName( lpCurrentDirectory, TRUE, &full_name ))
+            unixdir = full_name.long_name;
     }
     else
     {
-        req->hstdin  = GetStdHandle( STD_INPUT_HANDLE );
-        req->hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
-        req->hstderr = GetStdHandle( STD_ERROR_HANDLE );
-    }
-    req->cmd_show = startup->wShowWindow;
-    req->alloc_fd = 0;
-
-    if (lpCurrentDirectory) {
-        if (DOSFS_GetFullName( lpCurrentDirectory, TRUE, &full_name ))
-	    unixdir = full_name.long_name;
-    } else {
-	CHAR	buf[260];
-	if (GetCurrentDirectoryA(sizeof(buf),buf)) {
-	    if (DOSFS_GetFullName( buf, TRUE, &full_name ))
-		unixdir = full_name.long_name;
-	}
+        char buf[MAX_PATH];
+        if (GetCurrentDirectoryA(sizeof(buf),buf))
+        {
+            if (DOSFS_GetFullName( buf, TRUE, &full_name ))
+                unixdir = full_name.long_name;
+        }
     }
 
-    if (hFile == -1)  /* unix process */
+    /* create the process on the server side */
+
+    SERVER_START_REQ
     {
-        unixfilename = filename;
-        if (DOSFS_GetFullName( filename, TRUE, &full_name )) unixfilename = full_name.long_name;
-        req->filename[0] = 0;
+        size_t len = (hFile == -1) ? 0 : MAX_PATH;
+        struct new_process_request *req = server_alloc_req( sizeof(*req), len );
+        req->inherit_all  = inherit;
+        req->create_flags = flags;
+        req->start_flags  = startup->dwFlags;
+        req->exe_file     = hFile;
+        if (startup->dwFlags & STARTF_USESTDHANDLES)
+        {
+            req->hstdin  = startup->hStdInput;
+            req->hstdout = startup->hStdOutput;
+            req->hstderr = startup->hStdError;
+        }
+        else
+        {
+            req->hstdin  = GetStdHandle( STD_INPUT_HANDLE );
+            req->hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
+            req->hstderr = GetStdHandle( STD_ERROR_HANDLE );
+        }
+        req->cmd_show = startup->wShowWindow;
+        req->alloc_fd = 0;
+
+        if (hFile == -1)  /* unix process */
+        {
+            unixfilename = filename;
+            if (DOSFS_GetFullName( filename, TRUE, &full_name ))
+                unixfilename = full_name.long_name;
+        }
+        else  /* new wine process */
+        {
+            if (!GetLongPathNameA( filename, server_data_ptr(req), MAX_PATH ))
+                lstrcpynA( server_data_ptr(req), filename, MAX_PATH );
+        }
+        ret = !server_call( REQ_NEW_PROCESS );
     }
-    else  /* new wine process */
-    {
-        if (!GetLongPathNameA( filename, req->filename, server_remaining(req->filename) ))
-            lstrcpynA( req->filename, filename, server_remaining(req->filename) );
-    }
-    if (server_call( REQ_NEW_PROCESS )) return FALSE;
+    SERVER_END_REQ;
+    if (!ret) return FALSE;
 
     /* fork and execute */
 
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 293b3d8..debf4fa 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -502,10 +502,11 @@
     BOOL ret;
     SERVER_START_REQ
     {
-        struct set_thread_context_request *req = server_alloc_req( sizeof(*req), 0 );
+        struct set_thread_context_request *req = server_alloc_req( sizeof(*req),
+                                                                   sizeof(*context) );
         req->handle = handle;
         req->flags = context->ContextFlags;
-        memcpy( &req->context, context, sizeof(*context) );
+        memcpy( server_data_ptr(req), context, sizeof(*context) );
         ret = !server_call( REQ_SET_THREAD_CONTEXT );
     }
     SERVER_END_REQ;
@@ -526,12 +527,13 @@
     BOOL ret;
     SERVER_START_REQ
     {
-        struct get_thread_context_request *req = server_alloc_req( sizeof(*req), 0 );
+        struct get_thread_context_request *req = server_alloc_req( sizeof(*req),
+                                                                   sizeof(*context) );
         req->handle = handle;
         req->flags = context->ContextFlags;
-        memcpy( &req->context, context, sizeof(*context) );
+        memcpy( server_data_ptr(req), context, sizeof(*context) );
         if ((ret = !server_call( REQ_GET_THREAD_CONTEXT )))
-            memcpy( context, &req->context, sizeof(*context) );
+            memcpy( context, server_data_ptr(req), sizeof(*context) );
     }
     SERVER_END_REQ;
     return ret;
diff --git a/server/console.c b/server/console.c
index 5c6fad8..e8526a2 100644
--- a/server/console.c
+++ b/server/console.c
@@ -300,16 +300,25 @@
 }
 
 /* retrieve a pointer to the console input records */
-static int read_console_input( int handle, int count, INPUT_RECORD *rec, int max, int flush )
+static int read_console_input( int handle, int count, INPUT_RECORD *rec, int flush )
 {
     struct console_input *console;
 
     if (!(console = (struct console_input *)get_handle_obj( current->process, handle,
                                                             GENERIC_READ, &console_input_ops )))
         return -1;
-    if ((count < 0) || (count > console->recnum)) count = console->recnum;
-    if (count > max) count = max;
-    memcpy( rec, console->records, count * sizeof(INPUT_RECORD) );
+
+    if (!count)
+    {
+        /* special case: do not retrieve anything, but return
+         * the total number of records available */
+        count = console->recnum;
+    }
+    else
+    {
+        if (count > console->recnum) count = console->recnum;
+        memcpy( rec, console->records, count * sizeof(INPUT_RECORD) );
+    }
     if (flush)
     {
         int i;
@@ -440,24 +449,30 @@
 /* set info about a console (output only) */
 DECL_HANDLER(set_console_info)
 {
-    size_t len = get_req_strlen( req, req->title );
-    set_console_info( req->handle, req, req->title, len );
+    set_console_info( req->handle, req, get_req_data(req), get_req_data_size(req) );
 }
 
 /* get info about a console (output only) */
 DECL_HANDLER(get_console_info)
 {
     struct screen_buffer *console;
-    req->title[0] = 0;
+    size_t len = 0;
+
     if ((console = (struct screen_buffer *)get_handle_obj( current->process, req->handle,
                                                            GENERIC_READ, &screen_buffer_ops )))
     {
         req->cursor_size    = console->cursor_size;
         req->cursor_visible = console->cursor_visible;
         req->pid            = console->pid;
-        if (console->title) strcpy( req->title, console->title );
+        if (console->title)
+        {
+            len = strlen( console->title );
+            if (len > get_req_data_size(req)) len = get_req_data_size(req);
+            memcpy( get_req_data(req), console->title, len );
+        }
         release_object( console );
     }
+    set_req_data_size( req, len );
 }
 
 /* set a console fd */
@@ -498,17 +513,16 @@
 /* add input records to a console input queue */
 DECL_HANDLER(write_console_input)
 {
-    int max = get_req_size( req, req + 1, sizeof(INPUT_RECORD) );
-    int count = req->count;
-
-    if (count > max) count = max;
-    req->written = write_console_input( req->handle, count, (INPUT_RECORD *)(req + 1) );
+    req->written = write_console_input( req->handle, get_req_data_size(req) / sizeof(INPUT_RECORD),
+                                        get_req_data(req) );
 }
 
 /* fetch input records from a console input queue */
 DECL_HANDLER(read_console_input)
 {
-    int max = get_req_size( req, req + 1, sizeof(INPUT_RECORD) );
-    req->read = read_console_input( req->handle, req->count, (INPUT_RECORD *)(req + 1),
-                                    max, req->flush );
+    size_t size = get_req_data_size(req) / sizeof(INPUT_RECORD);
+    int res = read_console_input( req->handle, size, get_req_data(req), req->flush );
+    /* if size was 0 we didn't fetch anything */
+    if (size) set_req_data_size( req, res * sizeof(INPUT_RECORD) );
+    req->read = res;
 }
diff --git a/server/context_i386.c b/server/context_i386.c
index 52ee132..0782e90 100644
--- a/server/context_i386.c
+++ b/server/context_i386.c
@@ -477,16 +477,21 @@
     struct thread *thread;
     int flags = req->flags & ~CONTEXT_i386;  /* get rid of CPU id */
 
+    if (get_req_data_size(req) < sizeof(CONTEXT))
+    {
+        set_error( STATUS_INVALID_PARAMETER );
+        return;
+    }
     if ((thread = get_thread_from_handle( req->handle, THREAD_GET_CONTEXT )))
     {
         if (thread->context)  /* thread is inside an exception event */
         {
-            copy_context( &req->context, thread->context, flags );
+            copy_context( get_req_data(req), thread->context, flags );
             flags &= CONTEXT_DEBUG_REGISTERS;
         }
         if (flags && suspend_for_ptrace( thread ))
         {
-            get_thread_context( thread, flags, &req->context );
+            get_thread_context( thread, flags, get_req_data(req) );
             resume_thread( thread );
         }
         release_object( thread );
@@ -500,16 +505,21 @@
     struct thread *thread;
     int flags = req->flags & ~CONTEXT_i386;  /* get rid of CPU id */
 
+    if (get_req_data_size(req) < sizeof(CONTEXT))
+    {
+        set_error( STATUS_INVALID_PARAMETER );
+        return;
+    }
     if ((thread = get_thread_from_handle( req->handle, THREAD_SET_CONTEXT )))
     {
         if (thread->context)  /* thread is inside an exception event */
         {
-            copy_context( thread->context, &req->context, flags );
+            copy_context( thread->context, get_req_data(req), flags );
             flags &= CONTEXT_DEBUG_REGISTERS;
         }
         if (flags && suspend_for_ptrace( thread ))
         {
-            set_thread_context( thread, flags, &req->context );
+            set_thread_context( thread, flags, get_req_data(req) );
             resume_thread( thread );
         }
         release_object( thread );
diff --git a/server/context_sparc.c b/server/context_sparc.c
index 2335120..0a63c12 100644
--- a/server/context_sparc.c
+++ b/server/context_sparc.c
@@ -159,16 +159,21 @@
     struct thread *thread;
     int flags = req->flags & ~CONTEXT_SPARC;  /* get rid of CPU id */
 
+    if (get_req_data_size(req) < sizeof(CONTEXT))
+    {
+        set_error( STATUS_INVALID_PARAMETER );
+        return;
+    }
     if ((thread = get_thread_from_handle( req->handle, THREAD_GET_CONTEXT )))
     {
         if (thread->context)  /* thread is inside an exception event */
         {
-            copy_context( &req->context, thread->context, flags );
+            copy_context( get_req_data(req), thread->context, flags );
             flags = 0;
         }
         if (flags && suspend_for_ptrace( thread ))
         {
-            get_thread_context( thread, flags, &req->context );
+            get_thread_context( thread, flags, get_req_data(req) );
             resume_thread( thread );
         }
         release_object( thread );
@@ -182,16 +187,21 @@
     struct thread *thread;
     int flags = req->flags & ~CONTEXT_SPARC;  /* get rid of CPU id */
 
+    if (get_req_data_size(req) < sizeof(CONTEXT))
+    {
+        set_error( STATUS_INVALID_PARAMETER );
+        return;
+    }
     if ((thread = get_thread_from_handle( req->handle, THREAD_SET_CONTEXT )))
     {
         if (thread->context)  /* thread is inside an exception event */
         {
-            copy_context( thread->context, &req->context, flags );
+            copy_context( thread->context, get_req_data(req), flags );
             flags = 0;
         }
         if (flags && suspend_for_ptrace( thread ))
         {
-            set_thread_context( thread, flags, &req->context );
+            set_thread_context( thread, flags, get_req_data(req) );
             resume_thread( thread );
         }
         release_object( thread );
diff --git a/server/debugger.c b/server/debugger.c
index 371e304..946d659 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -593,13 +593,20 @@
     {
         struct debug_event_exception data;
         struct debug_event *event;
+        CONTEXT *context = get_req_data( req );
+        EXCEPTION_RECORD *rec = (EXCEPTION_RECORD *)(context + 1);
 
-        data.record = req->record;
+        if (get_req_data_size( req ) < sizeof(*rec) + sizeof(*context))
+        {
+            set_error( STATUS_INVALID_PARAMETER );
+            return;
+        }
+        data.record = *rec;
         data.first  = req->first;
         if ((event = queue_debug_event( current, EXCEPTION_DEBUG_EVENT, &data )))
         {
             struct object *obj = &event->obj;
-            current->context = &req->context;
+            current->context = context;
             sleep_on( 1, &obj, 0, -1, build_exception_event_reply );
             release_object( event );
         }
diff --git a/server/file.c b/server/file.c
index f12e4f4..61a3dd3 100644
--- a/server/file.c
+++ b/server/file.c
@@ -450,11 +450,10 @@
 /* create a file */
 DECL_HANDLER(create_file)
 {
-    size_t len = get_req_strlen( req, req->name );
     struct file *file;
 
     req->handle = -1;
-    if ((file = create_file( req->name, len, req->access,
+    if ((file = create_file( get_req_data(req), get_req_data_size(req), req->access,
                              req->sharing, req->create, req->attrs )))
     {
         req->handle = alloc_handle( current->process, file, req->access, req->inherit );
diff --git a/server/process.c b/server/process.c
index 9af7637..4376d3d 100644
--- a/server/process.c
+++ b/server/process.c
@@ -259,9 +259,12 @@
 
     if (info)
     {
+        size_t size = strlen(info->filename);
+        if (size > get_req_data_size(req)) size = get_req_data_size(req);
         req->start_flags = info->start_flags;
         req->cmd_show    = info->cmd_show;
-        strcpy( req->filename, info->filename );
+        memcpy( get_req_data(req), info->filename, size );
+        set_req_data_size( req, size );
         info->process = (struct process *)grab_object( process );
         info->thread  = (struct thread *)grab_object( current );
         wake_up( &info->obj, 0 );
@@ -270,7 +273,7 @@
     {
         req->start_flags  = STARTF_USESTDHANDLES;
         req->cmd_show     = 0;
-        req->filename[0]  = 0;
+        set_req_data_size( req, 0 );
     }
  error:
 }
@@ -711,7 +714,7 @@
 /* create a new process */
 DECL_HANDLER(new_process)
 {
-    size_t len = get_req_strlen( req, req->filename );
+    size_t len = get_req_data_size( req );
     struct startup_info *info;
     int sock[2];
 
@@ -742,11 +745,12 @@
         return;
     }
 
-    if (!(info->filename = memdup( req->filename, len+1 )))
+    if (!(info->filename = mem_alloc( len + 1 )))
     {
         release_object( info );
         return;
     }
+    memcpy( info->filename, get_req_data(req), len );
     info->filename[len] = 0;
 
     if (req->alloc_fd)
diff --git a/server/sock.c b/server/sock.c
index 1efdbfd..043b044 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -486,6 +486,7 @@
 DECL_HANDLER(get_socket_event)
 {
     struct sock *sock;
+    size_t size;
 
     sock=(struct sock*)get_handle_obj(current->process,req->handle,GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
     if (!sock)
@@ -499,8 +500,10 @@
     req->mask    = sock->mask;
     req->pmask   = sock->pmask;
     req->state   = sock->state;
-    memcpy(req->errors, sock->errors, sizeof(sock->errors));
-    clear_error();
+    size = min( get_req_data_size(req), sizeof(sock->errors) );
+    memcpy( get_req_data(req), sock->errors, size );
+    set_req_data_size( req, size );
+
     if (req->service)
     {
         if (req->s_event)
diff --git a/server/trace.c b/server/trace.c
index c6b5e91..89b0998 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -10,23 +10,14 @@
 #include <sys/uio.h>
 #include "winsock2.h"
 #include "winnt.h"
+#include "winbase.h"
+#include "wincon.h"
 #include "request.h"
 #include "unicode.h"
 
 
 /* utility functions */
 
-static void dump_ints( const int *ptr, int len )
-{
-    fputc( '{', stderr );
-    while (len > 0)
-    {
-        fprintf( stderr, "%d", *ptr++ );
-        if (--len) fputc( ',', stderr );
-    }
-    fputc( '}', stderr );
-}
-
 static void dump_uints( const int *ptr, int len )
 {
     fputc( '{', stderr );
@@ -68,25 +59,7 @@
     dump_unicode_string( req, *path );
 }
 
-static void dump_context( const void *req, const CONTEXT *context )
-{
-#ifdef __i386__
-    fprintf( stderr, "{flags=%08lx,eax=%08lx,ebx=%08lx,ecx=%08lx,edx=%08lx,esi=%08lx,edi=%08lx,"
-             "ebp=%08lx,eip=%08lx,esp=%08lx,eflags=%08lx,cs=%04lx,ds=%04lx,es=%04lx,"
-             "fs=%04lx,gs=%04lx,dr0=%08lx,dr1=%08lx,dr2=%08lx,dr3=%08lx,dr6=%08lx,dr7=%08lx,",
-             context->ContextFlags, context->Eax, context->Ebx, context->Ecx, context->Edx,
-             context->Esi, context->Edi, context->Ebp, context->Eip, context->Esp, context->EFlags,
-             context->SegCs, context->SegDs, context->SegEs, context->SegFs, context->SegGs,
-             context->Dr0, context->Dr1, context->Dr2, context->Dr3, context->Dr6, context->Dr7 );
-    fprintf( stderr, "float=" );
-    dump_uints( (int *)&context->FloatSave, sizeof(context->FloatSave) / sizeof(int) );
-    fprintf( stderr, "}" );
-#else
-    dump_uints( (int *)context, sizeof(*context) / sizeof(int) );
-#endif
-}
-
-static void dump_exc_record( const void *req, const EXCEPTION_RECORD *rec )
+static void dump_exc_record( const EXCEPTION_RECORD *rec )
 {
     int i;
     fprintf( stderr, "{code=%lx,flags=%lx,rec=%p,addr=%p,params={",
@@ -128,6 +101,11 @@
     fputc( '}', stderr );
 }
 
+static void dump_varargs_string( const void *ptr, size_t len )
+{
+    fprintf( stderr, "\"%.*s\"", (int)len, (char *)ptr );
+}
+
 static void dump_varargs_unicode_str( const void *ptr, size_t len )
 {
     fprintf( stderr, "L\"" );
@@ -135,15 +113,48 @@
     fputc( '\"', stderr );
 }
 
+static void dump_varargs_context( const void *ptr, size_t len )
+{
+    const CONTEXT *context = ptr;
+#ifdef __i386__
+    fprintf( stderr, "{flags=%08lx,eax=%08lx,ebx=%08lx,ecx=%08lx,edx=%08lx,esi=%08lx,edi=%08lx,"
+             "ebp=%08lx,eip=%08lx,esp=%08lx,eflags=%08lx,cs=%04lx,ds=%04lx,es=%04lx,"
+             "fs=%04lx,gs=%04lx,dr0=%08lx,dr1=%08lx,dr2=%08lx,dr3=%08lx,dr6=%08lx,dr7=%08lx,",
+             context->ContextFlags, context->Eax, context->Ebx, context->Ecx, context->Edx,
+             context->Esi, context->Edi, context->Ebp, context->Eip, context->Esp, context->EFlags,
+             context->SegCs, context->SegDs, context->SegEs, context->SegFs, context->SegGs,
+             context->Dr0, context->Dr1, context->Dr2, context->Dr3, context->Dr6, context->Dr7 );
+    fprintf( stderr, "float=" );
+    dump_uints( (int *)&context->FloatSave, sizeof(context->FloatSave) / sizeof(int) );
+    fprintf( stderr, "}" );
+#else
+    dump_uints( (int *)context, sizeof(*context) / sizeof(int) );
+#endif
+}
+
+static void dump_varargs_exc_event( const void *ptr, size_t len )
+{
+    fprintf( stderr, "{context=" );
+    dump_varargs_context( ptr, sizeof(CONTEXT) );
+    fprintf( stderr, ",rec=" );
+    dump_exc_record( (EXCEPTION_RECORD *)((CONTEXT *)ptr + 1) );
+    fputc( '}', stderr );
+}
+
 static void dump_varargs_debug_event( const void *ptr, size_t len )
 {
     const debug_event_t *event = ptr;
 
+    if (!len)
+    {
+        fprintf( stderr, "{}" );
+        return;
+    }
     switch(event->code)
     {
     case EXCEPTION_DEBUG_EVENT:
         fprintf( stderr, "{exception," );
-        dump_exc_record( ptr, &event->info.exception.record );
+        dump_exc_record( &event->info.exception.record );
         fprintf( stderr, ",first=%d}", event->info.exception.first );
         break;
     case CREATE_THREAD_DEBUG_EVENT:
@@ -193,13 +204,23 @@
     }
 }
 
-/* dumping for functions for requests that have a variable part */
-
-static void dump_varargs_get_socket_event_reply( const struct get_socket_event_request *req )
+static void dump_varargs_input_records( const void *ptr, size_t len )
 {
-    dump_ints( req->errors, FD_MAX_EVENTS );
+    const INPUT_RECORD *rec = ptr;
+    len /= sizeof(*rec);
+
+    fputc( '{', stderr );
+    while (len > 0)
+    {
+        fprintf( stderr, "{%04x,...}", rec->EventType );
+        rec++;
+        if (--len) fputc( ',', stderr );
+    }
+    fputc( '}', stderr );
 }
 
+/* dumping for functions for requests that have a variable part */
+
 static void dump_varargs_read_process_memory_reply( const struct read_process_memory_request *req )
 {
     int count = min( req->len, get_req_size( req, req->data, sizeof(int) ));
@@ -247,7 +268,7 @@
     fprintf( stderr, " cmd_show=%d,", req->cmd_show );
     fprintf( stderr, " alloc_fd=%d,", req->alloc_fd );
     fprintf( stderr, " filename=" );
-    dump_string( req, req->filename );
+    dump_varargs_string( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_wait_process_request( const struct wait_process_request *req )
@@ -300,7 +321,7 @@
     fprintf( stderr, " hstderr=%d,", req->hstderr );
     fprintf( stderr, " cmd_show=%d,", req->cmd_show );
     fprintf( stderr, " filename=" );
-    dump_string( req, req->filename );
+    dump_varargs_string( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_init_process_done_request( const struct init_process_done_request *req )
@@ -627,8 +648,8 @@
     fprintf( stderr, " sharing=%08x,", req->sharing );
     fprintf( stderr, " create=%d,", req->create );
     fprintf( stderr, " attrs=%08x,", req->attrs );
-    fprintf( stderr, " name=" );
-    dump_string( req, req->name );
+    fprintf( stderr, " filename=" );
+    dump_varargs_string( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_create_file_reply( const struct create_file_request *req )
@@ -782,7 +803,7 @@
     fprintf( stderr, " pmask=%08x,", req->pmask );
     fprintf( stderr, " state=%08x,", req->state );
     fprintf( stderr, " errors=" );
-    dump_varargs_get_socket_event_reply( req );
+    dump_varargs_ints( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_enable_socket_event_request( const struct enable_socket_event_request *req )
@@ -851,7 +872,7 @@
     fprintf( stderr, " cursor_size=%d,", req->cursor_size );
     fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
     fprintf( stderr, " title=" );
-    dump_string( req, req->title );
+    dump_varargs_string( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_get_console_info_request( const struct get_console_info_request *req )
@@ -865,13 +886,14 @@
     fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
     fprintf( stderr, " pid=%d,", req->pid );
     fprintf( stderr, " title=" );
-    dump_string( req, req->title );
+    dump_varargs_string( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_write_console_input_request( const struct write_console_input_request *req )
 {
     fprintf( stderr, " handle=%d,", req->handle );
-    fprintf( stderr, " count=%d", req->count );
+    fprintf( stderr, " rec=" );
+    dump_varargs_input_records( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_write_console_input_reply( const struct write_console_input_request *req )
@@ -882,13 +904,14 @@
 static void dump_read_console_input_request( const struct read_console_input_request *req )
 {
     fprintf( stderr, " handle=%d,", req->handle );
-    fprintf( stderr, " count=%d,", req->count );
     fprintf( stderr, " flush=%d", req->flush );
 }
 
 static void dump_read_console_input_reply( const struct read_console_input_request *req )
 {
-    fprintf( stderr, " read=%d", req->read );
+    fprintf( stderr, " read=%d,", req->read );
+    fprintf( stderr, " rec=" );
+    dump_varargs_input_records( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_create_change_notification_request( const struct create_change_notification_request *req )
@@ -1027,17 +1050,16 @@
 
 static void dump_exception_event_request( const struct exception_event_request *req )
 {
-    fprintf( stderr, " record=" );
-    dump_exc_record( req, &req->record );
-    fprintf( stderr, "," );
     fprintf( stderr, " first=%d,", req->first );
-    fprintf( stderr, " context=" );
-    dump_context( req, &req->context );
+    fprintf( stderr, " record=" );
+    dump_varargs_exc_event( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_exception_event_reply( const struct exception_event_request *req )
 {
-    fprintf( stderr, " status=%d", req->status );
+    fprintf( stderr, " status=%d,", req->status );
+    fprintf( stderr, " context=" );
+    dump_varargs_context( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_output_debug_string_request( const struct output_debug_string_request *req )
@@ -1297,7 +1319,7 @@
 static void dump_get_thread_context_reply( const struct get_thread_context_request *req )
 {
     fprintf( stderr, " context=" );
-    dump_context( req, &req->context );
+    dump_varargs_context( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_set_thread_context_request( const struct set_thread_context_request *req )
@@ -1305,7 +1327,7 @@
     fprintf( stderr, " handle=%d,", req->handle );
     fprintf( stderr, " flags=%08x,", req->flags );
     fprintf( stderr, " context=" );
-    dump_context( req, &req->context );
+    dump_varargs_context( get_req_data(req), get_req_data_size(req) );
 }
 
 static void dump_get_selector_entry_request( const struct get_selector_entry_request *req )
diff --git a/tools/make_requests b/tools/make_requests
index 7dcad4e..a0f07b1 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -15,11 +15,8 @@
     "void*"         => "%p",
     "time_t"        => "%ld",
     "path_t"        => "&dump_path_t",
-    "debug_event_t" => "&dump_debug_event_t",
-    "CONTEXT"       => "&dump_context",
-    "EXCEPTION_RECORD" => "&dump_exc_record",
-    "char[1]"          => "&dump_string",
-    "WCHAR[1]"         => "&dump_unicode_string"
+    "char[1]"       => "&dump_string",
+    "WCHAR[1]"      => "&dump_unicode_string"
 );
 
 my @requests = ();
diff --git a/win32/console.c b/win32/console.c
index 03728ae..2d6f45e 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -65,10 +65,15 @@
  */
 static int CONSOLE_GetPid( HANDLE handle )
 {
-    struct get_console_info_request *req = get_req_buffer();
-    req->handle = handle;
-    if (server_call( REQ_GET_CONSOLE_INFO )) return 0;
-    return req->pid;
+    int ret = 0;
+    SERVER_START_REQ
+    {
+        struct get_console_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle = handle;
+        if (!server_call( REQ_GET_CONSOLE_INFO )) ret = req->pid;
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 /****************************************************************************
@@ -295,6 +300,36 @@
     HeapFree(GetProcessHeap(),0,buf);
 }
 
+
+/******************************************************************************
+ * read_console_input
+ *
+ * Helper function for ReadConsole, ReadConsoleInput and PeekConsoleInput
+ */
+static BOOL read_console_input( HANDLE handle, LPINPUT_RECORD buffer, DWORD count,
+                                LPDWORD read, BOOL flush )
+{
+    BOOL ret;
+
+    count = min( count, REQUEST_MAX_VAR_SIZE/sizeof(INPUT_RECORD) );
+
+    SERVER_START_REQ
+    {
+        struct read_console_input_request *req = server_alloc_req( sizeof(*req),
+                                                                   count*sizeof(INPUT_RECORD) );
+        req->handle = handle;
+        req->flush = flush;
+        if ((ret = !server_call( REQ_READ_CONSOLE_INPUT )))
+        {
+            if (count) memcpy( buffer, server_data_ptr(req), server_data_size(req) );
+            if (read) *read = req->read;
+        }
+    }
+    SERVER_END_REQ;
+    return ret;
+}
+
+
 /******************************************************************************
  * SetConsoleCtrlHandler [KERNEL32.459]  Adds function to calling process list
  *
@@ -475,7 +510,14 @@
  */
 BOOL WINAPI FreeConsole(VOID)
 {
-    return !server_call( REQ_FREE_CONSOLE );
+    BOOL ret;
+    SERVER_START_REQ
+    {
+        struct free_console_request *req = server_alloc_req( sizeof(*req), 0 );
+        ret = !server_call( REQ_FREE_CONSOLE );
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 
@@ -487,13 +529,18 @@
 HANDLE CONSOLE_OpenHandle( BOOL output, DWORD access, LPSECURITY_ATTRIBUTES sa )
 {
     int ret = -1;
-    struct open_console_request *req = get_req_buffer();
 
-    req->output  = output;
-    req->access  = access;
-    req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-    SetLastError(0);
-    if (!server_call( REQ_OPEN_CONSOLE )) ret = req->handle;
+    SERVER_START_REQ
+    {
+        struct open_console_request *req = server_alloc_req( sizeof(*req), 0 );
+
+        req->output  = output;
+        req->access  = access;
+        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
+        SetLastError(0);
+        if (!server_call( REQ_OPEN_CONSOLE )) ret = req->handle;
+    }
+    SERVER_END_REQ;
     return ret;
 }
 
@@ -514,7 +561,6 @@
  */
 static BOOL CONSOLE_make_complex(HANDLE handle)
 {
-        struct set_console_fd_request *req = get_req_buffer();
 	struct termios term;
 	char buf[256];
 	char c = '\0';
@@ -563,10 +609,15 @@
             CloseHandle( pty_handle );
             return FALSE;
 	}
-        req->handle = handle;
-        req->file_handle = pty_handle;
-        req->pid = xpid;
-        server_call( REQ_SET_CONSOLE_FD );
+        SERVER_START_REQ
+        {
+            struct set_console_fd_request *req = server_alloc_req( sizeof(*req), 0 );
+            req->handle = handle;
+            req->file_handle = pty_handle;
+            req->pid = xpid;
+            server_call( REQ_SET_CONSOLE_FD );
+        }
+        SERVER_END_REQ;
         CloseHandle( pty_handle );
 
 	/* enable mouseclicks */
@@ -591,18 +642,26 @@
  */
 BOOL WINAPI AllocConsole(VOID)
 {
-    struct alloc_console_request *req = get_req_buffer();
+    BOOL ret;
     HANDLE hStderr;
     int handle_in, handle_out;
 
     TRACE("()\n");
-    req->access  = GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE;
-    req->inherit = FALSE;
-    if (server_call( REQ_ALLOC_CONSOLE )) return FALSE;
-    handle_in = req->handle_in;
-    handle_out = req->handle_out;
 
-    if (!DuplicateHandle( GetCurrentProcess(), req->handle_out, GetCurrentProcess(), &hStderr,
+    SERVER_START_REQ
+    {
+        struct alloc_console_request *req = server_alloc_req( sizeof(*req), 0 );
+
+        req->access  = GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE;
+        req->inherit = FALSE;
+        ret = !server_call( REQ_ALLOC_CONSOLE );
+        handle_in = req->handle_in;
+        handle_out = req->handle_out;
+    }
+    SERVER_END_REQ;
+    if (!ret) return FALSE;
+
+    if (!DuplicateHandle( GetCurrentProcess(), handle_out, GetCurrentProcess(), &hStderr,
                           0, TRUE, DUPLICATE_SAME_ACCESS ))
     {
         CloseHandle( handle_in );
@@ -708,19 +767,26 @@
  */
 DWORD WINAPI GetConsoleTitleA(LPSTR title,DWORD size)
 {
-    struct get_console_info_request *req = get_req_buffer();
     DWORD ret = 0;
     HANDLE hcon;
 
     if ((hcon = CreateFileA( "CONOUT$", GENERIC_READ, 0, NULL,
                                OPEN_EXISTING, 0, 0 )) == INVALID_HANDLE_VALUE)
         return 0;
-    req->handle = hcon;
-    if (!server_call( REQ_GET_CONSOLE_INFO ))
+    SERVER_START_REQ
     {
-        lstrcpynA( title, req->title, size );
-        ret = strlen(req->title);
+        struct get_console_info_request *req = server_alloc_req( sizeof(*req),
+                                                                 REQUEST_MAX_VAR_SIZE );
+        req->handle = hcon;
+        if (!server_call( REQ_GET_CONSOLE_INFO ))
+        {
+            ret = server_data_size(req);
+            size = min( size-1, ret );
+            memcpy( title, server_data_ptr(req), size );
+            title[size] = 0;
+        }
     }
+    SERVER_END_REQ;
     CloseHandle( hcon );
     return ret;
 }
@@ -940,7 +1006,6 @@
 {
     int		charsread = 0;
     LPSTR	xbuf = (LPSTR)lpBuffer;
-    LPINPUT_RECORD	ir;
 
     TRACE("(%d,%p,%ld,%p,%p)\n",
 	    hConsoleInput,lpBuffer,nNumberOfCharsToRead,
@@ -952,19 +1017,14 @@
     /* FIXME: should we read at least 1 char? The SDK does not say */
     while (charsread<nNumberOfCharsToRead)
     {
-        struct read_console_input_request *req = get_req_buffer();
-        req->handle = hConsoleInput;
-        req->count = 1;
-        req->flush = 1;
-        if (server_call( REQ_READ_CONSOLE_INPUT )) return FALSE;
-        if (!req->read) break;
-	ir = (LPINPUT_RECORD)(req+1);
-    	if (!ir->Event.KeyEvent.bKeyDown)
-		continue;
-    	if (ir->EventType != KEY_EVENT)
-		continue;
-	*xbuf++ = ir->Event.KeyEvent.uChar.AsciiChar; 
-	charsread++;
+        INPUT_RECORD ir;
+        DWORD count;
+        if (!read_console_input( hConsoleInput, &ir, 1, &count, TRUE )) return FALSE;
+        if (!count) break;
+        if (ir.EventType != KEY_EVENT) continue;
+        if (!ir.Event.KeyEvent.bKeyDown) continue;
+        *xbuf++ = ir.Event.KeyEvent.uChar.AsciiChar;
+        charsread++;
     }
     if (lpNumberOfCharsRead)
     	*lpNumberOfCharsRead = charsread;
@@ -1013,22 +1073,25 @@
 BOOL WINAPI ReadConsoleInputA(HANDLE hConsoleInput, LPINPUT_RECORD lpBuffer,
                               DWORD nLength, LPDWORD lpNumberOfEventsRead)
 {
-    struct read_console_input_request *req = get_req_buffer();
+    if (!nLength)
+    {
+        if (lpNumberOfEventsRead) *lpNumberOfEventsRead = 0;
+        return TRUE;
+    }
 
     /* loop until we get at least one event */
     for (;;)
     {
-        req->handle = hConsoleInput;
-        req->count = nLength;
-        req->flush = 1;
-        if (server_call( REQ_READ_CONSOLE_INPUT )) return FALSE;
-        if (req->read)
+        DWORD count;
+        BOOL ret = read_console_input( hConsoleInput, lpBuffer, nLength, &count, TRUE );
+
+        if (!ret) return FALSE;
+        if (count)
         {
-            memcpy( lpBuffer, req + 1, req->read * sizeof(*lpBuffer) );
-            if (lpNumberOfEventsRead) *lpNumberOfEventsRead = req->read;
+            if (lpNumberOfEventsRead) *lpNumberOfEventsRead = count;
             return TRUE;
         }
-	CONSOLE_get_input(hConsoleInput,TRUE);
+        CONSOLE_get_input(hConsoleInput,TRUE);
         /*WaitForSingleObject( hConsoleInput, INFINITE32 );*/
     }
 }
@@ -1050,11 +1113,7 @@
  */
 BOOL WINAPI FlushConsoleInputBuffer( HANDLE handle )
 {
-    struct read_console_input_request *req = get_req_buffer();
-    req->handle = handle;
-    req->count = -1;  /* get all records */
-    req->flush = 1;
-    return !server_call( REQ_READ_CONSOLE_INPUT );
+    return read_console_input( handle, NULL, 0, NULL, TRUE );
 }
 
 
@@ -1065,20 +1124,15 @@
  *
  * Does not need a complex console.
  */
-BOOL WINAPI PeekConsoleInputA( HANDLE handle, LPINPUT_RECORD buffer,
-                                   DWORD count, LPDWORD read )
+BOOL WINAPI PeekConsoleInputA( HANDLE handle, LPINPUT_RECORD buffer, DWORD count, LPDWORD read )
 {
-    struct read_console_input_request *req = get_req_buffer();
-
     CONSOLE_get_input(handle,FALSE);
-
-    req->handle = handle;
-    req->count = count;
-    req->flush = 0;
-    if (server_call( REQ_READ_CONSOLE_INPUT )) return FALSE;
-    if (req->read) memcpy( buffer, req + 1, req->read * sizeof(*buffer) );
-    if (read) *read = req->read;
-    return TRUE;
+    if (!count)
+    {
+        if (read) *read = 0;
+        return TRUE;
+    }
+    return read_console_input( handle, buffer, count, read, FALSE );
 }
 
 
@@ -1102,22 +1156,28 @@
 BOOL WINAPI WriteConsoleInputA( HANDLE handle, INPUT_RECORD *buffer,
                                 DWORD count, LPDWORD written )
 {
-    struct write_console_input_request *req = get_req_buffer();
-    const DWORD max = server_remaining( req + 1 ) / sizeof(INPUT_RECORD);
+    BOOL ret = TRUE;
 
     if (written) *written = 0;
-    while (count)
+    while (count && ret)
     {
-        DWORD len = count < max ? count : max;
-        req->count = len;
-        req->handle = handle;
-        memcpy( req + 1, buffer, len * sizeof(*buffer) );
-        if (server_call( REQ_WRITE_CONSOLE_INPUT )) return FALSE;
-        if (written) *written += req->written;
-        count -= len;
-        buffer += len;
+        DWORD len = min( count, REQUEST_MAX_VAR_SIZE/sizeof(INPUT_RECORD) );
+        SERVER_START_REQ
+        {
+            struct write_console_input_request *req = server_alloc_req( sizeof(*req),
+                                                                        len*sizeof(INPUT_RECORD) );
+            req->handle = handle;
+            memcpy( server_data_ptr(req), buffer, len * sizeof(INPUT_RECORD) );
+            if ((ret = !server_call( REQ_WRITE_CONSOLE_INPUT )))
+            {
+                if (written) *written += req->written;
+                count -= len;
+                buffer += len;
+            }
+        }
+        SERVER_END_REQ;
     }
-    return TRUE;
+    return ret;
 }
 
 /******************************************************************************
@@ -1145,18 +1205,27 @@
  */
 BOOL WINAPI SetConsoleTitleA(LPCSTR title)
 {
-    struct set_console_info_request *req = get_req_buffer();
+    size_t len = strlen(title);
     HANDLE hcon;
     DWORD written;
+    BOOL ret;
 
     if ((hcon = CreateFileA( "CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL,
                                OPEN_EXISTING, 0, 0 )) == INVALID_HANDLE_VALUE)
         return FALSE;
-    req->handle = hcon;
-    req->mask = SET_CONSOLE_INFO_TITLE;
-    lstrcpynA( req->title, title, server_remaining(req->title) );
-    if (server_call( REQ_SET_CONSOLE_INFO )) goto error;
-    if (CONSOLE_GetPid( hcon ))
+
+    len = min( len, REQUEST_MAX_VAR_SIZE );
+    SERVER_START_REQ
+    {
+        struct set_console_info_request *req = server_alloc_req( sizeof(*req), len );
+        req->handle = hcon;
+        req->mask = SET_CONSOLE_INFO_TITLE;
+        memcpy( server_data_ptr(req), title, len );
+        ret = !server_call( REQ_SET_CONSOLE_INFO );
+    }
+    SERVER_END_REQ;
+
+    if (ret && CONSOLE_GetPid( hcon ))
     {
         /* only set title for complex console (own xterm) */
         WriteFile( hcon, "\033]2;", 4, &written, NULL );
@@ -1164,10 +1233,7 @@
         WriteFile( hcon, "\a", 1, &written, NULL );
     }
     CloseHandle( hcon );
-    return TRUE;
- error:
-    CloseHandle( hcon );
-    return FALSE;
+    return ret;
 }
 
 
@@ -1231,16 +1297,7 @@
  */
 BOOL WINAPI GetNumberOfConsoleInputEvents(HANDLE hcon,LPDWORD nrofevents)
 {
-    struct read_console_input_request *req = get_req_buffer();
-
-    CONSOLE_get_input(hcon,FALSE);
-
-    req->handle = hcon;
-    req->count = -1;
-    req->flush = 0;
-    if (server_call( REQ_READ_CONSOLE_INPUT )) return FALSE;
-    if (nrofevents) *nrofevents = req->read;
-    return TRUE;
+    return read_console_input( hcon, NULL, 0, nrofevents, FALSE );
 }
 
 /***********************************************************************
@@ -1266,15 +1323,21 @@
  */
 BOOL WINAPI GetConsoleCursorInfo( HANDLE hcon, LPCONSOLE_CURSOR_INFO cinfo )
 {
-    struct get_console_info_request *req = get_req_buffer();
-    req->handle = hcon;
-    if (server_call( REQ_GET_CONSOLE_INFO )) return FALSE;
-    if (cinfo)
+    BOOL ret;
+
+    SERVER_START_REQ
     {
-        cinfo->dwSize = req->cursor_size;
-        cinfo->bVisible = req->cursor_visible;
+        struct get_console_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle = hcon;
+        ret = !server_call( REQ_GET_CONSOLE_INFO );
+        if (ret && cinfo)
+        {
+            cinfo->dwSize = req->cursor_size;
+            cinfo->bVisible = req->cursor_visible;
+        }
     }
-    return TRUE;
+    SERVER_END_REQ;
+    return ret;
 }
 
 
@@ -1289,19 +1352,25 @@
     HANDLE hcon,                /* [in] Handle to console screen buffer */
     LPCONSOLE_CURSOR_INFO cinfo)  /* [in] Address of cursor information */
 {
-    struct set_console_info_request *req = get_req_buffer();
     char	buf[8];
     DWORD	xlen;
+    BOOL ret;
 
     CONSOLE_make_complex(hcon);
     sprintf(buf,"\033[?25%c",cinfo->bVisible?'h':'l');
     WriteFile(hcon,buf,strlen(buf),&xlen,NULL);
 
-    req->handle         = hcon;
-    req->cursor_size    = cinfo->dwSize;
-    req->cursor_visible = cinfo->bVisible;
-    req->mask           = SET_CONSOLE_INFO_CURSOR;
-    return !server_call( REQ_SET_CONSOLE_INFO );
+    SERVER_START_REQ
+    {
+        struct set_console_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle         = hcon;
+        req->cursor_size    = cinfo->dwSize;
+        req->cursor_visible = cinfo->bVisible;
+        req->mask           = SET_CONSOLE_INFO_CURSOR;
+        ret = !server_call( REQ_SET_CONSOLE_INFO );
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 
diff --git a/win32/except.c b/win32/except.c
index df12c22..82f3f44 100644
--- a/win32/except.c
+++ b/win32/except.c
@@ -68,30 +68,40 @@
  */
 DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers)
 {
-    struct exception_event_request *req = get_req_buffer();
     PDB*		pdb = PROCESS_Current();
     char 		format[256];
     char 		buffer[256];
     HKEY		hDbgConf;
     DWORD		bAuto = FALSE;
     DWORD		ret = EXCEPTION_EXECUTE_HANDLER;
+    int status;
 
     /* send a last chance event to the debugger */
-    req->record  = *epointers->ExceptionRecord;
-    req->first   = 0;
-    req->context = *epointers->ContextRecord;
-    if (!server_call_noerr( REQ_EXCEPTION_EVENT )) *epointers->ContextRecord = req->context;
-    switch (req->status)
+    SERVER_START_REQ
+    {
+        struct exception_event_request *req = server_alloc_req( sizeof(*req),
+                                                  sizeof(EXCEPTION_RECORD)+sizeof(CONTEXT) );
+        CONTEXT *context_ptr = server_data_ptr(req);
+        EXCEPTION_RECORD *rec_ptr = (EXCEPTION_RECORD *)(context_ptr + 1);
+        req->first   = 0;
+        *rec_ptr     = *epointers->ExceptionRecord;
+        *context_ptr = *epointers->ContextRecord;
+        if (!server_call_noerr( REQ_EXCEPTION_EVENT )) *epointers->ContextRecord = *context_ptr;
+        status = req->status;
+    }
+    SERVER_END_REQ;
+
+    switch (status)
     {
     case DBG_CONTINUE: 
-       return EXCEPTION_CONTINUE_EXECUTION;
+        return EXCEPTION_CONTINUE_EXECUTION;
     case DBG_EXCEPTION_NOT_HANDLED: 
-       TerminateProcess( GetCurrentProcess(), epointers->ExceptionRecord->ExceptionCode );
-       break; /* not reached */
+        TerminateProcess( GetCurrentProcess(), epointers->ExceptionRecord->ExceptionCode );
+        break; /* not reached */
     case 0: /* no debugger is present */
-       break;
+        break;
     default: 	
-       FIXME("Unsupported yet debug continue value %d (please report)\n", req->status);
+        FIXME("Unsupported yet debug continue value %d (please report)\n", status);
     }
 
     if (pdb->top_filter)
