Converted a few more server requests to the new mechanism.

diff --git a/server/process.c b/server/process.c
index dc6d1cf..917785e 100644
--- a/server/process.c
+++ b/server/process.c
@@ -888,8 +888,8 @@
 
     if ((process = get_process_from_handle( req->handle, PROCESS_VM_READ )))
     {
-        read_process_memory( process, req->addr, req->len,
-                             get_req_size( req, req->data, sizeof(int) ), req->data );
+        size_t maxlen = get_req_data_size(req) / sizeof(int);
+        read_process_memory( process, req->addr, req->len, maxlen, get_req_data(req) );
         release_object( process );
     }
 }
@@ -901,9 +901,9 @@
 
     if ((process = get_process_from_handle( req->handle, PROCESS_VM_WRITE )))
     {
-        write_process_memory( process, req->addr, req->len,
-                              get_req_size( req, req->data, sizeof(int) ),
-                              req->first_mask, req->last_mask, req->data );
+        size_t maxlen = get_req_data_size(req) / sizeof(int);
+        write_process_memory( process, req->addr, req->len, maxlen,
+                              req->first_mask, req->last_mask, get_req_data(req) );
         release_object( process );
     }
 }
diff --git a/server/registry.c b/server/registry.c
index 944d731..3ca1c37 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -1437,8 +1437,8 @@
         set_error( STATUS_NO_MORE_ENTRIES );
         return;
     }
-    if (!(save_branch_info[save_branch_count].path = memdup( path, len+1 ))) return;
-    save_branch_info[save_branch_count].path[len] = 0;
+    if (!len || !(save_branch_info[save_branch_count].path = memdup( path, len ))) return;
+    save_branch_info[save_branch_count].path[len - 1] = 0;
     save_branch_info[save_branch_count].key = (struct key *)grab_object( key );
     save_branch_count++;
 }
@@ -1757,7 +1757,7 @@
 
     if ((key = get_hkey_obj( req->hkey, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS )))
     {
-        register_branch_for_saving( key, req->file, get_req_strlen( req, req->file ) );
+        register_branch_for_saving( key, get_req_data(req), get_req_data_size(req) );
         release_object( key );
     }
 }
diff --git a/server/serial.c b/server/serial.c
index 64a9956..d102233 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -37,7 +37,6 @@
 #include "request.h"
 
 static void serial_dump( struct object *obj, int verbose );
-static void serial_destroy( struct object *obj );
 static int serial_get_read_fd( struct object *obj );
 static int serial_get_write_fd( struct object *obj );
 static int serial_get_info( struct object *obj, struct get_file_info_request *req );
@@ -46,8 +45,7 @@
 struct serial
 {
     struct object       obj;
-    char                name[16]; /* eg. /dev/ttyS1 */
-    int                 access;
+    unsigned int        access;
 
     /* timeout values */
     unsigned int        readinterval;
@@ -78,24 +76,65 @@
     serial_get_write_fd,          /* get_write_fd */
     no_flush,                     /* flush */
     serial_get_info,              /* get_file_info */
-    serial_destroy                /* destroy */
+    no_destroy                    /* destroy */
 };
 
 /* SERIAL PORT functions */
 
+static struct serial *create_serial( const char *nameptr, size_t len, unsigned int access )
+{
+    struct serial *serial;
+    struct termios tios;
+    int fd, flags = 0;
+    char *name;
+
+    if (!(name = mem_alloc( len + 1 ))) return NULL;
+    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;
+    }
+
+    fd = open( name, flags );
+    free( name );
+    if (fd < 0)
+    {
+        file_set_error();
+        return NULL;
+    }
+
+    /* check its really a serial port */
+    if (tcgetattr(fd,&tios))
+    {
+        file_set_error();
+        close( fd );
+        return NULL;
+    }
+
+    if ((serial = alloc_object( &serial_ops, fd )))
+    {
+        serial->access       = access;
+        serial->readinterval = 0;
+        serial->readmult     = 0;
+        serial->readconst    = 0;
+        serial->writemult    = 0;
+        serial->writeconst   = 0;
+        serial->eventmask    = 0;
+        serial->commerror    = 0;
+    }
+    return serial;
+}
+
 static void serial_dump( struct object *obj, int verbose )
 {
     struct serial *serial = (struct serial *)obj;
     assert( obj->ops == &serial_ops );
-
-    fprintf( stderr, "Port fd=%d name='%s' mask=%x\n", 
-             serial->obj.fd, serial->name,serial->eventmask);
-}
-
-/* same as file_destroy, but don't delete comm ports */
-static void serial_destroy( struct object *obj )
-{
-    assert( obj->ops == &serial_ops );
+    fprintf( stderr, "Port fd=%d mask=%x\n", serial->obj.fd, serial->eventmask );
 }
 
 struct serial *get_serial_obj( struct process *process, int handle, unsigned int access )
@@ -147,50 +186,10 @@
 DECL_HANDLER(create_serial)
 {
     struct serial *serial;
-    int fd,flags;
-    struct termios tios;
 
     req->handle = -1;
-
-    flags = 0;
-    switch(req->access & (GENERIC_READ | GENERIC_WRITE))
+    if ((serial = create_serial( get_req_data(req), get_req_data_size(req), req->access )))
     {
-    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;
-    }
-
-    fd = open( req->name, flags );
-    if(fd < 0)
-    {
-        file_set_error();
-        return;
-    }
-
-    /* check its really a serial port */
-    if(0>tcgetattr(fd,&tios))
-    {
-        file_set_error();
-        close(fd);
-        return;
-    }
-
-    serial = alloc_object( &serial_ops, fd );
-    if (serial)
-    {
-        strncpy(serial->name,req->name,sizeof serial->name);
-        serial->name[sizeof(serial->name)-1] = 0;
-
-        serial->access       = req->access;
-        serial->readinterval = 0;
-        serial->readmult     = 0;
-        serial->readconst    = 0;
-        serial->writemult    = 0;
-        serial->writeconst   = 0;
-        serial->eventmask    = 0;
-        serial->commerror    = 0;
-
         req->handle = alloc_handle( current->process, serial, req->access, req->inherit );
         release_object( serial );
     }
diff --git a/server/trace.c b/server/trace.c
index b9e02a8..4ac36ea 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -51,25 +51,15 @@
     fputc( '}', stderr );
 }
 
-static void dump_string( const void *req, const char *str )
+static void dump_path_t( const void *req, const path_t *path )
 {
-    int len = get_req_strlen( req, str );
-    fprintf( stderr, "\"%.*s\"", len, str );
-}
-
-static void dump_unicode_string( const void *req, const WCHAR *str )
-{
+    const WCHAR *str = *path;
     size_t len = get_req_strlenW( req, str );
     fprintf( stderr, "L\"" );
     dump_strW( str, len, stderr, "\"\"" );
     fputc( '\"', stderr );
 }
 
-static void dump_path_t( const void *req, const path_t *path )
-{
-    dump_unicode_string( req, *path );
-}
-
 static void dump_context( const CONTEXT *context )
 {
 #ifdef __i386__
@@ -271,18 +261,6 @@
 
 /* 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) ));
-    dump_bytes( (unsigned char *)req->data, count * sizeof(int) );
-}
-
-static void dump_varargs_write_process_memory_request( const struct write_process_memory_request *req )
-{
-    int count = min( req->len, get_req_size( req, req->data, sizeof(int) ));
-    dump_bytes( (unsigned char *)req->data, count * sizeof(int) );
-}
-
 static void dump_varargs_enum_key_value_reply( const struct enum_key_value_request *req )
 {
     int count = min( req->len - req->offset, get_req_size( req, req->data, 1 ));
@@ -1130,7 +1108,7 @@
 static void dump_read_process_memory_reply( const struct read_process_memory_request *req )
 {
     fprintf( stderr, " data=" );
-    dump_varargs_read_process_memory_reply( req );
+    cur_pos += dump_varargs_bytes( req );
 }
 
 static void dump_write_process_memory_request( const struct write_process_memory_request *req )
@@ -1141,7 +1119,7 @@
     fprintf( stderr, " first_mask=%08x,", req->first_mask );
     fprintf( stderr, " last_mask=%08x,", req->last_mask );
     fprintf( stderr, " data=" );
-    dump_varargs_write_process_memory_request( req );
+    cur_pos += dump_varargs_bytes( req );
 }
 
 static void dump_create_key_request( const struct create_key_request *req )
@@ -1263,7 +1241,7 @@
     fprintf( stderr, " hkey=%d,", req->hkey );
     fprintf( stderr, " file=%d,", req->file );
     fprintf( stderr, " name=" );
-    dump_path_t( req, &req->name );
+    cur_pos += dump_varargs_unicode_str( req );
 }
 
 static void dump_save_registry_request( const struct save_registry_request *req )
@@ -1276,7 +1254,7 @@
 {
     fprintf( stderr, " hkey=%d,", req->hkey );
     fprintf( stderr, " file=" );
-    dump_string( req, req->file );
+    cur_pos += dump_varargs_string( req );
 }
 
 static void dump_set_registry_levels_request( const struct set_registry_levels_request *req )
@@ -1440,7 +1418,7 @@
     fprintf( stderr, " inherit=%d,", req->inherit );
     fprintf( stderr, " sharing=%08x,", req->sharing );
     fprintf( stderr, " name=" );
-    dump_string( req, req->name );
+    cur_pos += dump_varargs_string( req );
 }
 
 static void dump_create_serial_reply( const struct create_serial_request *req )