diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 5ae51f652bc..7175ae7fd29 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -4042,6 +4042,19 @@ struct get_object_info_reply }; + +struct unlink_object_request +{ + struct request_header __header; + obj_handle_t handle; +}; +struct unlink_object_reply +{ + struct reply_header __header; +}; + + + struct get_token_impersonation_level_request { struct request_header __header; @@ -4516,6 +4529,7 @@ enum request REQ_open_symlink, REQ_query_symlink, REQ_get_object_info, + REQ_unlink_object, REQ_get_token_impersonation_level, REQ_allocate_locally_unique_id, REQ_create_device_manager, @@ -4757,6 +4771,7 @@ union generic_request struct open_symlink_request open_symlink_request; struct query_symlink_request query_symlink_request; struct get_object_info_request get_object_info_request; + struct unlink_object_request unlink_object_request; struct get_token_impersonation_level_request get_token_impersonation_level_request; struct allocate_locally_unique_id_request allocate_locally_unique_id_request; struct create_device_manager_request create_device_manager_request; @@ -4996,6 +5011,7 @@ union generic_reply struct open_symlink_reply open_symlink_reply; struct query_symlink_reply query_symlink_reply; struct get_object_info_reply get_object_info_reply; + struct unlink_object_reply unlink_object_reply; struct get_token_impersonation_level_reply get_token_impersonation_level_reply; struct allocate_locally_unique_id_reply allocate_locally_unique_id_reply; struct create_device_manager_reply create_device_manager_reply; @@ -5015,6 +5031,6 @@ union generic_reply struct set_window_layered_info_reply set_window_layered_info_reply; }; -#define SERVER_PROTOCOL_VERSION 342 +#define SERVER_PROTOCOL_VERSION 343 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/directory.c b/server/directory.c index d1d323cccc6..f2545eadb5b 100644 --- a/server/directory.c +++ b/server/directory.c @@ -508,3 +508,15 @@ DECL_HANDLER(get_directory_entry) release_object( dir ); } } + +/* unlink a named object */ +DECL_HANDLER(unlink_object) +{ + struct object *obj = get_handle_obj( current->process, req->handle, 0, NULL ); + + if (obj) + { + unlink_named_object( obj ); + release_object( obj ); + } +} diff --git a/server/protocol.def b/server/protocol.def index d9fd48cb28a..b1258b2f78a 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2913,6 +2913,13 @@ enum message_type unsigned int ref_count; /* object ref count */ @END + +/* Unlink a named object */ +@REQ(unlink_object) + obj_handle_t handle; /* handle to the object */ +@END + + /* Query the impersonation level of an impersonation token */ @REQ(get_token_impersonation_level) obj_handle_t handle; /* handle to the object */ diff --git a/server/request.h b/server/request.h index 308b6205b4e..5fc5236004a 100644 --- a/server/request.h +++ b/server/request.h @@ -328,6 +328,7 @@ DECL_HANDLER(create_symlink); DECL_HANDLER(open_symlink); DECL_HANDLER(query_symlink); DECL_HANDLER(get_object_info); +DECL_HANDLER(unlink_object); DECL_HANDLER(get_token_impersonation_level); DECL_HANDLER(allocate_locally_unique_id); DECL_HANDLER(create_device_manager); @@ -568,6 +569,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_open_symlink, (req_handler)req_query_symlink, (req_handler)req_get_object_info, + (req_handler)req_unlink_object, (req_handler)req_get_token_impersonation_level, (req_handler)req_allocate_locally_unique_id, (req_handler)req_create_device_manager, diff --git a/server/trace.c b/server/trace.c index 8cdc0214c4c..8e1737eb8c6 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3595,6 +3595,11 @@ static void dump_get_object_info_reply( const struct get_object_info_reply *req fprintf( stderr, " ref_count=%08x", req->ref_count ); } +static void dump_unlink_object_request( const struct unlink_object_request *req ) +{ + fprintf( stderr, " handle=%p", req->handle ); +} + static void dump_get_token_impersonation_level_request( const struct get_token_impersonation_level_request *req ) { fprintf( stderr, " handle=%p", req->handle ); @@ -4011,6 +4016,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_open_symlink_request, (dump_func)dump_query_symlink_request, (dump_func)dump_get_object_info_request, + (dump_func)dump_unlink_object_request, (dump_func)dump_get_token_impersonation_level_request, (dump_func)dump_allocate_locally_unique_id_request, (dump_func)dump_create_device_manager_request, @@ -4248,6 +4254,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_open_symlink_reply, (dump_func)dump_query_symlink_reply, (dump_func)dump_get_object_info_reply, + (dump_func)0, (dump_func)dump_get_token_impersonation_level_reply, (dump_func)dump_allocate_locally_unique_id_reply, (dump_func)dump_create_device_manager_reply, @@ -4485,6 +4492,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "open_symlink", "query_symlink", "get_object_info", + "unlink_object", "get_token_impersonation_level", "allocate_locally_unique_id", "create_device_manager",