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>
10 // Arbitrary-defined constants
11 #define MIN_BUFFER_LENGTH 4L
12 #define MAX_BUFFER_LENGTH 2048L
14 #define COUNT_OF(x) (sizeof((x))/sizeof((x)[0]))
16 typedef struct _TEST_CASE
19 UNICODE_STRING VariableName
;
20 BOOLEAN AdjustPrivileges
;
21 ULONG ValueBufferLength
;
22 ULONG MinimalExpectedReturnedLength
;
23 ULONG MaximalExpectedReturnedLength
;
24 } TEST_CASE
, *PTEST_CASE
;
26 static TEST_CASE TestCases
[] =
29 // Non-existent variable name.
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},
39 // Existent variable name.
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
},
49 static void Test_API(IN ULONG TestNumber
,
50 IN PTEST_CASE TestCase
)
52 NTSTATUS Status
= STATUS_SUCCESS
;
53 BOOLEAN WasEnabled
= FALSE
;
54 WCHAR ValueBuffer
[MAX_BUFFER_LENGTH
/ sizeof(WCHAR
)];
55 ULONG ReturnedLength
= 0;
58 // Adjust the privileges if asked for (we need to
59 // have already administrator privileges to do so).
61 if (TestCase
->AdjustPrivileges
)
63 Status
= RtlAdjustPrivilege(SE_SYSTEM_ENVIRONMENT_PRIVILEGE
,
67 ok(NT_SUCCESS(Status
), "RtlAdjustPrivilege(%lu) failed : 0x%08lx\n", TestNumber
, Status
);
71 // Get the system environment value and set the privilege back.
73 Status
= NtQuerySystemEnvironmentValue(&TestCase
->VariableName
,
75 TestCase
->ValueBufferLength
,
78 if (TestCase
->AdjustPrivileges
)
80 RtlAdjustPrivilege(SE_SYSTEM_ENVIRONMENT_PRIVILEGE
,
87 // Now check the results.
89 ok(Status
== TestCase
->Result
,
90 "NtQuerySystemEnvironmentValue(%lu) failed : returned 0x%08lx, expected 0x%08lx\n",
95 ok( ((TestCase
->MinimalExpectedReturnedLength
<= ReturnedLength
) && (ReturnedLength
<= TestCase
->MaximalExpectedReturnedLength
)),
96 "NtQuerySystemEnvironmentValue(%lu) failed : returned length %lu, expected between %lu and %lu\n",
99 TestCase
->MinimalExpectedReturnedLength
,
100 TestCase
->MaximalExpectedReturnedLength
);
103 START_TEST(NtQuerySystemEnvironmentValue
)
107 for (i
= 0 ; i
< COUNT_OF(TestCases
) ; ++i
)
109 Test_API(i
, &TestCases
[i
]);