From: Rémi Bernon rbernon@codeweavers.com
Through a generic object mapping mechanism using __wine_mapping name. --- server/async.c | 2 ++ server/atom.c | 1 + server/change.c | 1 + server/clipboard.c | 1 + server/completion.c | 1 + server/console.c | 7 +++++++ server/debugger.c | 2 ++ server/device.c | 9 +++++++++ server/directory.c | 2 ++ server/event.c | 2 ++ server/fd.c | 4 ++++ server/file.c | 1 + server/handle.c | 1 + server/hook.c | 1 + server/mailslot.c | 4 ++++ server/mapping.c | 28 ++++++++++++++++++++++++++++ server/mutex.c | 1 + server/named_pipe.c | 5 +++++ server/object.h | 3 +++ server/process.c | 3 +++ server/queue.c | 2 ++ server/registry.c | 1 + server/request.c | 1 + server/semaphore.c | 1 + server/serial.c | 1 + server/signal.c | 1 + server/sock.c | 3 +++ server/symlink.c | 1 + server/thread.c | 3 +++ server/timer.c | 1 + server/token.c | 1 + server/window.c | 1 + server/winstation.c | 10 ++++++++++ 33 files changed, 106 insertions(+)
diff --git a/server/async.c b/server/async.c index 9cb251df5ce..84504dfdf9e 100644 --- a/server/async.c +++ b/server/async.c @@ -89,6 +89,7 @@ static const struct object_ops async_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ async_destroy /* destroy */ }; @@ -688,6 +689,7 @@ static const struct object_ops iosb_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ iosb_destroy /* destroy */ }; diff --git a/server/atom.c b/server/atom.c index ff0799f5880..b2f3105138f 100644 --- a/server/atom.c +++ b/server/atom.c @@ -91,6 +91,7 @@ static const struct object_ops atom_table_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ atom_table_destroy /* destroy */ }; diff --git a/server/change.c b/server/change.c index 843e495411c..8cf3c960bf3 100644 --- a/server/change.c +++ b/server/change.c @@ -124,6 +124,7 @@ static const struct object_ops dir_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ dir_close_handle, /* close_handle */ dir_destroy /* destroy */ }; diff --git a/server/clipboard.c b/server/clipboard.c index 8118a467dd8..bc12a150cd7 100644 --- a/server/clipboard.c +++ b/server/clipboard.c @@ -88,6 +88,7 @@ static const struct object_ops clipboard_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ clipboard_destroy /* destroy */ }; diff --git a/server/completion.c b/server/completion.c index 6933195e72d..8a67a1cbfd8 100644 --- a/server/completion.c +++ b/server/completion.c @@ -87,6 +87,7 @@ static const struct object_ops completion_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ completion_destroy /* destroy */ }; diff --git a/server/console.c b/server/console.c index b64283baf4a..b9837c169aa 100644 --- a/server/console.c +++ b/server/console.c @@ -93,6 +93,7 @@ static const struct object_ops console_ops = NULL, /* unlink_name */ console_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ console_destroy /* destroy */ }; @@ -170,6 +171,7 @@ static const struct object_ops console_server_ops = NULL, /* unlink_name */ console_server_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ console_server_destroy /* destroy */ }; @@ -239,6 +241,7 @@ static const struct object_ops screen_buffer_ops = NULL, /* unlink_name */ screen_buffer_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ screen_buffer_destroy /* destroy */ }; @@ -288,6 +291,7 @@ static const struct object_ops console_device_ops = default_unlink_name, /* unlink_name */ console_device_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; @@ -325,6 +329,7 @@ static const struct object_ops console_input_ops = default_unlink_name, /* unlink_name */ console_input_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ console_input_destroy /* destroy */ }; @@ -382,6 +387,7 @@ static const struct object_ops console_output_ops = default_unlink_name, /* unlink_name */ console_output_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ console_output_destroy /* destroy */ }; @@ -440,6 +446,7 @@ static const struct object_ops console_connection_ops = default_unlink_name, /* unlink_name */ console_connection_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ console_connection_close_handle, /* close_handle */ console_connection_destroy /* destroy */ }; diff --git a/server/debugger.c b/server/debugger.c index 48adb244b09..9ce6bbd94cc 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -98,6 +98,7 @@ static const struct object_ops debug_event_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ debug_event_destroy /* destroy */ }; @@ -126,6 +127,7 @@ static const struct object_ops debug_obj_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ debug_obj_destroy /* destroy */ }; diff --git a/server/device.c b/server/device.c index 436dac6bfe9..2730d457816 100644 --- a/server/device.c +++ b/server/device.c @@ -78,6 +78,7 @@ static const struct object_ops irp_call_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ irp_call_destroy /* destroy */ }; @@ -118,6 +119,7 @@ static const struct object_ops device_manager_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ device_manager_destroy /* destroy */ }; @@ -175,6 +177,7 @@ static const struct object_ops device_ops = default_unlink_name, /* unlink_name */ device_open_file, /* open_file */ device_get_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ device_destroy /* destroy */ }; @@ -227,6 +230,7 @@ static const struct object_ops device_file_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ device_file_get_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ device_file_close_handle, /* close_handle */ device_file_destroy /* destroy */ }; @@ -253,6 +257,11 @@ struct list *no_kernel_obj_list( struct object *obj ) return NULL; }
+struct mapping *no_object_mapping( struct object *obj ) +{ + return NULL; +} + struct kernel_object { struct device_manager *manager; diff --git a/server/directory.c b/server/directory.c index 23d7eb0a2b7..b16527cee3b 100644 --- a/server/directory.c +++ b/server/directory.c @@ -81,6 +81,7 @@ static const struct object_ops object_type_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; @@ -131,6 +132,7 @@ static const struct object_ops directory_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ directory_destroy /* destroy */ }; diff --git a/server/event.c b/server/event.c index f1b79b1b35e..ce1adb5a9c5 100644 --- a/server/event.c +++ b/server/event.c @@ -84,6 +84,7 @@ static const struct object_ops event_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ event_get_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; @@ -131,6 +132,7 @@ static const struct object_ops keyed_event_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; diff --git a/server/fd.c b/server/fd.c index 8576882aaa9..85683ced951 100644 --- a/server/fd.c +++ b/server/fd.c @@ -181,6 +181,7 @@ static const struct object_ops fd_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ fd_destroy /* destroy */ }; @@ -222,6 +223,7 @@ static const struct object_ops device_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ device_destroy /* destroy */ }; @@ -262,6 +264,7 @@ static const struct object_ops inode_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ inode_destroy /* destroy */ }; @@ -304,6 +307,7 @@ static const struct object_ops file_lock_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; diff --git a/server/file.c b/server/file.c index 76c687833c9..d93b47a0b97 100644 --- a/server/file.c +++ b/server/file.c @@ -106,6 +106,7 @@ static const struct object_ops file_ops = NULL, /* unlink_name */ file_open_file, /* open_file */ file_get_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ file_destroy /* destroy */ }; diff --git a/server/handle.c b/server/handle.c index 0595fdb403b..3319d3b2b9c 100644 --- a/server/handle.c +++ b/server/handle.c @@ -138,6 +138,7 @@ static const struct object_ops handle_table_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ handle_table_destroy /* destroy */ }; diff --git a/server/hook.c b/server/hook.c index 5abdf39ad37..fd4f5a01224 100644 --- a/server/hook.c +++ b/server/hook.c @@ -92,6 +92,7 @@ static const struct object_ops hook_table_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ hook_table_destroy /* destroy */ }; diff --git a/server/mailslot.c b/server/mailslot.c index 2d8697ec9bd..9b856513fcf 100644 --- a/server/mailslot.c +++ b/server/mailslot.c @@ -86,6 +86,7 @@ static const struct object_ops mailslot_ops = default_unlink_name, /* unlink_name */ mailslot_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ mailslot_destroy /* destroy */ }; @@ -145,6 +146,7 @@ static const struct object_ops mail_writer_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ mail_writer_destroy /* destroy */ }; @@ -208,6 +210,7 @@ static const struct object_ops mailslot_device_ops = default_unlink_name, /* unlink_name */ mailslot_device_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ mailslot_device_destroy /* destroy */ }; @@ -238,6 +241,7 @@ static const struct object_ops mailslot_device_file_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ mailslot_device_file_destroy /* destroy */ }; diff --git a/server/mapping.c b/server/mapping.c index 785feb87cf4..ecdedf9475e 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -79,6 +79,7 @@ static const struct object_ops ranges_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ ranges_destroy /* destroy */ }; @@ -115,6 +116,7 @@ static const struct object_ops shared_map_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ shared_map_destroy /* destroy */ }; @@ -188,6 +190,7 @@ static const struct object_ops mapping_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ mapping_destroy /* destroy */ }; @@ -1281,10 +1284,35 @@ DECL_HANDLER(create_mapping) if (root) release_object( root ); }
+static struct mapping *open_object_mapping( user_handle_t handle, struct unicode_str *name ) +{ + static const WCHAR object_mappingW[] = {'_','_','w','i','n','e','_','m','a','p','p','i','n','g'}; + struct mapping *mapping; + struct object *object; + + if (name->len != sizeof(object_mappingW) || memcmp( name->str, object_mappingW, name->len )) return NULL; + if (!(object = get_handle_obj( current->process, handle, 0, NULL ))) + { + clear_error(); + return NULL; + } + mapping = object->ops->get_object_mapping( object ); + release_object( object ); + return mapping; +} + /* open a handle to a mapping */ DECL_HANDLER(open_mapping) { struct unicode_str name = get_req_unicode_str(); + struct mapping *mapping; + + if (req->rootdir && (mapping = open_object_mapping( req->rootdir, &name ))) + { + reply->handle = alloc_handle( current->process, &mapping->obj, req->access, req->attributes ); + release_object( mapping ); + return; + }
reply->handle = open_object( current->process, req->rootdir, req->access, &mapping_ops, &name, req->attributes ); diff --git a/server/mutex.c b/server/mutex.c index af0efe72132..7d48fe9064e 100644 --- a/server/mutex.c +++ b/server/mutex.c @@ -85,6 +85,7 @@ static const struct object_ops mutex_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ mutex_destroy /* destroy */ }; diff --git a/server/named_pipe.c b/server/named_pipe.c index f3404a33c3b..ffb6347cbd1 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -131,6 +131,7 @@ static const struct object_ops named_pipe_ops = default_unlink_name, /* unlink_name */ named_pipe_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ named_pipe_destroy /* destroy */ }; @@ -179,6 +180,7 @@ static const struct object_ops pipe_server_ops = NULL, /* unlink_name */ pipe_server_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ async_close_obj_handle, /* close_handle */ pipe_server_destroy /* destroy */ }; @@ -223,6 +225,7 @@ static const struct object_ops pipe_client_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ async_close_obj_handle, /* close_handle */ pipe_end_destroy /* destroy */ }; @@ -270,6 +273,7 @@ static const struct object_ops named_pipe_device_ops = default_unlink_name, /* unlink_name */ named_pipe_device_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ named_pipe_device_destroy /* destroy */ }; @@ -301,6 +305,7 @@ static const struct object_ops named_pipe_device_file_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ named_pipe_device_file_destroy /* destroy */ }; diff --git a/server/object.h b/server/object.h index dfdd691601f..05f593fca85 100644 --- a/server/object.h +++ b/server/object.h @@ -103,6 +103,8 @@ struct object_ops unsigned int options); /* return list of kernel objects */ struct list *(*get_kernel_obj_list)(struct object *); + /* return the memory mapping for the object */ + struct mapping *(*get_object_mapping)(struct object *); /* close a handle to this object */ int (*close_handle)(struct object *,struct process *,obj_handle_t); /* destroy on refcount == 0 */ @@ -181,6 +183,7 @@ extern void default_unlink_name( struct object *obj, struct object_name *name ); extern struct object *no_open_file( struct object *obj, unsigned int access, unsigned int sharing, unsigned int options ); extern struct list *no_kernel_obj_list( struct object *obj ); +extern struct mapping *no_object_mapping( struct object *obj ); extern int no_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); extern void no_destroy( struct object *obj ); #ifdef DEBUG_OBJECTS diff --git a/server/process.c b/server/process.c index a0d5ea64d97..a203bef0544 100644 --- a/server/process.c +++ b/server/process.c @@ -117,6 +117,7 @@ static const struct object_ops process_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ process_get_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ process_destroy /* destroy */ }; @@ -168,6 +169,7 @@ static const struct object_ops startup_info_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ startup_info_destroy /* destroy */ }; @@ -229,6 +231,7 @@ static const struct object_ops job_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ job_close_handle, /* close_handle */ job_destroy /* destroy */ }; diff --git a/server/queue.c b/server/queue.c index 831c16c93ed..5e79a52a83b 100644 --- a/server/queue.c +++ b/server/queue.c @@ -185,6 +185,7 @@ static const struct object_ops msg_queue_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ msg_queue_destroy /* destroy */ }; @@ -222,6 +223,7 @@ static const struct object_ops thread_input_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ thread_input_destroy /* destroy */ }; diff --git a/server/registry.c b/server/registry.c index da6a6d0982e..4e80af2d2ba 100644 --- a/server/registry.c +++ b/server/registry.c @@ -192,6 +192,7 @@ static const struct object_ops key_ops = key_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ key_close_handle, /* close_handle */ key_destroy /* destroy */ }; diff --git a/server/request.c b/server/request.c index 7021741c765..d93e86e3eed 100644 --- a/server/request.c +++ b/server/request.c @@ -102,6 +102,7 @@ static const struct object_ops master_socket_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ master_socket_destroy /* destroy */ }; diff --git a/server/semaphore.c b/server/semaphore.c index 53b42a886df..eaf909aa551 100644 --- a/server/semaphore.c +++ b/server/semaphore.c @@ -82,6 +82,7 @@ static const struct object_ops semaphore_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; diff --git a/server/serial.c b/server/serial.c index d665eb7fa35..64af16d6a51 100644 --- a/server/serial.c +++ b/server/serial.c @@ -97,6 +97,7 @@ static const struct object_ops serial_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ serial_destroy /* destroy */ }; diff --git a/server/signal.c b/server/signal.c index 19b76d44c16..45c6d77f552 100644 --- a/server/signal.c +++ b/server/signal.c @@ -74,6 +74,7 @@ static const struct object_ops handler_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ handler_destroy /* destroy */ }; diff --git a/server/sock.c b/server/sock.c index c34fd3eb5eb..c9ea380e26f 100644 --- a/server/sock.c +++ b/server/sock.c @@ -465,6 +465,7 @@ static const struct object_ops sock_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ sock_close_handle, /* close_handle */ sock_destroy /* destroy */ }; @@ -3566,6 +3567,7 @@ static const struct object_ops ifchange_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ ifchange_destroy /* destroy */ }; @@ -3787,6 +3789,7 @@ static const struct object_ops socket_device_ops = default_unlink_name, /* unlink_name */ socket_device_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; diff --git a/server/symlink.c b/server/symlink.c index dd28efd3a75..0492b83172a 100644 --- a/server/symlink.c +++ b/server/symlink.c @@ -83,6 +83,7 @@ static const struct object_ops symlink_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ symlink_destroy /* destroy */ }; diff --git a/server/thread.c b/server/thread.c index 56f57cefd8f..5673c9d4809 100644 --- a/server/thread.c +++ b/server/thread.c @@ -108,6 +108,7 @@ static const struct object_ops thread_apc_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ thread_apc_destroy /* destroy */ }; @@ -150,6 +151,7 @@ static const struct object_ops context_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ no_destroy /* destroy */ }; @@ -199,6 +201,7 @@ static const struct object_ops thread_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ thread_get_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ destroy_thread /* destroy */ }; diff --git a/server/timer.c b/server/timer.c index 96dc9d00ca1..3f083db56b8 100644 --- a/server/timer.c +++ b/server/timer.c @@ -88,6 +88,7 @@ static const struct object_ops timer_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ timer_destroy /* destroy */ }; diff --git a/server/token.c b/server/token.c index 4df8d2e0c6e..94e3fd0b121 100644 --- a/server/token.c +++ b/server/token.c @@ -155,6 +155,7 @@ static const struct object_ops token_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ token_destroy /* destroy */ }; diff --git a/server/window.c b/server/window.c index 242e93f303a..8fb4162f9f4 100644 --- a/server/window.c +++ b/server/window.c @@ -119,6 +119,7 @@ static const struct object_ops window_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ no_close_handle, /* close_handle */ window_destroy /* destroy */ }; diff --git a/server/winstation.c b/server/winstation.c index cedda7d5470..905a560d8d6 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -52,6 +52,7 @@ static struct object *winstation_lookup_name( struct object *obj, struct unicode static void winstation_destroy( struct object *obj ); static void desktop_dump( struct object *obj, int verbose ); static int desktop_link_name( struct object *obj, struct object_name *name, struct object *parent ); +static struct mapping *desktop_get_object_mapping( 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 );
@@ -89,6 +90,7 @@ static const struct object_ops winstation_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + no_object_mapping, /* get_object_mapping */ winstation_close_handle, /* close_handle */ winstation_destroy /* destroy */ }; @@ -129,6 +131,7 @@ static const struct object_ops desktop_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ + desktop_get_object_mapping, /* get_object_mapping */ desktop_close_handle, /* close_handle */ desktop_destroy /* destroy */ }; @@ -286,6 +289,13 @@ static int desktop_link_name( struct object *obj, struct object_name *name, stru return 1; }
+static struct mapping *desktop_get_object_mapping( struct object *obj ) +{ + struct desktop *desktop = (struct desktop *)obj; + assert( obj->ops == &desktop_ops ); + return (struct mapping *)grab_object( desktop->shared_mapping ); +} + static int desktop_close_handle( struct object *obj, struct process *process, obj_handle_t handle ) { struct thread *thread;