1 /*
2  * PROJECT:         ReactOS API tests
3  * LICENSE:         GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE:         Tests for the NtAdjustGroupsToken API
5  * COPYRIGHT:       Copyright 2021 George Bișoc <george.bisoc@reactos.org>
6  */
7 
8 #include "precomp.h"
9 
10 static
11 HANDLE
12 GetProcessToken(
13     _In_ DWORD Access)
14 {
15     BOOL Success;
16     HANDLE Token;
17 
18     Success = OpenProcessToken(GetCurrentProcess(), Access, &Token);
19     if (!Success)
20     {
21         skip("Failed to open the process' token (error code: %lu)!\n", GetLastError());
22         return NULL;
23     }
24 
25     return Token;
26 }
27 
28 START_TEST(NtAdjustGroupsToken)
29 {
30     HANDLE TokenHandle;
31     NTSTATUS Status;
32 
33     /* Get the token from current process but with incorrect rights */
34     TokenHandle = GetProcessToken(TOKEN_DUPLICATE);
35 
36     /* We give an invalid handle */
37     Status = NtAdjustGroupsToken(NULL,
38                                  TRUE,
39                                  NULL,
40                                  0,
41                                  NULL,
42                                  NULL);
43     ok_hex(Status, STATUS_INVALID_HANDLE);
44 
45     /* We're trying to adjust the token's groups with wrong rights */
46     Status = NtAdjustGroupsToken(TokenHandle,
47                                  TRUE,
48                                  NULL,
49                                  0,
50                                  NULL,
51                                  NULL);
52     ok_hex(Status, STATUS_ACCESS_DENIED);
53 
54     /* Close our handle and open a new one with right access right */
55     CloseHandle(TokenHandle);
56     TokenHandle = GetProcessToken(TOKEN_ADJUST_GROUPS);
57 
58     /* We don't give a list of groups to be adjusted in token */
59     Status = NtAdjustGroupsToken(TokenHandle,
60                                  FALSE,
61                                  NULL,
62                                  0,
63                                  NULL,
64                                  NULL);
65     ok_hex(Status, STATUS_INVALID_PARAMETER);
66 
67     /* Reset the groups of an access token to default */
68     Status = NtAdjustGroupsToken(TokenHandle,
69                                  TRUE,
70                                  NULL,
71                                  0,
72                                  NULL,
73                                  NULL);
74     ok_hex(Status, STATUS_SUCCESS);
75 
76     CloseHandle(TokenHandle);
77 }
78