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 )