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 */ 114