Converted a few more server requests to the new mechanism.

diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 26aa450..24560e2 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -43,30 +43,6 @@
     return (type == REG_SZ) || (type == REG_EXPAND_SZ) || (type == REG_MULTI_SZ);
 }
 
-/* copy a key name into the request buffer */
-static inline DWORD copy_nameW( LPWSTR dest, LPCWSTR name )
-{
-    if (name)
-    {
-        if (strlenW(name) > MAX_PATH) return ERROR_MORE_DATA;
-        strcpyW( dest, name );
-    }
-    else dest[0] = 0;
-    return ERROR_SUCCESS;
-}
-
-/* copy a key name into the request buffer */
-static inline DWORD copy_nameAtoW( LPWSTR dest, LPCSTR name )
-{
-    if (name)
-    {
-        if (strlen(name) > MAX_PATH) return ERROR_MORE_DATA;
-        lstrcpyAtoW( dest, name );
-    }
-    else dest[0] = 0;
-    return ERROR_SUCCESS;
-}
-
 /* do a server call without setting the last error code */
 static inline int reg_server_call( enum request req )
 {
@@ -856,7 +832,7 @@
  *           RegQueryValueExA   [ADVAPI32.157]
  *
  * NOTES:
- * the documentation is wrong: if the buffer is to small it remains untouched 
+ * the documentation is wrong: if the buffer is too small it remains untouched 
  */
 DWORD WINAPI RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWORD type,
                                LPBYTE data, LPDWORD count )
@@ -923,7 +899,11 @@
                 }
                 total_size = len + info_size;
             }
-            else if (data) memcpy( data, buf_ptr + info_size, total_size - info_size );
+            else if (data)
+            {
+                if (total_size - info_size > *count) status = STATUS_BUFFER_OVERFLOW;
+                else memcpy( data, buf_ptr + info_size, total_size - info_size );
+            }
         }
         else if (status != STATUS_BUFFER_OVERFLOW) goto done;
     }
@@ -1164,25 +1144,33 @@
  */
 LONG WINAPI RegLoadKeyW( HKEY hkey, LPCWSTR subkey, LPCWSTR filename )
 {
-    struct load_registry_request *req = get_req_buffer();
     HANDLE file;
-    DWORD ret, err = GetLastError();
+    DWORD ret, len, err = GetLastError();
 
     TRACE( "(%x,%s,%s)\n", hkey, debugstr_w(subkey), debugstr_w(filename) );
 
     if (!filename || !*filename) return ERROR_INVALID_PARAMETER;
     if (!subkey || !*subkey) return ERROR_INVALID_PARAMETER;
 
+    len = strlenW( subkey ) * sizeof(WCHAR);
+    if (len > MAX_PATH*sizeof(WCHAR)) return ERROR_INVALID_PARAMETER;
+
     if ((file = CreateFileW( filename, GENERIC_READ, 0, NULL, OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL, -1 )) == INVALID_HANDLE_VALUE)
     {
         ret = GetLastError();
         goto done;
     }
-    req->hkey  = hkey;
-    req->file  = file;
-    if ((ret = copy_nameW( req->name, subkey )) != ERROR_SUCCESS) goto done;
-    ret = reg_server_call( REQ_LOAD_REGISTRY );
+
+    SERVER_START_REQ
+    {
+        struct load_registry_request *req = server_alloc_req( sizeof(*req), len );
+        req->hkey  = hkey;
+        req->file  = file;
+        memcpy( server_data_ptr(req), subkey, len );
+        ret = reg_server_call( REQ_LOAD_REGISTRY );
+    }
+    SERVER_END_REQ;
     CloseHandle( file );
 
  done:
@@ -1196,25 +1184,34 @@
  */
 LONG WINAPI RegLoadKeyA( HKEY hkey, LPCSTR subkey, LPCSTR filename )
 {
-    struct load_registry_request *req = get_req_buffer();
     HANDLE file;
-    DWORD ret, err = GetLastError();
+    DWORD ret, len, err = GetLastError();
 
     TRACE( "(%x,%s,%s)\n", hkey, debugstr_a(subkey), debugstr_a(filename) );
 
     if (!filename || !*filename) return ERROR_INVALID_PARAMETER;
     if (!subkey || !*subkey) return ERROR_INVALID_PARAMETER;
 
+    len = MultiByteToWideChar( CP_ACP, 0, subkey, strlen(subkey), NULL, 0 ) * sizeof(WCHAR);
+    if (len > MAX_PATH*sizeof(WCHAR)) return ERROR_INVALID_PARAMETER;
+
     if ((file = CreateFileA( filename, GENERIC_READ, 0, NULL, OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL, -1 )) == INVALID_HANDLE_VALUE)
     {
         ret = GetLastError();
         goto done;
     }
-    req->hkey  = hkey;
-    req->file  = file;
-    if ((ret = copy_nameAtoW( req->name, subkey )) != ERROR_SUCCESS) goto done;
-    ret = reg_server_call( REQ_LOAD_REGISTRY );
+
+    SERVER_START_REQ
+    {
+        struct load_registry_request *req = server_alloc_req( sizeof(*req), len );
+        req->hkey  = hkey;
+        req->file  = file;
+        MultiByteToWideChar( CP_ACP, 0, subkey, strlen(subkey),
+                             server_data_ptr(req), len/sizeof(WCHAR) );
+        ret = reg_server_call( REQ_LOAD_REGISTRY );
+    }
+    SERVER_END_REQ;
     CloseHandle( file );
 
  done:
@@ -1233,7 +1230,6 @@
  */
 LONG WINAPI RegSaveKeyA( HKEY hkey, LPCSTR file, LPSECURITY_ATTRIBUTES sa )
 {
-    struct save_registry_request *req = get_req_buffer();
     char buffer[1024];
     int count = 0;
     LPSTR name;
@@ -1259,9 +1255,15 @@
             MESSAGE("Wow, we are already fiddling with a temp file %s with an ordinal as high as %d !\nYou might want to delete all corresponding temp files in that directory.\n", buffer, count);
     }
 
-    req->hkey = hkey;
-    req->file = handle;
-    ret = reg_server_call( REQ_SAVE_REGISTRY );
+    SERVER_START_REQ
+    {
+        struct save_registry_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->hkey = hkey;
+        req->file = handle;
+        ret = reg_server_call( REQ_SAVE_REGISTRY );
+    }
+    SERVER_END_REQ;
+
     CloseHandle( handle );
     if (!ret)
     {
diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c
index 5b77d41..defa7e0 100644
--- a/dlls/kernel/comm.c
+++ b/dlls/kernel/comm.c
@@ -1906,19 +1906,21 @@
  */
 BOOL WINAPI GetCommMask(HANDLE handle,LPDWORD evtmask)
 {
-    struct get_serial_info_request *req = get_req_buffer();
+    BOOL ret;
 
     TRACE("handle %d, mask %p\n", handle, evtmask);
 
-    req->handle = handle;
-
-    if(server_call( REQ_GET_SERIAL_INFO ))
-        return FALSE;
-
-    if(evtmask)
-        *evtmask = req->eventmask;
-	  
-    return TRUE;
+    SERVER_START_REQ
+    {
+        struct get_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle = handle;
+        if ((ret = !server_call( REQ_GET_SERIAL_INFO )))
+        {
+            if (evtmask) *evtmask = req->eventmask;
+        }
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 /*****************************************************************************
@@ -1926,18 +1928,20 @@
  */
 BOOL WINAPI SetCommMask(HANDLE handle,DWORD evtmask)
 {
-    struct set_serial_info_request *req = get_req_buffer();
+    BOOL ret;
 
     TRACE("handle %d, mask %lx\n", handle, evtmask);
-	  
-    req->handle    = handle;
-    req->flags     = SERIALINFO_SET_MASK;
-    req->eventmask = evtmask;
 
-    if(server_call( REQ_SET_SERIAL_INFO ))
-        return FALSE;
-
-    return TRUE;
+    SERVER_START_REQ
+    {
+        struct set_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle    = handle;
+        req->flags     = SERIALINFO_SET_MASK;
+        req->eventmask = evtmask;
+        ret = !server_call( REQ_SET_SERIAL_INFO );
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 /*****************************************************************************
@@ -2447,7 +2451,7 @@
  */
 BOOL WINAPI GetCommTimeouts(HANDLE hComm,LPCOMMTIMEOUTS lptimeouts)
 {
-    struct get_serial_info_request *req = get_req_buffer();
+    BOOL ret;
 
     TRACE("(%x,%p)\n",hComm,lptimeouts);
 
@@ -2457,18 +2461,21 @@
         return FALSE;
     }
 
-    req->handle = hComm;
-
-    if(server_call( REQ_GET_SERIAL_INFO ))
-        return FALSE;
-
-    lptimeouts->ReadIntervalTimeout         = req->readinterval;
-    lptimeouts->ReadTotalTimeoutMultiplier  = req->readmult;
-    lptimeouts->ReadTotalTimeoutConstant    = req->readconst;
-    lptimeouts->WriteTotalTimeoutMultiplier = req->writemult;
-    lptimeouts->WriteTotalTimeoutConstant   = req->writeconst;
-
-	return TRUE;
+    SERVER_START_REQ
+    {
+        struct get_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle = hComm;
+        if ((ret = !server_call( REQ_GET_SERIAL_INFO )))
+        {
+            lptimeouts->ReadIntervalTimeout         = req->readinterval;
+            lptimeouts->ReadTotalTimeoutMultiplier  = req->readmult;
+            lptimeouts->ReadTotalTimeoutConstant    = req->readconst;
+            lptimeouts->WriteTotalTimeoutMultiplier = req->writemult;
+            lptimeouts->WriteTotalTimeoutConstant   = req->writeconst;
+        }
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 /*****************************************************************************
@@ -2487,8 +2494,8 @@
     HANDLE hComm,              /* [I] handle of COMM device */
     LPCOMMTIMEOUTS lptimeouts /* [I] pointer to COMMTIMEOUTS structure */
 ) {
-    struct set_serial_info_request *req = get_req_buffer();
-	int	fd;
+    BOOL ret;
+    int fd;
     struct termios tios;
 
     TRACE("(%x,%p)\n",hComm,lptimeouts);
@@ -2496,20 +2503,23 @@
     if(!lptimeouts)
     {
         SetLastError(ERROR_INVALID_PARAMETER);
-		return FALSE;
-	}
-
-    req->handle       = hComm;
-    req->flags        = SERIALINFO_SET_TIMEOUTS;
-
-    req->readinterval = lptimeouts->ReadIntervalTimeout ;
-    req->readmult     = lptimeouts->ReadTotalTimeoutMultiplier ;
-    req->readconst    = lptimeouts->ReadTotalTimeoutConstant ;
-    req->writemult    = lptimeouts->WriteTotalTimeoutMultiplier ;
-    req->writeconst   = lptimeouts->WriteTotalTimeoutConstant ;
-
-    if(server_call( REQ_SET_SERIAL_INFO ))
         return FALSE;
+    }
+
+    SERVER_START_REQ
+    {
+        struct set_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle       = hComm;
+        req->flags        = SERIALINFO_SET_TIMEOUTS;
+        req->readinterval = lptimeouts->ReadIntervalTimeout ;
+        req->readmult     = lptimeouts->ReadTotalTimeoutMultiplier ;
+        req->readconst    = lptimeouts->ReadTotalTimeoutConstant ;
+        req->writemult    = lptimeouts->WriteTotalTimeoutMultiplier ;
+        req->writeconst   = lptimeouts->WriteTotalTimeoutConstant ;
+        ret = !server_call( REQ_SET_SERIAL_INFO );
+    }
+    SERVER_END_REQ;
+    if (!ret) return FALSE;
 
     /* FIXME: move this stuff to the server */
     fd = FILE_GetUnixHandle( hComm, GENERIC_WRITE );
@@ -2518,18 +2528,18 @@
        return FALSE;
     }
 
-	if (-1==tcgetattr(fd,&tios)) {
-		FIXME("tcgetattr on fd %d failed!\n",fd);
-		return FALSE;
-	}
-	/* VTIME is in 1/10 seconds */
-	tios.c_cc[VTIME]= (lptimeouts->ReadIntervalTimeout+99)/100;
-	if (-1==tcsetattr(fd,0,&tios)) {
-		FIXME("tcsetattr on fd %d failed!\n",fd);
-		return FALSE;
-	}
+    if (-1==tcgetattr(fd,&tios)) {
+        FIXME("tcgetattr on fd %d failed!\n",fd);
+        return FALSE;
+    }
+    /* VTIME is in 1/10 seconds */
+    tios.c_cc[VTIME]= (lptimeouts->ReadIntervalTimeout+99)/100;
+    if (-1==tcsetattr(fd,0,&tios)) {
+        FIXME("tcsetattr on fd %d failed!\n",fd);
+        return FALSE;
+    }
     close(fd);
-	return TRUE;
+    return TRUE;
 }
 
 /***********************************************************************