Store all object names as Unicode in the server.
diff --git a/server/Makefile.in b/server/Makefile.in
index 81f3401..d917cfe 100644
--- a/server/Makefile.in
+++ b/server/Makefile.in
@@ -27,7 +27,8 @@
sock.c \
socket.c \
thread.c \
- trace.c
+ trace.c \
+ unicode.c
EXTRA_SRCS = main.c
MAIN_OBJS = main.o
diff --git a/server/event.c b/server/event.c
index 100adb8..77d036b 100644
--- a/server/event.c
+++ b/server/event.c
@@ -42,7 +42,7 @@
};
-static struct event *create_event( const char *name, size_t len,
+static struct event *create_event( const WCHAR *name, size_t len,
int manual_reset, int initial_state )
{
struct event *event;
@@ -88,9 +88,10 @@
{
struct event *event = (struct event *)obj;
assert( obj->ops == &event_ops );
- fprintf( stderr, "Event manual=%d signaled=%d name='%s'\n",
- event->manual_reset, event->signaled,
- get_object_name( &event->obj ) );
+ fprintf( stderr, "Event manual=%d signaled=%d ",
+ event->manual_reset, event->signaled );
+ dump_object_name( &event->obj );
+ fputc( '\n', stderr );
}
static int event_signaled( struct object *obj, struct thread *thread )
@@ -112,7 +113,7 @@
/* create an event */
DECL_HANDLER(create_event)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
struct event *event;
req->handle = -1;
@@ -126,7 +127,7 @@
/* open a handle to an event */
DECL_HANDLER(open_event)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
req->handle = open_object( req->name, len, &event_ops, req->access, req->inherit );
}
diff --git a/server/handle.c b/server/handle.c
index 541dc5c..ea6d6c8 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -399,22 +399,22 @@
}
/* open a new handle to an existing object */
-int open_object( const char *name, size_t len, const struct object_ops *ops,
+int open_object( const WCHAR *name, size_t len, const struct object_ops *ops,
unsigned int access, int inherit )
{
+ int handle = -1;
struct object *obj = find_object( name, len );
- if (!obj)
+ if (obj)
{
- set_error( ERROR_FILE_NOT_FOUND );
- return -1;
- }
- if (ops && obj->ops != ops)
- {
+ if (ops && obj->ops != ops)
+ set_error( ERROR_INVALID_HANDLE );
+ else
+ handle = alloc_handle( current->process, obj, access, inherit );
release_object( obj );
- set_error( ERROR_INVALID_HANDLE ); /* FIXME: not the right type */
- return -1;
}
- return alloc_handle( current->process, obj, access, inherit );
+ else
+ set_error( ERROR_FILE_NOT_FOUND );
+ return handle;
}
/* close a handle */
diff --git a/server/handle.h b/server/handle.h
index 5763714..7bba30b 100644
--- a/server/handle.h
+++ b/server/handle.h
@@ -12,6 +12,7 @@
#endif
#include <stdlib.h>
+#include "windef.h"
struct process;
struct object_ops;
@@ -27,7 +28,7 @@
unsigned int access, const struct object_ops *ops );
extern int duplicate_handle( struct process *src, int src_handle, struct process *dst,
unsigned int access, int inherit, int options );
-extern int open_object( const char *name, size_t len, const struct object_ops *ops,
+extern int open_object( const WCHAR *name, size_t len, const struct object_ops *ops,
unsigned int access, int inherit );
extern struct object *alloc_handle_table( struct process *process, int count );
extern struct object *copy_handle_table( struct process *process, struct process *parent );
diff --git a/server/mapping.c b/server/mapping.c
index a273ed5..bf45e04 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -84,7 +84,7 @@
static struct object *create_mapping( int size_high, int size_low, int protect,
- int handle, const char *name, size_t len )
+ int handle, const WCHAR *name, size_t len )
{
struct mapping *mapping;
int access = 0;
@@ -137,9 +137,10 @@
{
struct mapping *mapping = (struct mapping *)obj;
assert( obj->ops == &mapping_ops );
- fprintf( stderr, "Mapping size=%08x%08x prot=%08x file=%p name='%s'\n",
- mapping->size_high, mapping->size_low, mapping->protect,
- mapping->file, get_object_name( &mapping->obj ) );
+ fprintf( stderr, "Mapping size=%08x%08x prot=%08x file=%p ",
+ mapping->size_high, mapping->size_low, mapping->protect, mapping->file );
+ dump_object_name( &mapping->obj );
+ fputc( '\n', stderr );
}
static void mapping_destroy( struct object *obj )
@@ -158,7 +159,7 @@
/* create a file mapping */
DECL_HANDLER(create_mapping)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
struct object *obj;
req->handle = -1;
@@ -175,7 +176,7 @@
/* open a handle to a mapping */
DECL_HANDLER(open_mapping)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
req->handle = open_object( req->name, len, &mapping_ops, req->access, req->inherit );
}
diff --git a/server/mutex.c b/server/mutex.c
index 1173d5d..1ce86f9 100644
--- a/server/mutex.c
+++ b/server/mutex.c
@@ -46,7 +46,7 @@
};
-static struct mutex *create_mutex( const char *name, size_t len, int owned )
+static struct mutex *create_mutex( const WCHAR *name, size_t len, int owned )
{
struct mutex *mutex;
@@ -94,8 +94,9 @@
{
struct mutex *mutex = (struct mutex *)obj;
assert( obj->ops == &mutex_ops );
- printf( "Mutex count=%u owner=%p name='%s'\n",
- mutex->count, mutex->owner, get_object_name( &mutex->obj) );
+ fprintf( stderr, "Mutex count=%u owner=%p ", mutex->count, mutex->owner );
+ dump_object_name( &mutex->obj );
+ fputc( '\n', stderr );
}
static int mutex_signaled( struct object *obj, struct thread *thread )
@@ -137,7 +138,7 @@
/* create a mutex */
DECL_HANDLER(create_mutex)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
struct mutex *mutex;
req->handle = -1;
@@ -151,7 +152,7 @@
/* open a handle to a mutex */
DECL_HANDLER(open_mutex)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
req->handle = open_object( req->name, len, &mutex_ops, req->access, req->inherit );
}
diff --git a/server/object.c b/server/object.c
index 31d522c..9d44965 100644
--- a/server/object.c
+++ b/server/object.c
@@ -13,6 +13,7 @@
#include "winerror.h"
#include "thread.h"
+#include "unicode.h"
int debug_level = 0;
@@ -22,7 +23,7 @@
struct object_name *prev;
struct object *obj;
size_t len;
- char name[1];
+ WCHAR name[1];
};
#define NAME_HASH_SIZE 37
@@ -66,22 +67,22 @@
/*****************************************************************/
-static int get_name_hash( const char *name, size_t len )
+static int get_name_hash( const WCHAR *name, size_t len )
{
- char hash = 0;
+ WCHAR hash = 0;
while (len--) hash ^= *name++;
return hash % NAME_HASH_SIZE;
}
/* allocate a name for an object */
-static struct object_name *alloc_name( const char *name, size_t len )
+static struct object_name *alloc_name( const WCHAR *name, size_t len )
{
struct object_name *ptr;
- if ((ptr = mem_alloc( sizeof(*ptr) + len )))
+ if ((ptr = mem_alloc( sizeof(*ptr) + len * sizeof(ptr->name[0]) )))
{
ptr->len = len;
- memcpy( ptr->name, name, len );
+ memcpy( ptr->name, name, len * sizeof(ptr->name[0]) );
ptr->name[len] = 0;
}
return ptr;
@@ -139,7 +140,7 @@
return obj;
}
-void *create_named_object( const struct object_ops *ops, const char *name, size_t len )
+void *create_named_object( const struct object_ops *ops, const WCHAR *name, size_t len )
{
struct object *obj;
struct object_name *name_ptr;
@@ -167,11 +168,16 @@
return obj;
}
-/* return a pointer to the object name, or to an empty string */
-const char *get_object_name( struct object *obj )
+/* dump the name of an object to stderr */
+void dump_object_name( struct object *obj )
{
- if (!obj->name) return "";
- return obj->name->name;
+ if (!obj->name) fprintf( stderr, "name=\"\"" );
+ else
+ {
+ fprintf( stderr, "name=L\"" );
+ dump_strW( obj->name->name, strlenW(obj->name->name), stderr, "\"\"" );
+ fputc( '\"', stderr );
+ }
}
/* grab an object (i.e. increment its refcount) and return the object */
@@ -206,14 +212,14 @@
}
/* find an object by its name; the refcount is incremented */
-struct object *find_object( const char *name, size_t len )
+struct object *find_object( const WCHAR *name, size_t len )
{
struct object_name *ptr;
if (!name || !len) return NULL;
for (ptr = names[ get_name_hash( name, len ) ]; ptr; ptr = ptr->next)
{
if (ptr->len != len) continue;
- if (!memcmp( ptr->name, name, len )) return grab_object( ptr->obj );
+ if (!memcmp( ptr->name, name, len*sizeof(WCHAR) )) return grab_object( ptr->obj );
}
return NULL;
}
diff --git a/server/object.h b/server/object.h
index 5c1a97b..46c9c6c 100644
--- a/server/object.h
+++ b/server/object.h
@@ -68,13 +68,13 @@
extern void *mem_alloc( size_t size ); /* malloc wrapper */
extern void *memdup( const void *data, size_t len );
extern void *alloc_object( const struct object_ops *ops );
-extern const char *get_object_name( struct object *obj );
-extern void *create_named_object( const struct object_ops *ops, const char *name, size_t len );
+extern void dump_object_name( struct object *obj );
+extern void *create_named_object( const struct object_ops *ops, const WCHAR *name, size_t len );
/* grab/release_object can take any pointer, but you better make sure */
/* that the thing pointed to starts with a struct object... */
extern struct object *grab_object( void *obj );
extern void release_object( void *obj );
-extern struct object *find_object( const char *name, size_t len );
+extern struct object *find_object( const WCHAR *name, size_t len );
extern int no_add_queue( struct object *obj, struct wait_queue_entry *entry );
extern int no_satisfied( struct object *obj, struct thread *thread );
extern int no_read_fd( struct object *obj );
diff --git a/server/registry.c b/server/registry.c
index c33561f..854e647 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -129,50 +129,6 @@
* - REG_EXPAND_SZ and REG_MULTI_SZ are saved as strings instead of hex
*/
-/* dump a string to a text file with proper escaping */
-static int dump_strW( const WCHAR *str, int len, FILE *f, char escape[2] )
-{
- static const char escapes[32] = ".......abtnvfr.............e....";
- char buffer[256];
- char *pos = buffer;
- int count = 0;
-
- for (; len; str++, len--)
- {
- if (pos > buffer + sizeof(buffer) - 8)
- {
- fwrite( buffer, pos - buffer, 1, f );
- count += pos - buffer;
- pos = buffer;
- }
- if (*str > 127) /* hex escape */
- {
- if (len > 1 && str[1] < 128 && isxdigit((char)str[1]))
- pos += sprintf( pos, "\\x%04x", *str );
- else
- pos += sprintf( pos, "\\x%x", *str );
- continue;
- }
- if (*str < 32) /* octal or C escape */
- {
- if (!*str && len == 1) continue; /* do not output terminating NULL */
- if (escapes[*str] != '.')
- pos += sprintf( pos, "\\%c", escapes[*str] );
- else if (len > 1 && str[1] >= '0' && str[1] <= '7')
- pos += sprintf( pos, "\\%03o", *str );
- else
- pos += sprintf( pos, "\\%o", *str );
- continue;
- }
- if (*str == '\\' || *str == escape[0] || *str == escape[1]) *pos++ = '\\';
- *pos++ = *str;
- }
- fwrite( buffer, pos - buffer, 1, f );
- count += pos - buffer;
- return count;
-}
-
-
static inline char to_hex( char ch )
{
if (isdigit(ch)) return ch - '0';
diff --git a/server/semaphore.c b/server/semaphore.c
index f9fb671..36656f4 100644
--- a/server/semaphore.c
+++ b/server/semaphore.c
@@ -42,7 +42,7 @@
};
-static struct semaphore *create_semaphore( const char *name, size_t len,
+static struct semaphore *create_semaphore( const WCHAR *name, size_t len,
unsigned int initial, unsigned int max )
{
struct semaphore *sem;
@@ -97,8 +97,9 @@
{
struct semaphore *sem = (struct semaphore *)obj;
assert( obj->ops == &semaphore_ops );
- fprintf( stderr, "Semaphore count=%d max=%d name='%s'\n",
- sem->count, sem->max, get_object_name( &sem->obj ) );
+ fprintf( stderr, "Semaphore count=%d max=%d ", sem->count, sem->max );
+ dump_object_name( &sem->obj );
+ fputc( '\n', stderr );
}
static int semaphore_signaled( struct object *obj, struct thread *thread )
@@ -120,7 +121,7 @@
/* create a semaphore */
DECL_HANDLER(create_semaphore)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
struct semaphore *sem;
req->handle = -1;
@@ -134,7 +135,7 @@
/* open a handle to a semaphore */
DECL_HANDLER(open_semaphore)
{
- size_t len = get_req_strlen( req->name );
+ size_t len = get_req_strlenW( req->name );
req->handle = open_object( req->name, len, &semaphore_ops, req->access, req->inherit );
}
diff --git a/server/trace.c b/server/trace.c
index 69786c9..b05af06 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -10,6 +10,7 @@
#include <sys/uio.h>
#include "winsock2.h"
#include "request.h"
+#include "unicode.h"
/* utility functions */
@@ -39,12 +40,8 @@
static void dump_unicode_string( const WCHAR *str )
{
fprintf( stderr, "L\"" );
- while (*str)
- {
- fprintf( stderr, "%c", isprint( (char)*str ) ? (char )*str : '?' );
- str++;
- }
- fprintf( stderr, "\"" );
+ dump_strW( str, strlenW(str), stderr, "\"\"" );
+ fputc( '\"', stderr );
}
@@ -341,7 +338,8 @@
fprintf( stderr, " manual_reset=%d,", req->manual_reset );
fprintf( stderr, " initial_state=%d,", req->initial_state );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_create_event_reply( struct create_event_request *req )
@@ -359,7 +357,8 @@
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_open_event_reply( struct open_event_request *req )
@@ -371,7 +370,8 @@
{
fprintf( stderr, " owned=%d,", req->owned );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_create_mutex_reply( struct create_mutex_request *req )
@@ -388,7 +388,8 @@
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_open_mutex_reply( struct open_mutex_request *req )
@@ -401,7 +402,8 @@
fprintf( stderr, " initial=%08x,", req->initial );
fprintf( stderr, " max=%08x,", req->max );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_create_semaphore_reply( struct create_semaphore_request *req )
@@ -424,7 +426,8 @@
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_open_semaphore_reply( struct open_semaphore_request *req )
@@ -718,7 +721,8 @@
fprintf( stderr, " protect=%d,", req->protect );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " file_handle=%d,", req->file_handle );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_create_mapping_reply( struct create_mapping_request *req )
@@ -730,7 +734,8 @@
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
- fprintf( stderr, " name=\"%s\"", req->name );
+ fprintf( stderr, " name=" );
+ dump_unicode_string( req->name );
}
static void dump_open_mapping_reply( struct open_mapping_request *req )
diff --git a/server/unicode.c b/server/unicode.c
new file mode 100644
index 0000000..3ba4e03
--- /dev/null
+++ b/server/unicode.c
@@ -0,0 +1,52 @@
+/*
+ * Unicode routines for use inside the server
+ *
+ * Copyright (C) 1999 Alexandre Julliard
+ */
+
+#include <stdio.h>
+
+#include "unicode.h"
+
+/* dump a Unicode string with proper escaping */
+int dump_strW( const WCHAR *str, size_t len, FILE *f, char escape[2] )
+{
+ static const char escapes[32] = ".......abtnvfr.............e....";
+ char buffer[256];
+ char *pos = buffer;
+ int count = 0;
+
+ for (; len; str++, len--)
+ {
+ if (pos > buffer + sizeof(buffer) - 8)
+ {
+ fwrite( buffer, pos - buffer, 1, f );
+ count += pos - buffer;
+ pos = buffer;
+ }
+ if (*str > 127) /* hex escape */
+ {
+ if (len > 1 && str[1] < 128 && isxdigit((char)str[1]))
+ pos += sprintf( pos, "\\x%04x", *str );
+ else
+ pos += sprintf( pos, "\\x%x", *str );
+ continue;
+ }
+ if (*str < 32) /* octal or C escape */
+ {
+ if (!*str && len == 1) continue; /* do not output terminating NULL */
+ if (escapes[*str] != '.')
+ pos += sprintf( pos, "\\%c", escapes[*str] );
+ else if (len > 1 && str[1] >= '0' && str[1] <= '7')
+ pos += sprintf( pos, "\\%03o", *str );
+ else
+ pos += sprintf( pos, "\\%o", *str );
+ continue;
+ }
+ if (*str == '\\' || *str == escape[0] || *str == escape[1]) *pos++ = '\\';
+ *pos++ = *str;
+ }
+ fwrite( buffer, pos - buffer, 1, f );
+ count += pos - buffer;
+ return count;
+}
diff --git a/server/unicode.h b/server/unicode.h
index 614f2ca..c1df7f5 100644
--- a/server/unicode.h
+++ b/server/unicode.h
@@ -19,6 +19,7 @@
#endif
#include "windef.h"
+#include "object.h"
static inline size_t strlenW( const WCHAR *str )
{
@@ -52,4 +53,6 @@
return memdup( str, len );
}
+extern int dump_strW( const WCHAR *str, size_t len, FILE *f, char escape[2] );
+
#endif /* __WINE_SERVER_UNICODE_H */