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