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>
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)
17 START_TEST(DuplicateTokenEx
)
19 HANDLE ProcessToken
, TokenDup
;
20 TOKEN_STATISTICS ProcessTokenStats
, TokenDupStats
;
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
,
31 sizeof(ProcessTokenStats
),
33 ok(Result
, "GetTokenInformation failed. GLE: %lu.\n", GetLastError());
34 ok_size_t(ReturnLength
, sizeof(ProcessTokenStats
));
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());
40 Result
= GetTokenInformation(TokenDup
,
43 sizeof(ProcessTokenStats
),
45 ok(Result
, "GetTokenInformation failed. GLE: %lu.\n", GetLastError());
46 ok_size_t(ReturnLength
, sizeof(ProcessTokenStats
));
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
);
59 CloseHandle(ProcessToken
);
60 CloseHandle(TokenDup
);