From: Rémi Bernon <rbernon(a)codeweavers.com>
---
server/file.h | 1 +
server/mapping.c | 7 +++++++
server/protocol.def | 10 +++++++++-
server/trace.c | 7 +++++++
server/winstation.c | 11 +++++++++++
tools/make_requests | 1 +
6 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/server/file.h b/server/file.h
index 691487179aa..0242fb3b3e7 100644
--- a/server/file.h
+++ b/server/file.h
@@ -194,6 +194,7 @@ extern void set_session_mapping( struct mapping *mapping );
extern unsigned int alloc_shared_object(void);
extern void free_shared_object( unsigned int index );
+extern obj_locator_t get_session_object_locator( unsigned int index );
extern const desktop_shm_t *get_shared_desktop( unsigned int index );
#define SHARED_WRITE_BEGIN( object_shm, type ) \
diff --git a/server/mapping.c b/server/mapping.c
index 218c9456d4b..3937817d264 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -1370,6 +1370,13 @@ void free_shared_object( unsigned int index )
mark_session_object_free( &session.objects[index] );
}
+obj_locator_t get_session_object_locator( unsigned int index )
+{
+ obj_locator_t locator = {.index = index};
+ if (index < session.object_capacity) locator.id = session.objects[index].id;
+ return locator;
+}
+
const desktop_shm_t *get_shared_desktop( unsigned int index )
{
if (index >= session.object_capacity) return NULL;
diff --git a/server/protocol.def b/server/protocol.def
index 1062e0ca689..b9eb8b6108e 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -908,6 +908,13 @@ typedef volatile struct
object_shm_t shm; /* object shared data */
} session_object_t;
+typedef struct
+{
+ object_id_t id; /* object unique id, object data is valid if
!= 0 */
+ unsigned int index; /* index of the object in session shared
memory */
+ int __pad;
+} obj_locator_t;
+
/****************************************************************/
/* Request declarations */
@@ -2819,7 +2826,8 @@ enum coords_relative
@REQ(get_thread_desktop)
thread_id_t tid; /* thread id */
@REPLY
- obj_handle_t handle; /* handle to the desktop */
+ obj_handle_t handle; /* handle to the desktop */
+ obj_locator_t locator; /* locator for the shared session object */
@END
diff --git a/server/trace.c b/server/trace.c
index d76d13152aa..94e74e3e3c1 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -467,6 +467,13 @@ static void dump_hw_input( const char *prefix, const hw_input_t
*input )
}
}
+static void dump_obj_locator( const char *prefix, const obj_locator_t *locator )
+{
+ fprintf( stderr, "%s{", prefix );
+ dump_uint64( "id=", &locator->id );
+ fprintf( stderr, ",index=%u}", locator->index );
+}
+
static void dump_luid( const char *prefix, const struct luid *luid )
{
fprintf( stderr, "%s%d.%u", prefix, luid->high_part, luid->low_part
);
diff --git a/server/winstation.c b/server/winstation.c
index 167ac8aeb62..6c47811c6f6 100644
--- a/server/winstation.c
+++ b/server/winstation.c
@@ -741,10 +741,21 @@ DECL_HANDLER(close_desktop)
/* get the thread current desktop */
DECL_HANDLER(get_thread_desktop)
{
+ struct desktop *desktop;
struct thread *thread;
+ reply->locator.id = 0;
+
if (!(thread = get_thread_from_id( req->tid ))) return;
reply->handle = thread->desktop;
+
+ if (!(desktop = get_thread_desktop( thread, 0 ))) clear_error();
+ else
+ {
+ reply->locator = get_session_object_locator( desktop->session_index );
+ release_object( desktop );
+ }
+
release_object( thread );
}
diff --git a/tools/make_requests b/tools/make_requests
index b20b53096ca..36254faec40 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -53,6 +53,7 @@ my %formats =
"generic_map_t" => [ 16, 4, "&dump_generic_map" ],
"ioctl_code_t" => [ 4, 4, "&dump_ioctl_code" ],
"hw_input_t" => [ 40, 8, "&dump_hw_input" ],
+ "obj_locator_t" => [ 16, 8, "&dump_obj_locator" ],
# varargs-only structures
"apc_call_t" => [ 64, 8 ],
"context_t" => [ 1728, 8 ],
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/3103