Module: wine Branch: master Commit: bae75024a430dd4486e4f5d7861cf8d6d4b85990 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bae75024a430dd4486e4f5d786...
Author: Vitaliy Margolen wine-patches@kievinfo.com Date: Wed Jan 24 23:43:04 2007 -0700
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 6057caa..35ce1be 100644 --- a/dlls/ntdll/om.c +++ b/dlls/ntdll/om.c @@ -63,6 +63,28 @@ NTSTATUS WINAPI NtQueryObject(IN 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 6a18286..be21fc4 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 f8f007d..f0c58a8 100644 --- a/server/handle.c +++ b/server/handle.c @@ -399,9 +399,9 @@ unsigned int get_handle_access( struct p { 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 72157fd..f49f331 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 5a7dcfc..b52c1aa 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[RE (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 0c0798e..f9ff323 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3424,6 +3424,17 @@ static void dump_query_symlink_reply( co 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_N (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 (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_ "create_symlink", "open_symlink", "query_symlink", + "get_object_info", };
static const struct