[NTDLL_APITEST] Show that registry strings can be longer than MAXUSHORT.
[reactos.git] / modules / 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 "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
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
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 */