1 /*
2  * PROJECT:         ReactOS API Tests
3  * LICENSE:         GPLv2+ - See COPYING in the top level directory
4  * PURPOSE:         Test for the NtQuerySystemEnvironmentValue.
5  * PROGRAMMER:      Hermès BÉLUSCA - MAÏTO <hermes.belusca@sfr.fr>
6  */
7 
8 #include "precomp.h"
9 
10 // Arbitrary-defined constants
11 #define MIN_BUFFER_LENGTH 4L
12 #define MAX_BUFFER_LENGTH 2048L
13 
14 #define COUNT_OF(x) (sizeof((x))/sizeof((x)[0]))
15 
16 typedef struct _TEST_CASE
17 {
18     NTSTATUS        Result;
19     UNICODE_STRING  VariableName;
20     BOOLEAN         AdjustPrivileges;
21     ULONG           ValueBufferLength;
22     ULONG           MinimalExpectedReturnedLength;
23     ULONG           MaximalExpectedReturnedLength;
24 } TEST_CASE, *PTEST_CASE;
25 
26 static TEST_CASE TestCases[] =
27 {
28     //
29     // Non-existent variable name.
30     //
31     {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"NonExistent"),   FALSE, 0, 0, 0},
32     {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"NonExistent"),   FALSE, MIN_BUFFER_LENGTH, 0, 0},
33     {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"NonExistent"),   FALSE, MAX_BUFFER_LENGTH, 0, 0},
34     {STATUS_UNSUCCESSFUL      , RTL_CONSTANT_STRING(L"NonExistent"),   TRUE , 0, 0, 0},
35     {STATUS_UNSUCCESSFUL      , RTL_CONSTANT_STRING(L"NonExistent"),   TRUE , MIN_BUFFER_LENGTH, 0, 0},
36     {STATUS_UNSUCCESSFUL      , RTL_CONSTANT_STRING(L"NonExistent"),   TRUE , MAX_BUFFER_LENGTH, 0, 0},
37 
38     //
39     // Existent variable name.
40     //
41     {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"LastKnownGood"), FALSE, 0, 0, 0},
42     {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"LastKnownGood"), FALSE, MIN_BUFFER_LENGTH, 0, 0},
43     {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"LastKnownGood"), FALSE, MAX_BUFFER_LENGTH, 0, 0},
44     {STATUS_BUFFER_OVERFLOW   , RTL_CONSTANT_STRING(L"LastKnownGood"), TRUE , 0                , MIN_BUFFER_LENGTH, MAX_BUFFER_LENGTH},
45     {STATUS_BUFFER_OVERFLOW   , RTL_CONSTANT_STRING(L"LastKnownGood"), TRUE , MIN_BUFFER_LENGTH, MIN_BUFFER_LENGTH, MAX_BUFFER_LENGTH},
46     {STATUS_SUCCESS           , RTL_CONSTANT_STRING(L"LastKnownGood"), TRUE , MAX_BUFFER_LENGTH, MIN_BUFFER_LENGTH, MAX_BUFFER_LENGTH},
47 };
48 
Test_API(IN ULONG TestNumber,IN PTEST_CASE TestCase)49 static void Test_API(IN ULONG TestNumber,
50                      IN PTEST_CASE TestCase)
51 {
52     NTSTATUS Status = STATUS_SUCCESS;
53     BOOLEAN  WasEnabled = FALSE;
54     WCHAR    ValueBuffer[MAX_BUFFER_LENGTH / sizeof(WCHAR)];
55     ULONG    ReturnedLength = 0;
56 
57     //
58     // Adjust the privileges if asked for (we need to
59     // have already administrator privileges to do so).
60     //
61     if (TestCase->AdjustPrivileges)
62     {
63         Status = RtlAdjustPrivilege(SE_SYSTEM_ENVIRONMENT_PRIVILEGE,
64                                     TRUE,
65                                     FALSE,
66                                     &WasEnabled);
67         ok(NT_SUCCESS(Status), "RtlAdjustPrivilege(%lu) failed : 0x%08lx\n", TestNumber, Status);
68     }
69 
70     //
71     // Get the system environment value and set the privilege back.
72     //
73     Status = NtQuerySystemEnvironmentValue(&TestCase->VariableName,
74                                            ValueBuffer,
75                                            TestCase->ValueBufferLength,
76                                            &ReturnedLength);
77 
78     if (TestCase->AdjustPrivileges)
79     {
80         RtlAdjustPrivilege(SE_SYSTEM_ENVIRONMENT_PRIVILEGE,
81                            WasEnabled,
82                            FALSE,
83                            &WasEnabled);
84     }
85 
86     //
87     // Now check the results.
88     //
89     ok(Status == TestCase->Result,
90        "NtQuerySystemEnvironmentValue(%lu) failed : returned 0x%08lx, expected 0x%08lx\n",
91        TestNumber,
92        Status,
93        TestCase->Result);
94 
95     ok( ((TestCase->MinimalExpectedReturnedLength <= ReturnedLength) && (ReturnedLength <= TestCase->MaximalExpectedReturnedLength)),
96         "NtQuerySystemEnvironmentValue(%lu) failed : returned length %lu, expected between %lu and %lu\n",
97         TestNumber,
98         ReturnedLength,
99         TestCase->MinimalExpectedReturnedLength,
100         TestCase->MaximalExpectedReturnedLength);
101 }
102 
START_TEST(NtQuerySystemEnvironmentValue)103 START_TEST(NtQuerySystemEnvironmentValue)
104 {
105     ULONG i;
106 
107     for (i = 0 ; i < COUNT_OF(TestCases) ; ++i)
108     {
109         Test_API(i, &TestCases[i]);
110     }
111 }
112 
113 /* EOF */
114