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