From 4703670a3c19c5e7b78880cfddee460b5f6b7f6a Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Mon, 13 Oct 2014 18:49:09 +0000 Subject: [PATCH 1/1] [ADVAPI32_APITESTS] - Add a few tests for DuplicateTokenEx svn path=/trunk/; revision=64736 --- rostests/apitests/advapi32/CMakeLists.txt | 1 + rostests/apitests/advapi32/DuplicateTokenEx.c | 63 +++++++++++++++++++ rostests/apitests/advapi32/testlist.c | 2 + 3 files changed, 66 insertions(+) create mode 100644 rostests/apitests/advapi32/DuplicateTokenEx.c diff --git a/rostests/apitests/advapi32/CMakeLists.txt b/rostests/apitests/advapi32/CMakeLists.txt index f148e220060..dd8802967fa 100644 --- a/rostests/apitests/advapi32/CMakeLists.txt +++ b/rostests/apitests/advapi32/CMakeLists.txt @@ -1,6 +1,7 @@ list(APPEND SOURCE CreateService.c + DuplicateTokenEx.c HKEY_CLASSES_ROOT.c LockDatabase.c QueryServiceConfig2.c diff --git a/rostests/apitests/advapi32/DuplicateTokenEx.c b/rostests/apitests/advapi32/DuplicateTokenEx.c new file mode 100644 index 00000000000..b8e64c69570 --- /dev/null +++ b/rostests/apitests/advapi32/DuplicateTokenEx.c @@ -0,0 +1,63 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Test for DupicateTokenEx + * PROGRAMMER: Jérôme Gardou + */ + +#include +#include +#include + +#define ok_luid_equal(Luid, Expected) \ + ok(RtlEqualLuid((Luid), (Expected)), "Got wrong LUID %08lx%08lx, expected (%08lx%08lx).\n", \ + (Luid)->HighPart, (Luid)->LowPart, (Expected)->HighPart, (Expected)->LowPart) +#define ok_luid_notequal(Luid, Comparand) \ + ok(!RtlEqualLuid((Luid), (Comparand)), "LUID is %08lx%08lx and should not be.\n", \ + (Luid)->HighPart, (Luid)->LowPart) + +START_TEST(DuplicateTokenEx) +{ + HANDLE ProcessToken, TokenDup; + TOKEN_STATISTICS ProcessTokenStats, TokenDupStats; + BOOL Result; + DWORD ReturnLength; + + /* Get the current process token */ + Result = OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &ProcessToken); + ok(Result, "OpenProcessToken failed. GLE: %lu.\n", GetLastError()); + /* And its statistics */ + Result = GetTokenInformation(ProcessToken, + TokenStatistics, + &ProcessTokenStats, + sizeof(ProcessTokenStats), + &ReturnLength); + ok(Result, "GetTokenInformation failed. GLE: %lu.\n", GetLastError()); + ok_size_t(ReturnLength, sizeof(ProcessTokenStats)); + + /* Duplicate it as primary token with the same access rights. */ + Result = DuplicateTokenEx(ProcessToken, 0, NULL, SecurityImpersonation, TokenPrimary, &TokenDup); + ok(Result, "DuplicateTokenEx failed. GLE: %lu.\n", GetLastError()); + /* Get the stats */ + Result = GetTokenInformation(TokenDup, + TokenStatistics, + &TokenDupStats, + sizeof(ProcessTokenStats), + &ReturnLength); + ok(Result, "GetTokenInformation failed. GLE: %lu.\n", GetLastError()); + ok_size_t(ReturnLength, sizeof(ProcessTokenStats)); + /* And test them */ + ok_luid_notequal(&TokenDupStats.TokenId, &ProcessTokenStats.TokenId); + ok_luid_equal(&TokenDupStats.AuthenticationId, &ProcessTokenStats.AuthenticationId); + ok(TokenDupStats.TokenType == TokenPrimary, "Duplicate token type is %d.\n", TokenDupStats.TokenType); + ok(TokenDupStats.ImpersonationLevel == SecurityImpersonation, + "Duplicate token impersonation level is %d.\n", TokenDupStats.ImpersonationLevel); + ok_dec(TokenDupStats.DynamicCharged, ProcessTokenStats.DynamicCharged); + ok_dec(TokenDupStats.DynamicAvailable, ProcessTokenStats.DynamicAvailable); + ok_dec(TokenDupStats.GroupCount, ProcessTokenStats.GroupCount); + ok_dec(TokenDupStats.PrivilegeCount, ProcessTokenStats.PrivilegeCount); + ok_luid_equal(&TokenDupStats.ModifiedId, &ProcessTokenStats.ModifiedId); + + CloseHandle(ProcessToken); + CloseHandle(TokenDup); +} diff --git a/rostests/apitests/advapi32/testlist.c b/rostests/apitests/advapi32/testlist.c index 80ad3d3f2d6..4c35a7b85d9 100644 --- a/rostests/apitests/advapi32/testlist.c +++ b/rostests/apitests/advapi32/testlist.c @@ -4,6 +4,7 @@ #include extern void func_CreateService(void); +extern void func_DuplicateTokenEx(void); extern void func_HKEY_CLASSES_ROOT(void); extern void func_LockDatabase(void); extern void func_QueryServiceConfig2(void); @@ -14,6 +15,7 @@ extern void func_SaferIdentifyLevel(void); const struct test winetest_testlist[] = { { "CreateService", func_CreateService }, + { "DuplicateTokenEx", func_DuplicateTokenEx }, { "HKEY_CLASSES_ROOT", func_HKEY_CLASSES_ROOT }, { "LockDatabase" , func_LockDatabase }, { "QueryServiceConfig2", func_QueryServiceConfig2 }, -- 2.17.1