Alexandre Julliard : ntdll: Implement NtQueryInformationToken(TokenSessionId).

Alexandre Julliard julliard at winehq.org
Thu Jul 1 15:53:50 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jul  1 16:22:26 2021 +0200

ntdll: Implement NtQueryInformationToken(TokenSessionId).

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46595
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/security.c     |  7 +++++--
 include/wine/server_protocol.h |  4 ++--
 server/protocol.def            |  1 +
 server/request.h               | 11 ++++++-----
 server/token.c                 |  1 +
 server/trace.c                 |  1 +
 6 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/dlls/ntdll/unix/security.c b/dlls/ntdll/unix/security.c
index 6a088e84e4d..b998750d798 100644
--- a/dlls/ntdll/unix/security.c
+++ b/dlls/ntdll/unix/security.c
@@ -418,10 +418,13 @@ NTSTATUS WINAPI NtQueryInformationToken( HANDLE token, TOKEN_INFORMATION_CLASS c
         break;
 
     case TokenSessionId:
+        SERVER_START_REQ( get_token_info )
         {
-            *(DWORD *)info = 0;
-            FIXME("QueryInformationToken( ..., TokenSessionId, ...) semi-stub\n");
+            req->handle = wine_server_obj_handle( token );
+            status = wine_server_call( req );
+            if (!status) *(DWORD *)info = reply->session_id;
         }
+        SERVER_END_REQ;
         break;
 
     case TokenVirtualizationEnabled:
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index d6815b7e349..867f99a7627 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -4913,12 +4913,12 @@ struct get_token_info_reply
     struct reply_header __header;
     luid_t         token_id;
     luid_t         modified_id;
+    unsigned int   session_id;
     int            primary;
     int            impersonation_level;
     int            elevation;
     int            group_count;
     int            privilege_count;
-    char __pad_44[4];
 };
 
 
@@ -6252,7 +6252,7 @@ union generic_reply
 
 /* ### protocol_version begin ### */
 
-#define SERVER_PROTOCOL_VERSION 723
+#define SERVER_PROTOCOL_VERSION 724
 
 /* ### protocol_version end ### */
 
diff --git a/server/protocol.def b/server/protocol.def
index 8eb7e3e99ca..10402ca2db3 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3432,6 +3432,7 @@ struct handle_info
 @REPLY
     luid_t         token_id;      /* locally-unique identifier of the token */
     luid_t         modified_id;   /* locally-unique identifier of the modified version of the token */
+    unsigned int   session_id;    /* token session id */
     int            primary;       /* is the token primary or impersonation? */
     int            impersonation_level; /* level of impersonation */
     int            elevation;     /* elevation type */
diff --git a/server/request.h b/server/request.h
index 19e5a2a84f1..a5490fd215a 100644
--- a/server/request.h
+++ b/server/request.h
@@ -2088,11 +2088,12 @@ C_ASSERT( FIELD_OFFSET(struct get_token_info_request, handle) == 12 );
 C_ASSERT( sizeof(struct get_token_info_request) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, token_id) == 8 );
 C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, modified_id) == 16 );
-C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, primary) == 24 );
-C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, impersonation_level) == 28 );
-C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, elevation) == 32 );
-C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, group_count) == 36 );
-C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, privilege_count) == 40 );
+C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, session_id) == 24 );
+C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, primary) == 28 );
+C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, impersonation_level) == 32 );
+C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, elevation) == 36 );
+C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, group_count) == 40 );
+C_ASSERT( FIELD_OFFSET(struct get_token_info_reply, privilege_count) == 44 );
 C_ASSERT( sizeof(struct get_token_info_reply) == 48 );
 C_ASSERT( FIELD_OFFSET(struct create_linked_token_request, handle) == 12 );
 C_ASSERT( sizeof(struct create_linked_token_request) == 16 );
diff --git a/server/token.c b/server/token.c
index 9c72c2a6bed..5d2fc9555a2 100644
--- a/server/token.c
+++ b/server/token.c
@@ -1601,6 +1601,7 @@ DECL_HANDLER(get_token_info)
     {
         reply->token_id = token->token_id;
         reply->modified_id = token->modified_id;
+        reply->session_id = token->session_id;
         reply->primary = token->primary;
         reply->impersonation_level = token->impersonation_level;
         reply->elevation = token->elevation;
diff --git a/server/trace.c b/server/trace.c
index f27cc47170b..c65694ad644 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -4251,6 +4251,7 @@ static void dump_get_token_info_reply( const struct get_token_info_reply *req )
 {
     dump_luid( " token_id=", &req->token_id );
     dump_luid( ", modified_id=", &req->modified_id );
+    fprintf( stderr, ", session_id=%08x", req->session_id );
     fprintf( stderr, ", primary=%d", req->primary );
     fprintf( stderr, ", impersonation_level=%d", req->impersonation_level );
     fprintf( stderr, ", elevation=%d", req->elevation );




More information about the wine-cvs mailing list