Vitaliy Margolen : server/ntdll: Simplistic implementation of NtQueryObject (ObjectBasicInformation).

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 25 06:12:24 CST 2007


Module: wine
Branch: master
Commit: bae75024a430dd4486e4f5d7861cf8d6d4b85990
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bae75024a430dd4486e4f5d7861cf8d6d4b85990

Author: Vitaliy Margolen <wine-patches at 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 */
+ at REQ(get_object_info)
+    obj_handle_t   handle;        /* handle to the object */
+ at REPLY
+    unsigned int   access;        /* granted access mask */
+    unsigned int   ref_count;     /* object ref count */
+ at 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




More information about the wine-cvs mailing list