[KMTESTS:MM]
[reactos.git] / rostests / apitests / ntdll / NtQuerySystemEnvironmentValue.c
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 <apitest.h>
9
10 #define WIN32_NO_STATUS
11 #include <ndk/setypes.h>
12 #include <ndk/rtlfuncs.h>
13 #include <ndk/exfuncs.h>
14
15 // Arbitrary-defined constants
16 #define MIN_BUFFER_LENGTH 4L
17 #define MAX_BUFFER_LENGTH 2048L
18
19 #define COUNT_OF(x) (sizeof((x))/sizeof((x)[0]))
20
21 typedef struct _TEST_CASE
22 {
23 NTSTATUS Result;
24 UNICODE_STRING VariableName;
25 BOOLEAN AdjustPrivileges;
26 ULONG ValueBufferLength;
27 ULONG MinimalExpectedReturnedLength;
28 ULONG MaximalExpectedReturnedLength;
29 } TEST_CASE, *PTEST_CASE;
30
31 static TEST_CASE TestCases[] =
32 {
33 //
34 // Non-existent variable name.
35 //
36 {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"NonExistent"), FALSE, 0, 0, 0},
37 {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"NonExistent"), FALSE, MIN_BUFFER_LENGTH, 0, 0},
38 {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"NonExistent"), FALSE, MAX_BUFFER_LENGTH, 0, 0},
39 {STATUS_UNSUCCESSFUL , RTL_CONSTANT_STRING(L"NonExistent"), TRUE , 0, 0, 0},
40 {STATUS_UNSUCCESSFUL , RTL_CONSTANT_STRING(L"NonExistent"), TRUE , MIN_BUFFER_LENGTH, 0, 0},
41 {STATUS_UNSUCCESSFUL , RTL_CONSTANT_STRING(L"NonExistent"), TRUE , MAX_BUFFER_LENGTH, 0, 0},
42
43 //
44 // Existent variable name.
45 //
46 {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"LastKnownGood"), FALSE, 0, 0, 0},
47 {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"LastKnownGood"), FALSE, MIN_BUFFER_LENGTH, 0, 0},
48 {STATUS_PRIVILEGE_NOT_HELD, RTL_CONSTANT_STRING(L"LastKnownGood"), FALSE, MAX_BUFFER_LENGTH, 0, 0},
49 {STATUS_BUFFER_OVERFLOW , RTL_CONSTANT_STRING(L"LastKnownGood"), TRUE , 0 , MIN_BUFFER_LENGTH, MAX_BUFFER_LENGTH},
50 {STATUS_BUFFER_OVERFLOW , RTL_CONSTANT_STRING(L"LastKnownGood"), TRUE , MIN_BUFFER_LENGTH, MIN_BUFFER_LENGTH, MAX_BUFFER_LENGTH},
51 {STATUS_SUCCESS , RTL_CONSTANT_STRING(L"LastKnownGood"), TRUE , MAX_BUFFER_LENGTH, MIN_BUFFER_LENGTH, MAX_BUFFER_LENGTH},
52 };
53
54 static void Test_API(IN ULONG TestNumber,
55 IN PTEST_CASE TestCase)
56 {
57 NTSTATUS Status = STATUS_SUCCESS;
58 BOOLEAN WasEnabled = FALSE;
59 WCHAR ValueBuffer[MAX_BUFFER_LENGTH / sizeof(WCHAR)];
60 ULONG ReturnedLength = 0;
61
62 //
63 // Adjust the privileges if asked for (we need to
64 // have already administrator privileges to do so).
65 //
66 if (TestCase->AdjustPrivileges)
67 {
68 Status = RtlAdjustPrivilege(SE_SYSTEM_ENVIRONMENT_PRIVILEGE,
69 TRUE,
70 FALSE,
71 &WasEnabled);
72 ok(NT_SUCCESS(Status), "RtlAdjustPrivilege(%lu) failed : 0x%08lx\n", TestNumber, Status);
73 }
74
75 //
76 // Get the system environment value and set the privilege back.
77 //
78 Status = NtQuerySystemEnvironmentValue(&TestCase->VariableName,
79 ValueBuffer,
80 TestCase->ValueBufferLength,
81 &ReturnedLength);
82
83 if (TestCase->AdjustPrivileges)
84 {
85 RtlAdjustPrivilege(SE_SYSTEM_ENVIRONMENT_PRIVILEGE,
86 WasEnabled,
87 FALSE,
88 &WasEnabled);
89 }
90
91 //
92 // Now check the results.
93 //
94 ok(Status == TestCase->Result,
95 "NtQuerySystemEnvironmentValue(%lu) failed : returned 0x%08lx, expected 0x%08lx\n",
96 TestNumber,
97 Status,
98 TestCase->Result);
99
100 ok( ((TestCase->MinimalExpectedReturnedLength <= ReturnedLength) && (ReturnedLength <= TestCase->MaximalExpectedReturnedLength)),
101 "NtQuerySystemEnvironmentValue(%lu) failed : returned length %lu, expected between %lu and %lu\n",
102 TestNumber,
103 ReturnedLength,
104 TestCase->MinimalExpectedReturnedLength,
105 TestCase->MaximalExpectedReturnedLength);
106 }
107
108 START_TEST(NtQuerySystemEnvironmentValue)
109 {
110 ULONG i;
111
112 for (i = 0 ; i < COUNT_OF(TestCases) ; ++i)
113 {
114 Test_API(i, &TestCases[i]);
115 }
116 }
117
118 /* EOF */