diff --git a/server/async.c b/server/async.c index acf61d8b5517211328cc848a42c6e90f45aaeaf6..9ca239c8465b333d0f8796a22f97070af501ff81 100644 --- a/server/async.c +++ b/server/async.c @@ -52,6 +52,7 @@ static const struct object_ops async_ops = { sizeof(struct async), /* size */ async_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -81,6 +82,7 @@ static const struct object_ops async_queue_ops = { sizeof(struct async_queue), /* size */ async_queue_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/atom.c b/server/atom.c index 336e6e362ebee00de0d883616bcc56db20515786..8094188c85a1b072d5a550b75469686cc085a0be 100644 --- a/server/atom.c +++ b/server/atom.c @@ -76,6 +76,7 @@ static const struct object_ops atom_table_ops = { sizeof(struct atom_table), /* size */ atom_table_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/change.c b/server/change.c index dc449803c2acd221006ebda6bf53fcedb0afb3ae..590a1cb6b6183f1625d5ad9317979862c5fb6398 100644 --- a/server/change.c +++ b/server/change.c @@ -164,6 +164,7 @@ static const struct object_ops dir_ops = { sizeof(struct dir), /* size */ dir_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ diff --git a/server/clipboard.c b/server/clipboard.c index 44ca7bdfdfb6a86cb67e7e45e7f15cbac426c6b1..a90dbc27e58743dd7bea2f14140fc72d910e4614 100644 --- a/server/clipboard.c +++ b/server/clipboard.c @@ -52,6 +52,7 @@ static const struct object_ops clipboard_ops = { sizeof(struct clipboard), /* size */ clipboard_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/completion.c b/server/completion.c index 96aaacc83e128d1563a98e6bf2efe63a3910827d..41884882d5454bceece3daedaf48ee25163ecbcd 100644 --- a/server/completion.c +++ b/server/completion.c @@ -52,6 +52,7 @@ struct completion }; static void completion_dump( struct object*, int ); +static struct object_type *completion_get_type( struct object *obj ); static void completion_destroy( struct object * ); static int completion_signaled( struct object *obj, struct thread *thread ); @@ -59,6 +60,7 @@ static const struct object_ops completion_ops = { sizeof(struct completion), /* size */ completion_dump, /* dump */ + completion_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ completion_signaled, /* signaled */ @@ -104,6 +106,13 @@ static void completion_dump( struct object *obj, int verbose ) fprintf( stderr, " (%u packets pending)\n", completion->depth ); } +static struct object_type *completion_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'C','o','m','p','l','e','t','i','o','n'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int completion_signaled( struct object *obj, struct thread *thread ) { struct completion *completion = (struct completion *)obj; diff --git a/server/console.c b/server/console.c index 5f005884672ae6ecb5fd67b2aeb9b31f942d8d6b..a5020ac06a015a83d791a649ccadff29a91713a7 100644 --- a/server/console.c +++ b/server/console.c @@ -76,6 +76,7 @@ static const struct object_ops console_input_ops = { sizeof(struct console_input), /* size */ console_input_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -107,6 +108,7 @@ static const struct object_ops console_input_events_ops = { sizeof(struct console_input_events), /* size */ console_input_events_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ console_input_events_signaled, /* signaled */ @@ -149,6 +151,7 @@ static const struct object_ops screen_buffer_ops = { sizeof(struct screen_buffer), /* size */ screen_buffer_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/debugger.c b/server/debugger.c index a64a17a7d8956931acc4a5f72f297f17c7db7d76..37ddd689c693b249d9b9e781fed905a6d7f77491 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -69,6 +69,7 @@ static const struct object_ops debug_event_ops = { sizeof(struct debug_event), /* size */ debug_event_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ debug_event_signaled, /* signaled */ @@ -92,6 +93,7 @@ static const struct object_ops debug_ctx_ops = { sizeof(struct debug_ctx), /* size */ debug_ctx_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ debug_ctx_signaled, /* signaled */ diff --git a/server/device.c b/server/device.c index d5e5e44222ecd6dac38800fcd1a4306047724f4e..abf0ac54170b3a1e96244d023ddb3c3cff129373 100644 --- a/server/device.c +++ b/server/device.c @@ -58,6 +58,7 @@ static const struct object_ops ioctl_call_ops = { sizeof(struct ioctl_call), /* size */ ioctl_call_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ ioctl_call_signaled, /* signaled */ @@ -89,6 +90,7 @@ static const struct object_ops device_manager_ops = { sizeof(struct device_manager), /* size */ device_manager_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ device_manager_signaled, /* signaled */ @@ -116,6 +118,7 @@ struct device }; static void device_dump( struct object *obj, int verbose ); +static struct object_type *device_get_type( struct object *obj ); static struct fd *device_get_fd( struct object *obj ); static void device_destroy( struct object *obj ); static struct object *device_open_file( struct object *obj, unsigned int access, @@ -128,6 +131,7 @@ static const struct object_ops device_ops = { sizeof(struct device), /* size */ device_dump, /* dump */ + device_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -252,6 +256,13 @@ static void device_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *device_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'D','e','v','i','c','e'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static struct fd *device_get_fd( struct object *obj ) { struct device *device = (struct device *)obj; diff --git a/server/directory.c b/server/directory.c index 3e199f0dad0e7518034df39cafe670bec72d7cd8..bf1cd6938c32df359124e6512ea1dffdde221404 100644 --- a/server/directory.c +++ b/server/directory.c @@ -41,6 +41,35 @@ #define HASH_SIZE 7 /* default hash size */ +struct object_type +{ + struct object obj; /* object header */ +}; + +static void object_type_dump( struct object *obj, int verbose ); +static struct object_type *object_type_get_type( struct object *obj ); + +static const struct object_ops object_type_ops = +{ + sizeof(struct object_type), /* size */ + object_type_dump, /* dump */ + object_type_get_type, /* get_type */ + no_add_queue, /* add_queue */ + NULL, /* remove_queue */ + NULL, /* signaled */ + NULL, /* satisfied */ + no_signal, /* signal */ + no_get_fd, /* get_fd */ + no_map_access, /* map_access */ + default_get_sd, /* get_sd */ + default_set_sd, /* set_sd */ + no_lookup_name, /* lookup_name */ + no_open_file, /* open_file */ + no_close_handle, /* close_handle */ + no_destroy /* destroy */ +}; + + struct directory { struct object obj; /* object header */ @@ -48,6 +77,7 @@ struct directory }; static void directory_dump( struct object *obj, int verbose ); +static struct object_type *directory_get_type( struct object *obj ); static struct object *directory_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ); static void directory_destroy( struct object *obj ); @@ -56,6 +86,7 @@ static const struct object_ops directory_ops = { sizeof(struct directory), /* size */ directory_dump, /* dump */ + directory_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -72,8 +103,25 @@ static const struct object_ops directory_ops = }; static struct directory *root_directory; +static struct directory *dir_objtype; +static void object_type_dump( struct object *obj, int verbose ) +{ + assert( obj->ops == &object_type_ops ); + + fputs( "Object type ", stderr ); + dump_object_name( obj ); + fputc( '\n', stderr ); +} + +static struct object_type *object_type_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'O','b','j','e','c','t','T','y','p','e'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static void directory_dump( struct object *obj, int verbose ) { assert( obj->ops == &directory_ops ); @@ -83,6 +131,13 @@ static void directory_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *directory_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'D','i','r','e','c','t','o','r','y'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static struct object *directory_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ) { @@ -120,6 +175,8 @@ static struct object *directory_lookup_name( struct object *obj, struct unicode_ set_error( STATUS_OBJECT_NAME_INVALID ); else if (p) /* Path still has backslashes */ set_error( STATUS_OBJECT_PATH_NOT_FOUND ); + else + clear_error(); } return NULL; } @@ -284,6 +341,22 @@ void *open_object_dir( struct directory *root, const struct unicode_str *name, return NULL; } +/* retrieve an object type, creating it if needed */ +struct object_type *get_object_type( const struct unicode_str *name ) +{ + struct object_type *type; + + if ((type = open_object_dir( dir_objtype, name, 0, &object_type_ops ))) + return type; + + if ((type = create_named_object_dir( dir_objtype, name, 0, &object_type_ops ))) + { + grab_object( type ); + make_object_static( &type->obj ); + clear_error(); + } + return type; +} /* Global initialization */ @@ -296,12 +369,14 @@ void init_directories(void) static const WCHAR dir_basenamedW[] = {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s'}; static const WCHAR dir_named_pipeW[] = {'\\','D','e','v','i','c','e','\\','N','a','m','e','d','P','i','p','e'}; static const WCHAR dir_mailslotW[] = {'\\','D','e','v','i','c','e','\\','M','a','i','l','S','l','o','t'}; + static const WCHAR dir_objtypeW[] = {'O','b','j','e','c','t','T','y','p','e','s',}; static const struct unicode_str dir_global_str = {dir_globalW, sizeof(dir_globalW)}; static const struct unicode_str dir_driver_str = {dir_driverW, sizeof(dir_driverW)}; static const struct unicode_str dir_device_str = {dir_deviceW, sizeof(dir_deviceW)}; static const struct unicode_str dir_basenamed_str = {dir_basenamedW, sizeof(dir_basenamedW)}; static const struct unicode_str dir_named_pipe_str = {dir_named_pipeW, sizeof(dir_named_pipeW)}; static const struct unicode_str dir_mailslot_str = {dir_mailslotW, sizeof(dir_mailslotW)}; + static const struct unicode_str dir_objtype_str = {dir_objtypeW, sizeof(dir_objtypeW)}; /* symlinks */ static const WCHAR link_dosdevW[] = {'D','o','s','D','e','v','i','c','e','s'}; @@ -327,8 +402,10 @@ void init_directories(void) root_directory = create_directory( NULL, NULL, 0, HASH_SIZE ); dir_driver = create_directory( root_directory, &dir_driver_str, 0, HASH_SIZE ); dir_device = create_directory( root_directory, &dir_device_str, 0, HASH_SIZE ); + dir_objtype = create_directory( root_directory, &dir_objtype_str, 0, HASH_SIZE ); make_object_static( &root_directory->obj ); make_object_static( &dir_driver->obj ); + make_object_static( &dir_objtype->obj ); dir_global = create_directory( NULL, &dir_global_str, 0, HASH_SIZE ); /* use a larger hash table for this one since it can contain a lot of objects */ @@ -400,20 +477,19 @@ DECL_HANDLER(open_directory) /* get a directory entry by index */ DECL_HANDLER(get_directory_entry) { - static const WCHAR objectW[] = {'O','b','j','e','c','t',0 }; - static const WCHAR dirW[] = {'D','i','r','e','c','t','o','r','y',0 }; - struct directory *dir = get_directory_obj( current->process, req->handle, DIRECTORY_QUERY ); if (dir) { struct object *obj = find_object_index( dir->entries, req->index ); if (obj) { - size_t name_len, type_len; + size_t name_len, type_len = 0; + const WCHAR *type_name = NULL; const WCHAR *name = get_object_name( obj, &name_len ); - const WCHAR *type = obj->ops == &directory_ops ? dirW : objectW; + struct object_type *type = obj->ops->get_type( obj ); + + if (type) type_name = get_object_name( &type->obj, &type_len ); - type_len = strlenW(type) * sizeof(WCHAR); if (name_len + type_len <= get_reply_max_size()) { void *ptr = set_reply_data_size( name_len + type_len ); @@ -421,11 +497,12 @@ DECL_HANDLER(get_directory_entry) { reply->name_len = name_len; memcpy( ptr, name, name_len ); - memcpy( (char *)ptr + name_len, type, type_len ); + memcpy( (char *)ptr + name_len, type_name, type_len ); } } else set_error( STATUS_BUFFER_OVERFLOW ); + if (type) release_object( type ); release_object( obj ); } release_object( dir ); diff --git a/server/event.c b/server/event.c index 624159b15c4b7b1fe8daeb0979e91888318f98cc..7a7331de321025581efafb7a1622788e61cfb924 100644 --- a/server/event.c +++ b/server/event.c @@ -44,6 +44,7 @@ struct event }; static void event_dump( struct object *obj, int verbose ); +static struct object_type *event_get_type( struct object *obj ); static int event_signaled( struct object *obj, struct thread *thread ); static int event_satisfied( struct object *obj, struct thread *thread ); static unsigned int event_map_access( struct object *obj, unsigned int access ); @@ -53,6 +54,7 @@ static const struct object_ops event_ops = { sizeof(struct event), /* size */ event_dump, /* dump */ + event_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ event_signaled, /* signaled */ @@ -126,6 +128,13 @@ static void event_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *event_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'E','v','e','n','t'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int event_signaled( struct object *obj, struct thread *thread ) { struct event *event = (struct event *)obj; diff --git a/server/fd.c b/server/fd.c index 74c09cedf781b30425c4acb424d6ced8998e6765..efa575d1e313b283e02ac2efe80494988002a40d 100644 --- a/server/fd.c +++ b/server/fd.c @@ -191,6 +191,7 @@ static const struct object_ops fd_ops = { sizeof(struct fd), /* size */ fd_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -227,6 +228,7 @@ static const struct object_ops device_ops = { sizeof(struct device), /* size */ device_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -262,6 +264,7 @@ static const struct object_ops inode_ops = { sizeof(struct inode), /* size */ inode_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -299,6 +302,7 @@ static const struct object_ops file_lock_ops = { sizeof(struct file_lock), /* size */ file_lock_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ file_lock_signaled, /* signaled */ diff --git a/server/file.c b/server/file.c index ad98d2129bd5497bdf545c134c6bcb166c18f745..5224e85feaac7d37eed57a74395668e261ce3c2c 100644 --- a/server/file.c +++ b/server/file.c @@ -81,6 +81,7 @@ static const struct object_ops file_ops = { sizeof(struct file), /* size */ file_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ diff --git a/server/handle.c b/server/handle.c index 77de28458553067a358c4184ba892c36e426e212..29214d6d01327d11857692c0a3878d97d706c291 100644 --- a/server/handle.c +++ b/server/handle.c @@ -104,6 +104,7 @@ static const struct object_ops handle_table_ops = { sizeof(struct handle_table), /* size */ handle_table_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/hook.c b/server/hook.c index 19c1ca8eef0ba3e470003cf4998ee9729d31fa9c..4c168a34df66d05773ddc00435e3001ac5c6ef87 100644 --- a/server/hook.c +++ b/server/hook.c @@ -77,6 +77,7 @@ static const struct object_ops hook_table_ops = { sizeof(struct hook_table), /* size */ hook_table_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/mailslot.c b/server/mailslot.c index ee891ffba1ab05b992af6bb916c5b8d867960bd6..e223b8373e1c897d3b79c876b2876ac7da8caef9 100644 --- a/server/mailslot.c +++ b/server/mailslot.c @@ -74,6 +74,7 @@ static const struct object_ops mailslot_ops = { sizeof(struct mailslot), /* size */ mailslot_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ @@ -124,6 +125,7 @@ static const struct object_ops mail_writer_ops = { sizeof(struct mail_writer), /* size */ mail_writer_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -162,6 +164,7 @@ struct mailslot_device }; static void mailslot_device_dump( struct object *obj, int verbose ); +static struct object_type *mailslot_device_get_type( struct object *obj ); static struct fd *mailslot_device_get_fd( struct object *obj ); static struct object *mailslot_device_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ); @@ -174,6 +177,7 @@ static const struct object_ops mailslot_device_ops = { sizeof(struct mailslot_device), /* size */ mailslot_device_dump, /* dump */ + mailslot_device_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -318,6 +322,13 @@ static void mailslot_device_dump( struct object *obj, int verbose ) fprintf( stderr, "Mail slot device\n" ); } +static struct object_type *mailslot_device_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'D','e','v','i','c','e'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static struct fd *mailslot_device_get_fd( struct object *obj ) { struct mailslot_device *device = (struct mailslot_device *)obj; diff --git a/server/mapping.c b/server/mapping.c index 9f062d0b0f5136ca6c8d079aaaea5b4b0ba94a1a..02b73b19715c5ccff480d32981c3260722d5f92a 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -52,6 +52,7 @@ struct mapping }; static void mapping_dump( struct object *obj, int verbose ); +static struct object_type *mapping_get_type( struct object *obj ); static struct fd *mapping_get_fd( struct object *obj ); static unsigned int mapping_map_access( struct object *obj, unsigned int access ); static void mapping_destroy( struct object *obj ); @@ -60,6 +61,7 @@ static const struct object_ops mapping_ops = { sizeof(struct mapping), /* size */ mapping_dump, /* dump */ + mapping_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -360,6 +362,13 @@ static void mapping_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *mapping_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'S','e','c','t','i','o','n'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static struct fd *mapping_get_fd( struct object *obj ) { struct mapping *mapping = (struct mapping *)obj; diff --git a/server/mutex.c b/server/mutex.c index 0193422bc7a677b178e8948f0d8583629c91f4a3..31a529aa3fa7f1dce567cbfc427048fc5c9c801d 100644 --- a/server/mutex.c +++ b/server/mutex.c @@ -46,6 +46,7 @@ struct mutex }; static void mutex_dump( struct object *obj, int verbose ); +static struct object_type *mutex_get_type( struct object *obj ); static int mutex_signaled( struct object *obj, struct thread *thread ); static int mutex_satisfied( struct object *obj, struct thread *thread ); static unsigned int mutex_map_access( struct object *obj, unsigned int access ); @@ -56,6 +57,7 @@ static const struct object_ops mutex_ops = { sizeof(struct mutex), /* size */ mutex_dump, /* dump */ + mutex_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ mutex_signaled, /* signaled */ @@ -128,6 +130,13 @@ static void mutex_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *mutex_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'M','u','t','a','n','t'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int mutex_signaled( struct object *obj, struct thread *thread ) { struct mutex *mutex = (struct mutex *)obj; diff --git a/server/named_pipe.c b/server/named_pipe.c index d277cdcf96a72ce1735bcee4bcb21aedc5f5a723..659d680162d42959433fcef31000f234c6ae7deb 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -117,6 +117,7 @@ static const struct object_ops named_pipe_ops = { sizeof(struct named_pipe), /* size */ named_pipe_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -145,6 +146,7 @@ static const struct object_ops pipe_server_ops = { sizeof(struct pipe_server), /* size */ pipe_server_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ @@ -183,6 +185,7 @@ static const struct object_ops pipe_client_ops = { sizeof(struct pipe_client), /* size */ pipe_client_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ @@ -211,6 +214,7 @@ static const struct fd_ops pipe_client_fd_ops = }; static void named_pipe_device_dump( struct object *obj, int verbose ); +static struct object_type *named_pipe_device_get_type( struct object *obj ); static struct fd *named_pipe_device_get_fd( struct object *obj ); static struct object *named_pipe_device_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ); @@ -225,6 +229,7 @@ static const struct object_ops named_pipe_device_ops = { sizeof(struct named_pipe_device), /* size */ named_pipe_device_dump, /* dump */ + named_pipe_device_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -428,6 +433,13 @@ static void named_pipe_device_dump( struct object *obj, int verbose ) fprintf( stderr, "Named pipe device\n" ); } +static struct object_type *named_pipe_device_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'D','e','v','i','c','e'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static struct fd *named_pipe_device_get_fd( struct object *obj ) { struct named_pipe_device *device = (struct named_pipe_device *)obj; diff --git a/server/object.c b/server/object.c index 7b7a5e3c4de8a9f564a6cfe657501a6002a92672..f08548c21275e40fb59c2d8b97a0480085f667b2 100644 --- a/server/object.c +++ b/server/object.c @@ -353,6 +353,11 @@ struct namespace *create_namespace( unsigned int hash_size ) /* functions for unimplemented/default object operations */ +struct object_type *no_get_type( struct object *obj ) +{ + return NULL; +} + int no_add_queue( struct object *obj, struct wait_queue_entry *entry ) { set_error( STATUS_OBJECT_TYPE_MISMATCH ); diff --git a/server/object.h b/server/object.h index 543b9ba0ad6ab100bc21437e5c0580fd713b73e4..0f311388138b9fdbd198554aae559d7a59714264 100644 --- a/server/object.h +++ b/server/object.h @@ -45,6 +45,7 @@ struct async; struct async_queue; struct winstation; struct directory; +struct object_type; struct unicode_str @@ -60,6 +61,8 @@ struct object_ops size_t size; /* dump the object (for debugging) */ void (*dump)(struct object *,int); + /* return the object type */ + struct object_type *(*get_type)(struct object *); /* add a thread to the object wait queue */ int (*add_queue)(struct object *,struct wait_queue_entry *); /* remove a thread from the object wait queue */ @@ -127,6 +130,7 @@ extern void release_object( void *obj ); extern struct object *find_object( const struct namespace *namespace, const struct unicode_str *name, unsigned int attributes ); extern struct object *find_object_index( const struct namespace *namespace, unsigned int index ); +extern struct object_type *no_get_type( struct object *obj ); 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_signal( struct object *obj, unsigned int access ); @@ -207,6 +211,7 @@ extern void *create_named_object_dir( struct directory *root, const struct unico unsigned int attr, const struct object_ops *ops ); extern void *open_object_dir( struct directory *root, const struct unicode_str *name, unsigned int attr, const struct object_ops *ops ); +extern struct object_type *get_object_type( const struct unicode_str *name ); extern void init_directories(void); /* symbolic link functions */ diff --git a/server/process.c b/server/process.c index e276dc4908916472daf0b1d749e4724251ef5198..26b18631b1066c06718ee92dd3b55529e24d1277 100644 --- a/server/process.c +++ b/server/process.c @@ -67,6 +67,7 @@ static const struct object_ops process_ops = { sizeof(struct process), /* size */ process_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ process_signaled, /* signaled */ @@ -116,6 +117,7 @@ static const struct object_ops startup_info_ops = { sizeof(struct startup_info), /* size */ startup_info_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ startup_info_signaled, /* signaled */ diff --git a/server/queue.c b/server/queue.c index 320bdb09b1c1a11690c753d30a07923fb4a4746a..d837e84e0e143a6f2e2e36dcbfa2fce9af3f7c2d 100644 --- a/server/queue.c +++ b/server/queue.c @@ -149,6 +149,7 @@ static const struct object_ops msg_queue_ops = { sizeof(struct msg_queue), /* size */ msg_queue_dump, /* dump */ + no_get_type, /* get_type */ msg_queue_add_queue, /* add_queue */ msg_queue_remove_queue, /* remove_queue */ msg_queue_signaled, /* signaled */ @@ -181,6 +182,7 @@ static const struct object_ops thread_input_ops = { sizeof(struct thread_input), /* size */ thread_input_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/registry.c b/server/registry.c index 03828e15f6cdcec7957e594ba225576bb355f963..d691e04a65bd3aa2513ee0a1519ca9937684913f 100644 --- a/server/registry.c +++ b/server/registry.c @@ -142,6 +142,7 @@ static const struct object_ops key_ops = { sizeof(struct key), /* size */ key_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/request.c b/server/request.c index dbe483a734881ffbfd35e4334bb8ab893c041bb3..8a2d4fc8d8954cddf3dea70092df661052caba2e 100644 --- a/server/request.c +++ b/server/request.c @@ -89,6 +89,7 @@ static const struct object_ops master_socket_ops = { sizeof(struct master_socket), /* size */ master_socket_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/semaphore.c b/server/semaphore.c index 141217097290cf5d631e0b49f021690f0d806c61..0e26125159c84da1d7103365e2ae5ce7bfaf7bee 100644 --- a/server/semaphore.c +++ b/server/semaphore.c @@ -44,6 +44,7 @@ struct semaphore }; static void semaphore_dump( struct object *obj, int verbose ); +static struct object_type *semaphore_get_type( struct object *obj ); static int semaphore_signaled( struct object *obj, struct thread *thread ); static int semaphore_satisfied( struct object *obj, struct thread *thread ); static unsigned int semaphore_map_access( struct object *obj, unsigned int access ); @@ -53,6 +54,7 @@ static const struct object_ops semaphore_ops = { sizeof(struct semaphore), /* size */ semaphore_dump, /* dump */ + semaphore_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ semaphore_signaled, /* signaled */ @@ -127,6 +129,13 @@ static void semaphore_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *semaphore_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'S','e','m','a','p','h','o','r','e'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int semaphore_signaled( struct object *obj, struct thread *thread ) { struct semaphore *sem = (struct semaphore *)obj; diff --git a/server/serial.c b/server/serial.c index 239a9c5eae6a3a475b47fc0b19bdbda3d767ae7d..d1b3822f10626bbcf9a89d69078cddc7bd9b288b 100644 --- a/server/serial.c +++ b/server/serial.c @@ -87,6 +87,7 @@ static const struct object_ops serial_ops = { sizeof(struct serial), /* size */ serial_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ diff --git a/server/signal.c b/server/signal.c index 912c6c62ca5c6f238ba363ac186e12e2c419958e..5bcd9cbe908b6ddbe4cfa757c7ff3abc0f648d4d 100644 --- a/server/signal.c +++ b/server/signal.c @@ -63,6 +63,7 @@ static const struct object_ops handler_ops = { sizeof(struct handler), /* size */ handler_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/snapshot.c b/server/snapshot.c index 552cc02ace0719a6ff49c6c64d90bd64d6752775..57c9fac8c41ef3cba10786199de0d1bf22f91205 100644 --- a/server/snapshot.c +++ b/server/snapshot.c @@ -61,6 +61,7 @@ static const struct object_ops snapshot_ops = { sizeof(struct snapshot), /* size */ snapshot_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/sock.c b/server/sock.c index 66ab0d116f95fd6afacf098971d8fe5ed648b0b6..f4fe25e9177a75a8add737f410ecfe6066139248 100644 --- a/server/sock.c +++ b/server/sock.c @@ -106,6 +106,7 @@ static const struct object_ops sock_ops = { sizeof(struct sock), /* size */ sock_dump, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ sock_signaled, /* signaled */ diff --git a/server/symlink.c b/server/symlink.c index 183497ce40b35d68bba572820434ec33d7770790..9769c838c3b514b5466f229ca09beef1ba6fa789 100644 --- a/server/symlink.c +++ b/server/symlink.c @@ -46,6 +46,7 @@ struct symlink }; static void symlink_dump( struct object *obj, int verbose ); +static struct object_type *symlink_get_type( struct object *obj ); static unsigned int symlink_map_access( struct object *obj, unsigned int access ); static struct object *symlink_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ); @@ -55,6 +56,7 @@ static const struct object_ops symlink_ops = { sizeof(struct symlink), /* size */ symlink_dump, /* dump */ + symlink_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -82,6 +84,13 @@ static void symlink_dump( struct object *obj, int verbose ) fprintf( stderr, "\"\n" ); } +static struct object_type *symlink_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'S','y','m','b','o','l','i','c','L','i','n','k'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static struct object *symlink_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ) { diff --git a/server/thread.c b/server/thread.c index 6eb43eeda02dbdf0b6df3c0339b66d0ba876be6f..5725ec1f4d063ae2e58286bf381e6b8d66fced52 100644 --- a/server/thread.c +++ b/server/thread.c @@ -86,6 +86,7 @@ static const struct object_ops thread_apc_ops = { sizeof(struct thread_apc), /* size */ dump_thread_apc, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ thread_apc_signaled, /* signaled */ @@ -114,6 +115,7 @@ static const struct object_ops thread_ops = { sizeof(struct thread), /* size */ dump_thread, /* dump */ + no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ thread_signaled, /* signaled */ diff --git a/server/timer.c b/server/timer.c index fb2a2a8e6ce968231212e8915a3303b1e8c00557..5afe6630be6465fb0b7b2e0c97aa2655daab7ef7 100644 --- a/server/timer.c +++ b/server/timer.c @@ -51,6 +51,7 @@ struct timer }; static void timer_dump( struct object *obj, int verbose ); +static struct object_type *timer_get_type( struct object *obj ); static int timer_signaled( struct object *obj, struct thread *thread ); static int timer_satisfied( struct object *obj, struct thread *thread ); static unsigned int timer_map_access( struct object *obj, unsigned int access ); @@ -60,6 +61,7 @@ static const struct object_ops timer_ops = { sizeof(struct timer), /* size */ timer_dump, /* dump */ + timer_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ timer_signaled, /* signaled */ @@ -185,6 +187,13 @@ static void timer_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *timer_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'T','i','m','e','r'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int timer_signaled( struct object *obj, struct thread *thread ) { struct timer *timer = (struct timer *)obj; diff --git a/server/token.c b/server/token.c index 93696d9d8ea7f0c177d0fa8c131eb58743d2fe53..387163b24aba64ede2e19eb07c7f2fa6f9996290 100644 --- a/server/token.c +++ b/server/token.c @@ -122,6 +122,7 @@ static const struct object_ops token_ops = { sizeof(struct token), /* size */ token_dump, /* dump */ + no_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/winstation.c b/server/winstation.c index 5e4bfbcee549f361cddcd385ff713c1d49614af6..3b163a77921512c01e2c9340af23a2bc0e5b268e 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -44,10 +44,12 @@ static struct list winstation_list = LIST_INIT(winstation_list); static struct namespace *winstation_namespace; static void winstation_dump( struct object *obj, int verbose ); +static struct object_type *winstation_get_type( struct object *obj ); static int winstation_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); static void winstation_destroy( struct object *obj ); static unsigned int winstation_map_access( struct object *obj, unsigned int access ); static void desktop_dump( struct object *obj, int verbose ); +static struct object_type *desktop_get_type( struct object *obj ); static int desktop_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); static void desktop_destroy( struct object *obj ); static unsigned int desktop_map_access( struct object *obj, unsigned int access ); @@ -56,6 +58,7 @@ static const struct object_ops winstation_ops = { sizeof(struct winstation), /* size */ winstation_dump, /* dump */ + winstation_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -76,6 +79,7 @@ static const struct object_ops desktop_ops = { sizeof(struct desktop), /* size */ desktop_dump, /* dump */ + desktop_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -133,6 +137,13 @@ static void winstation_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *winstation_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'W','i','n','d','o','w','S','t','a','t','i','o','n'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int winstation_close_handle( struct object *obj, struct process *process, obj_handle_t handle ) { return (process->winstation != handle); @@ -236,6 +247,13 @@ static void desktop_dump( struct object *obj, int verbose ) fputc( '\n', stderr ); } +static struct object_type *desktop_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'D','e','s','k','t','o','p'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int desktop_close_handle( struct object *obj, struct process *process, obj_handle_t handle ) { struct thread *thread;