server: Changed the get_next_hook request to allow retrieving the current hook too.
diff --git a/dlls/user/hook.c b/dlls/user/hook.c index b8996aa..d016337 100644 --- a/dlls/user/hook.c +++ b/dlls/user/hook.c
@@ -527,15 +527,16 @@ ZeroMemory( &info, sizeof(info) - sizeof(info.module) ); - SERVER_START_REQ( get_next_hook ) + SERVER_START_REQ( get_hook_info ) { req->handle = thread_info->hook; + req->get_next = 1; req->event = EVENT_MIN; wine_server_set_reply( req, info.module, sizeof(info.module)-sizeof(WCHAR) ); if (!wine_server_call_err( req )) { info.module[wine_server_reply_size(req) / sizeof(WCHAR)] = 0; - info.handle = reply->next; + info.handle = reply->handle; info.id = reply->id; info.pid = reply->pid; info.tid = reply->tid; @@ -718,9 +719,10 @@ { BOOL ret; - SERVER_START_REQ( get_next_hook ) + SERVER_START_REQ( get_hook_info ) { req->handle = info->handle; + req->get_next = 1; req->event = event; req->window = hwnd; req->object_id = object_id; @@ -730,7 +732,7 @@ if (ret) { info->module[wine_server_reply_size(req) / sizeof(WCHAR)] = 0; - info->handle = reply->next; + info->handle = reply->handle; info->proc = reply->proc; info->tid = reply->tid; }
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 84ad984..2f5394c 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h
@@ -3375,19 +3375,20 @@ -struct get_next_hook_request +struct get_hook_info_request { struct request_header __header; user_handle_t handle; + int get_next; int event; user_handle_t window; int object_id; int child_id; }; -struct get_next_hook_reply +struct get_hook_info_reply { struct reply_header __header; - user_handle_t next; + user_handle_t handle; int id; process_id_t pid; thread_id_t tid; @@ -3961,7 +3962,7 @@ REQ_remove_hook, REQ_start_hook_chain, REQ_finish_hook_chain, - REQ_get_next_hook, + REQ_get_hook_info, REQ_create_class, REQ_destroy_class, REQ_set_class_info, @@ -4182,7 +4183,7 @@ struct remove_hook_request remove_hook_request; struct start_hook_chain_request start_hook_chain_request; struct finish_hook_chain_request finish_hook_chain_request; - struct get_next_hook_request get_next_hook_request; + struct get_hook_info_request get_hook_info_request; struct create_class_request create_class_request; struct destroy_class_request destroy_class_request; struct set_class_info_request set_class_info_request; @@ -4401,7 +4402,7 @@ struct remove_hook_reply remove_hook_reply; struct start_hook_chain_reply start_hook_chain_reply; struct finish_hook_chain_reply finish_hook_chain_reply; - struct get_next_hook_reply get_next_hook_reply; + struct get_hook_info_reply get_hook_info_reply; struct create_class_reply create_class_reply; struct destroy_class_reply destroy_class_reply; struct set_class_info_reply set_class_info_reply; @@ -4425,6 +4426,6 @@ struct query_symlink_reply query_symlink_reply; }; -#define SERVER_PROTOCOL_VERSION 253 +#define SERVER_PROTOCOL_VERSION 254 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/hook.c b/server/hook.c index 14ad968..e8a72a81 100644 --- a/server/hook.c +++ b/server/hook.c
@@ -536,10 +536,10 @@ } -/* get the next hook to call */ -DECL_HANDLER(get_next_hook) +/* get the hook information */ +DECL_HANDLER(get_hook_info) { - struct hook *hook, *next; + struct hook *hook; if (!(hook = get_user_object( req->handle, USER_HOOK ))) return; if (hook->thread && (hook->thread != current)) @@ -547,22 +547,23 @@ set_error( STATUS_INVALID_HANDLE ); return; } - if ((next = get_next_hook( current, hook, req->event, req->window, req->object_id, req->child_id ))) + if (req->get_next && !(hook = get_next_hook( current, hook, req->event, req->window, + req->object_id, req->child_id ))) + return; + + reply->handle = hook->handle; + reply->id = hook->index + WH_MINHOOK; + reply->unicode = hook->unicode; + if (hook->module) set_reply_data( hook->module, min(hook->module_size,get_reply_max_size()) ); + if (run_hook_in_owner_thread( hook )) { - reply->next = next->handle; - reply->id = next->index + WH_MINHOOK; - reply->unicode = next->unicode; - if (next->module) set_reply_data( next->module, next->module_size ); - if (run_hook_in_owner_thread( next )) - { - reply->pid = get_process_id( next->owner->process ); - reply->tid = get_thread_id( next->owner ); - } - else - { - reply->pid = 0; - reply->tid = 0; - } - reply->proc = next->proc; + reply->pid = get_process_id( hook->owner->process ); + reply->tid = get_thread_id( hook->owner ); } + else + { + reply->pid = 0; + reply->tid = 0; + } + reply->proc = hook->proc; }
diff --git a/server/protocol.def b/server/protocol.def index 583c757..285da96 100644 --- a/server/protocol.def +++ b/server/protocol.def
@@ -2369,19 +2369,20 @@ @END -/* Get the next hook to call */ -@REQ(get_next_hook) +/* Get the hook information */ +@REQ(get_hook_info) user_handle_t handle; /* handle to the current hook */ + int get_next; /* do we want info about current or next hook? */ int event; /* signalled event */ user_handle_t window; /* handle to the event window */ int object_id; /* object id for out of context winevent */ int child_id; /* child id for out of context winevent */ @REPLY - user_handle_t next; /* handle to the next hook */ - int id; /* id of the next hook */ + user_handle_t handle; /* handle to the hook */ + int id; /* id of the hook */ process_id_t pid; /* process id for low-level keyboard/mouse hooks */ thread_id_t tid; /* thread id for low-level keyboard/mouse hooks */ - void* proc; /* next hook procedure */ + void* proc; /* hook procedure */ int unicode; /* is it a unicode hook? */ VARARG(module,unicode_str); /* module name */ @END
diff --git a/server/request.h b/server/request.h index aad0387..fd805e3 100644 --- a/server/request.h +++ b/server/request.h
@@ -302,7 +302,7 @@ DECL_HANDLER(remove_hook); DECL_HANDLER(start_hook_chain); DECL_HANDLER(finish_hook_chain); -DECL_HANDLER(get_next_hook); +DECL_HANDLER(get_hook_info); DECL_HANDLER(create_class); DECL_HANDLER(destroy_class); DECL_HANDLER(set_class_info); @@ -522,7 +522,7 @@ (req_handler)req_remove_hook, (req_handler)req_start_hook_chain, (req_handler)req_finish_hook_chain, - (req_handler)req_get_next_hook, + (req_handler)req_get_hook_info, (req_handler)req_create_class, (req_handler)req_destroy_class, (req_handler)req_set_class_info,
diff --git a/server/trace.c b/server/trace.c index 2c5b3e0..6e05882 100644 --- a/server/trace.c +++ b/server/trace.c
@@ -2951,18 +2951,19 @@ fprintf( stderr, " id=%d", req->id ); } -static void dump_get_next_hook_request( const struct get_next_hook_request *req ) +static void dump_get_hook_info_request( const struct get_hook_info_request *req ) { fprintf( stderr, " handle=%p,", req->handle ); + fprintf( stderr, " get_next=%d,", req->get_next ); fprintf( stderr, " event=%d,", req->event ); fprintf( stderr, " window=%p,", req->window ); fprintf( stderr, " object_id=%d,", req->object_id ); fprintf( stderr, " child_id=%d", req->child_id ); } -static void dump_get_next_hook_reply( const struct get_next_hook_reply *req ) +static void dump_get_hook_info_reply( const struct get_hook_info_reply *req ) { - fprintf( stderr, " next=%p,", req->next ); + fprintf( stderr, " handle=%p,", req->handle ); fprintf( stderr, " id=%d,", req->id ); fprintf( stderr, " pid=%04x,", req->pid ); fprintf( stderr, " tid=%04x,", req->tid ); @@ -3477,7 +3478,7 @@ (dump_func)dump_remove_hook_request, (dump_func)dump_start_hook_chain_request, (dump_func)dump_finish_hook_chain_request, - (dump_func)dump_get_next_hook_request, + (dump_func)dump_get_hook_info_request, (dump_func)dump_create_class_request, (dump_func)dump_destroy_class_request, (dump_func)dump_set_class_info_request, @@ -3694,7 +3695,7 @@ (dump_func)dump_remove_hook_reply, (dump_func)dump_start_hook_chain_reply, (dump_func)0, - (dump_func)dump_get_next_hook_reply, + (dump_func)dump_get_hook_info_reply, (dump_func)0, (dump_func)dump_destroy_class_reply, (dump_func)dump_set_class_info_reply, @@ -3911,7 +3912,7 @@ "remove_hook", "start_hook_chain", "finish_hook_chain", - "get_next_hook", + "get_hook_info", "create_class", "destroy_class", "set_class_info",