From bae75024a430dd4486e4f5d7861cf8d6d4b85990 Mon Sep 17 00:00:00 2001 From: Vitaliy Margolen Date: Wed, 24 Jan 2007 23:43:04 -0700 Subject: [PATCH] server/ntdll: Simplistic implementation of NtQueryObject(ObjectBasicInformation). --- dlls/ntdll/om.c | 22 ++++++++++++++++++++++ include/wine/server_protocol.h | 19 ++++++++++++++++++- server/handle.c | 15 +++++++++++++-- server/protocol.def | 9 +++++++++ server/request.h | 2 ++ server/trace.c | 14 ++++++++++++++ 6 files changed, 78 insertions(+), 3 deletions(-) diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c index 6057caa0170..35ce1bee6fe 100644 --- a/dlls/ntdll/om.c +++ b/dlls/ntdll/om.c @@ -63,6 +63,28 @@ NTSTATUS WINAPI NtQueryObject(IN HANDLE handle, switch (info_class) { + case ObjectBasicInformation: + { + POBJECT_BASIC_INFORMATION p = (POBJECT_BASIC_INFORMATION)ptr; + + if (len < sizeof(*p)) return STATUS_INVALID_BUFFER_SIZE; + + SERVER_START_REQ( get_object_info ) + { + req->handle = handle; + status = wine_server_call( req ); + if (status == STATUS_SUCCESS) + { + memset( p, 0, sizeof(*p) ); + p->GrantedAccess = reply->access; + p->PointerCount = reply->ref_count; + p->HandleCount = 1; /* at least one */ + if (used_len) *used_len = sizeof(*p); + } + } + SERVER_END_REQ; + } + break; case ObjectDataInformation: { OBJECT_DATA_INFORMATION* p = (OBJECT_DATA_INFORMATION*)ptr; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 6a18286b0af..be21fc4d984 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -3967,6 +3967,20 @@ struct query_symlink_reply }; + +struct get_object_info_request +{ + struct request_header __header; + obj_handle_t handle; +}; +struct get_object_info_reply +{ + struct reply_header __header; + unsigned int access; + unsigned int ref_count; +}; + + enum request { REQ_new_process, @@ -4183,6 +4197,7 @@ enum request REQ_create_symlink, REQ_open_symlink, REQ_query_symlink, + REQ_get_object_info, REQ_NB_REQUESTS }; @@ -4404,6 +4419,7 @@ union generic_request struct create_symlink_request create_symlink_request; struct open_symlink_request open_symlink_request; struct query_symlink_request query_symlink_request; + struct get_object_info_request get_object_info_request; }; union generic_reply { @@ -4623,8 +4639,9 @@ union generic_reply struct create_symlink_reply create_symlink_reply; struct open_symlink_reply open_symlink_reply; struct query_symlink_reply query_symlink_reply; + struct get_object_info_reply get_object_info_reply; }; -#define SERVER_PROTOCOL_VERSION 274 +#define SERVER_PROTOCOL_VERSION 275 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/handle.c b/server/handle.c index f8f007d7152..f0c58a8c243 100644 --- a/server/handle.c +++ b/server/handle.c @@ -399,9 +399,9 @@ unsigned int get_handle_access( struct process *process, obj_handle_t handle ) { struct handle_entry *entry; - if (get_magic_handle( handle )) return ~0U; /* magic handles have all access rights */ + if (get_magic_handle( handle )) return ~RESERVED_ALL; /* magic handles have all access rights */ if (!(entry = get_handle( process, handle ))) return 0; - return entry->access; + return entry->access & ~RESERVED_ALL; } /* find the first inherited handle of the given type */ @@ -540,3 +540,14 @@ DECL_HANDLER(dup_handle) release_object( src ); } } + +DECL_HANDLER(get_object_info) +{ + struct object *obj; + + if (!(obj = get_handle_obj( current->process, req->handle, 0, NULL ))) return; + + reply->access = get_handle_access( current->process, req->handle ); + reply->ref_count = obj->refcount; + release_object( obj ); +} diff --git a/server/protocol.def b/server/protocol.def index 72157fd14ef..f49f3317fac 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2848,3 +2848,12 @@ enum message_type @REPLY VARARG(target_name,unicode_str); /* target name */ @END + + +/* Query basic object information */ +@REQ(get_object_info) + obj_handle_t handle; /* handle to the object */ +@REPLY + unsigned int access; /* granted access mask */ + unsigned int ref_count; /* object ref count */ +@END diff --git a/server/request.h b/server/request.h index 5a7dcfcd8f0..b52c1aa4d88 100644 --- a/server/request.h +++ b/server/request.h @@ -324,6 +324,7 @@ DECL_HANDLER(open_directory); DECL_HANDLER(create_symlink); DECL_HANDLER(open_symlink); DECL_HANDLER(query_symlink); +DECL_HANDLER(get_object_info); #ifdef WANT_REQUEST_HANDLERS @@ -544,6 +545,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_create_symlink, (req_handler)req_open_symlink, (req_handler)req_query_symlink, + (req_handler)req_get_object_info, }; #endif /* WANT_REQUEST_HANDLERS */ diff --git a/server/trace.c b/server/trace.c index 0c0798efa76..f9ff323bce6 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3424,6 +3424,17 @@ static void dump_query_symlink_reply( const struct query_symlink_reply *req ) dump_varargs_unicode_str( cur_size ); } +static void dump_get_object_info_request( const struct get_object_info_request *req ) +{ + fprintf( stderr, " handle=%p", req->handle ); +} + +static void dump_get_object_info_reply( const struct get_object_info_reply *req ) +{ + fprintf( stderr, " access=%08x,", req->access ); + fprintf( stderr, " ref_count=%08x", req->ref_count ); +} + static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_new_process_request, (dump_func)dump_get_new_process_info_request, @@ -3639,6 +3650,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_create_symlink_request, (dump_func)dump_open_symlink_request, (dump_func)dump_query_symlink_request, + (dump_func)dump_get_object_info_request, }; static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { @@ -3856,6 +3868,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_create_symlink_reply, (dump_func)dump_open_symlink_reply, (dump_func)dump_query_symlink_reply, + (dump_func)dump_get_object_info_reply, }; static const char * const req_names[REQ_NB_REQUESTS] = { @@ -4073,6 +4086,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "create_symlink", "open_symlink", "query_symlink", + "get_object_info", }; static const struct