1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPLv2+ - See COPYING in the top level directory
4  * PURPOSE:         Test for DupicateTokenEx
5  * PROGRAMMER:      Jérôme Gardou <jerome.gardou@reactos.org>
6  */
7 
8 #include "precomp.h"
9 
10 #define ok_luid_equal(Luid, Expected)                                                                             \
11     ok(RtlEqualLuid((Luid), (Expected)), "Got wrong LUID %08lx%08lx, expected (%08lx%08lx).\n", \
12         (Luid)->HighPart, (Luid)->LowPart, (Expected)->HighPart, (Expected)->LowPart)
13 #define ok_luid_notequal(Luid, Comparand)                                                                             \
14     ok(!RtlEqualLuid((Luid), (Comparand)), "LUID is %08lx%08lx and should not be.\n", \
15         (Luid)->HighPart, (Luid)->LowPart)
16 
17 START_TEST(DuplicateTokenEx)
18 {
19     HANDLE ProcessToken, TokenDup;
20     TOKEN_STATISTICS ProcessTokenStats, TokenDupStats;
21     BOOL Result;
22     DWORD ReturnLength;
23 
24     /* Get the current process token */
25     Result = OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &ProcessToken);
26     ok(Result, "OpenProcessToken failed. GLE: %lu.\n", GetLastError());
27     /* And its statistics */
28     Result = GetTokenInformation(ProcessToken,
29         TokenStatistics,
30         &ProcessTokenStats,
31         sizeof(ProcessTokenStats),
32         &ReturnLength);
33     ok(Result, "GetTokenInformation failed. GLE: %lu.\n", GetLastError());
34     ok_size_t(ReturnLength, sizeof(ProcessTokenStats));
35 
36     /* Duplicate it as primary token with the same access rights. */
37     Result = DuplicateTokenEx(ProcessToken, 0, NULL, SecurityImpersonation, TokenPrimary, &TokenDup);
38     ok(Result, "DuplicateTokenEx failed. GLE: %lu.\n", GetLastError());
39     /* Get the stats */
40     Result = GetTokenInformation(TokenDup,
41         TokenStatistics,
42         &TokenDupStats,
43         sizeof(ProcessTokenStats),
44         &ReturnLength);
45     ok(Result, "GetTokenInformation failed. GLE: %lu.\n", GetLastError());
46     ok_size_t(ReturnLength, sizeof(ProcessTokenStats));
47     /* And test them */
48     ok_luid_notequal(&TokenDupStats.TokenId, &ProcessTokenStats.TokenId);
49     ok_luid_equal(&TokenDupStats.AuthenticationId, &ProcessTokenStats.AuthenticationId);
50     ok(TokenDupStats.TokenType == TokenPrimary, "Duplicate token type is %d.\n", TokenDupStats.TokenType);
51     ok(TokenDupStats.ImpersonationLevel == SecurityImpersonation,
52         "Duplicate token impersonation level is %d.\n", TokenDupStats.ImpersonationLevel);
53     ok_dec(TokenDupStats.DynamicCharged, ProcessTokenStats.DynamicCharged);
54     ok_dec(TokenDupStats.DynamicAvailable, ProcessTokenStats.DynamicAvailable);
55     ok_dec(TokenDupStats.GroupCount, ProcessTokenStats.GroupCount);
56     ok_dec(TokenDupStats.PrivilegeCount, ProcessTokenStats.PrivilegeCount);
57     ok_luid_equal(&TokenDupStats.ModifiedId, &ProcessTokenStats.ModifiedId);
58 
59     CloseHandle(ProcessToken);
60     CloseHandle(TokenDup);
61 }
62