server/ntdll: Simplistic implementation of NtQueryObject(ObjectBasicInformation).
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 @@
{
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 @@
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 @@
@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(create_symlink);
DECL_HANDLER(open_symlink);
DECL_HANDLER(query_symlink);
+DECL_HANDLER(get_object_info);
#ifdef WANT_REQUEST_HANDLERS
@@ -544,6 +545,7 @@
(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 @@
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 @@
(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 @@
(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 @@
"create_symlink",
"open_symlink",
"query_symlink",
+ "get_object_info",
};
static const struct