[COM_APITEST] Add a test for CLSID_ActiveDesktop
[reactos.git] / modules / rostests / apitests / advapi32 / DuplicateTokenEx.c
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 }