Alexandre Julliard : user32: Add functions for manipulating client-side user handles.
Alexandre Julliard
julliard at winehq.org
Mon Oct 12 11:19:47 CDT 2009
Module: wine
Branch: master
Commit: d996f7e334d3274465b75cacf02695b4314040ac
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d996f7e334d3274465b75cacf02695b4314040ac
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Oct 12 14:27:55 2009 +0200
user32: Add functions for manipulating client-side user handles.
---
dlls/user32/user_private.h | 19 ++++++++++
dlls/user32/win.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 102 insertions(+), 0 deletions(-)
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 1ff6ef4..1020064 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -170,6 +170,25 @@ extern void USER_unload_driver(void) DECLSPEC_HIDDEN;
struct received_message_info;
struct hook16_queue_info;
+enum user_obj_type
+{
+ USER_WINDOW = 1, /* window */
+ USER_DWP /* DeferWindowPos structure */
+};
+
+struct user_object
+{
+ HANDLE handle;
+ enum user_obj_type type;
+};
+
+#define OBJ_OTHER_PROCESS ((void *)1) /* returned by get_user_handle_ptr on unknown handles */
+
+HANDLE alloc_user_handle( struct user_object *ptr, enum user_obj_type type ) DECLSPEC_HIDDEN;
+void *get_user_handle_ptr( HANDLE handle, enum user_obj_type type ) DECLSPEC_HIDDEN;
+void release_user_handle_ptr( void *ptr ) DECLSPEC_HIDDEN;
+void *free_user_handle( HANDLE handle, enum user_obj_type type ) DECLSPEC_HIDDEN;
+
/* type of message-sending functions that need special WM_CHAR handling */
enum wm_char_mapping
{
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 44b15b1..28ea841 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -91,6 +91,89 @@ static inline void set_win_data( void *ptr, LONG_PTR val, UINT size )
static void *user_handles[NB_USER_HANDLES];
/***********************************************************************
+ * alloc_user_handle
+ */
+HANDLE alloc_user_handle( struct user_object *ptr, enum user_obj_type type )
+{
+ HANDLE handle = 0;
+
+ SERVER_START_REQ( alloc_user_handle )
+ {
+ if (!wine_server_call_err( req )) handle = wine_server_ptr_handle( reply->handle );
+ }
+ SERVER_END_REQ;
+
+ if (handle)
+ {
+ UINT index = USER_HANDLE_TO_INDEX( handle );
+
+ assert( index < NB_USER_HANDLES );
+ ptr->handle = handle;
+ ptr->type = type;
+ user_handles[index] = ptr;
+ }
+ return handle;
+}
+
+
+/***********************************************************************
+ * get_user_handle_ptr
+ */
+void *get_user_handle_ptr( HANDLE handle, enum user_obj_type type )
+{
+ struct user_object *ptr;
+ WORD index = USER_HANDLE_TO_INDEX( handle );
+
+ if (index >= NB_USER_HANDLES) return NULL;
+
+ USER_Lock();
+ if ((ptr = user_handles[index]))
+ {
+ if (ptr->type == type &&
+ ((UINT)(UINT_PTR)ptr->handle == (UINT)(UINT_PTR)handle ||
+ !HIWORD(handle) || HIWORD(handle) == 0xffff))
+ return ptr;
+ ptr = NULL;
+ }
+ else ptr = OBJ_OTHER_PROCESS;
+ USER_Unlock();
+ return ptr;
+}
+
+
+/***********************************************************************
+ * release_user_handle_ptr
+ */
+void release_user_handle_ptr( void *ptr )
+{
+ USER_Unlock();
+}
+
+
+/***********************************************************************
+ * free_user_handle
+ */
+void *free_user_handle( HANDLE handle, enum user_obj_type type )
+{
+ struct user_object *ptr;
+ WORD index = USER_HANDLE_TO_INDEX( handle );
+
+ if ((ptr = get_user_handle_ptr( handle, type )) && ptr != OBJ_OTHER_PROCESS)
+ {
+ SERVER_START_REQ( free_user_handle )
+ {
+ req->handle = wine_server_user_handle( handle );
+ if (!wine_server_call( req )) user_handles[index] = NULL;
+ else ptr = NULL;
+ }
+ SERVER_END_REQ;
+ release_user_handle_ptr( ptr );
+ }
+ return ptr;
+}
+
+
+/***********************************************************************
* create_window_handle
*
* Create a window handle with the server.
More information about the wine-cvs
mailing list