ntdll: Implement NtAllocateLocallyUniqueId with server call.
diff --git a/server/protocol.def b/server/protocol.def
index d88bbe8..f3175a3 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -203,6 +203,12 @@
unsigned short attr;
} char_info_t;
+typedef struct
+{
+ unsigned int low_part;
+ int high_part;
+} luid_t;
+
#define MAX_ACL_LEN 65535
struct security_descriptor
@@ -2870,3 +2876,9 @@
@REPLY
int impersonation_level; /* impersonation level of the impersonation token */
@END
+
+/* Allocate a locally-unique identifier */
+@REQ(allocate_locally_unique_id)
+@REPLY
+ luid_t luid;
+@END
diff --git a/server/request.h b/server/request.h
index b24d7c7..44bab11 100644
--- a/server/request.h
+++ b/server/request.h
@@ -327,6 +327,7 @@
DECL_HANDLER(query_symlink);
DECL_HANDLER(get_object_info);
DECL_HANDLER(get_token_impersonation_level);
+DECL_HANDLER(allocate_locally_unique_id);
#ifdef WANT_REQUEST_HANDLERS
@@ -550,6 +551,7 @@
(req_handler)req_query_symlink,
(req_handler)req_get_object_info,
(req_handler)req_get_token_impersonation_level,
+ (req_handler)req_allocate_locally_unique_id,
};
#endif /* WANT_REQUEST_HANDLERS */
diff --git a/server/token.c b/server/token.c
index 278b6d1..3fc6bc3 100644
--- a/server/token.c
+++ b/server/token.c
@@ -365,6 +365,15 @@
*luid = prev_luid_value;
}
+DECL_HANDLER( allocate_locally_unique_id )
+{
+ LUID luid;
+
+ allocate_luid( &luid );
+ reply->luid.low_part = luid.LowPart;
+ reply->luid.high_part = luid.HighPart;
+}
+
static inline void luid_and_attr_from_privilege( LUID_AND_ATTRIBUTES *out, const struct privilege *in)
{
out->Luid = in->luid;
diff --git a/server/trace.c b/server/trace.c
index 56cc7f6..01c873f 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -239,6 +239,11 @@
fputc( '}', stderr );
}
+static void dump_luid( const luid_t *luid )
+{
+ fprintf( stderr, "%d.%u", luid->high_part, luid->low_part );
+}
+
static void dump_context( const CONTEXT *context )
{
#ifdef __i386__
@@ -3454,6 +3459,16 @@
fprintf( stderr, " impersonation_level=%d", req->impersonation_level );
}
+static void dump_allocate_locally_unique_id_request( const struct allocate_locally_unique_id_request *req )
+{
+}
+
+static void dump_allocate_locally_unique_id_reply( const struct allocate_locally_unique_id_reply *req )
+{
+ fprintf( stderr, " luid=" );
+ dump_luid( &req->luid );
+}
+
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_get_new_process_info_request,
@@ -3672,6 +3687,7 @@
(dump_func)dump_query_symlink_request,
(dump_func)dump_get_object_info_request,
(dump_func)dump_get_token_impersonation_level_request,
+ (dump_func)dump_allocate_locally_unique_id_request,
};
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -3892,6 +3908,7 @@
(dump_func)dump_query_symlink_reply,
(dump_func)dump_get_object_info_reply,
(dump_func)dump_get_token_impersonation_level_reply,
+ (dump_func)dump_allocate_locally_unique_id_reply,
};
static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -4112,6 +4129,7 @@
"query_symlink",
"get_object_info",
"get_token_impersonation_level",
+ "allocate_locally_unique_id",
};
static const struct