ReactOS 0.4.17-dev-116-ga4b6fe9
RtlQueryEnvironmentVariable.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS API tests
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Tests for RtlQueryEnvironmentVariable
5 * COPYRIGHT: Copyright 2026 Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8#include "precomp.h"
9
10typedef
15 _In_reads_(NameLength) PWSTR Name,
16 _In_ SIZE_T NameLength,
20
22
24{
25 static WCHAR TestEnv[] = L"TestVar=TestVal\0Foo=4\0EmptyVar\0Bar=8\0\0";
26 WCHAR Buffer[32];
29
30 HINSTANCE hinst = GetModuleHandleA("ntdll.dll");
32 GetProcAddress(hinst, "RtlQueryEnvironmentVariable");
34 {
35 ok(GetNTVersion() < _WIN32_WINNT_VISTA, "RtlQueryEnvironmentVariable not available on NT6+\n");
36 skip("RtlQueryEnvironmentVariable is not available\n");
37 return;
38 }
39
40 /* Query the TestVar environment variable length */
41 Status = pRtlQueryEnvironmentVariable(TestEnv, L"TestVar", 7, NULL, 0, &ReturnLength);
44
45 /* Test a buffer size that is too small */
46 memset(Buffer, 0xAB, sizeof(Buffer));
47 Status = pRtlQueryEnvironmentVariable(TestEnv, L"TestVar", 7, Buffer, 2, &ReturnLength);
51 ok_eq_wchar(Buffer[1], 0xABAB);
52
53 /* Test a buffer size that doesn't fit the terminating NULL char */
54 memset(Buffer, 0xAB, sizeof(Buffer));
55 Status = pRtlQueryEnvironmentVariable(TestEnv, L"TestVar", 7, Buffer, 7, &ReturnLength);
59 ok_eq_wchar(Buffer[1], 0xABAB);
60
61 /* Test a buffer size that is just large enough */
62 memset(Buffer, 0xAB, sizeof(Buffer));
63 Status = pRtlQueryEnvironmentVariable(TestEnv, L"TestVar", 7, Buffer, 8, &ReturnLength);
66 ok_eq_wstr(Buffer, L"TestVal");
68 ok_eq_wchar(Buffer[8], 0xABAB);
69
70 /* Test a buffer size that is larger than needed */
71 memset(Buffer, 0xAB, sizeof(Buffer));
75 ok_eq_wstr(Buffer, L"TestVal");
77 ok_eq_wchar(Buffer[8], 0xABAB);
78
79 /* Test a too big variable Length */
80 memset(Buffer, 0xAB, sizeof(Buffer));
81 Status = pRtlQueryEnvironmentVariable(TestEnv, L"TestVar", 8, Buffer, 8, &ReturnLength);
83 ok_eq_wchar(Buffer[0], 0xABAB);
84
85 /* Query the EmptyVar environment variable */
86 memset(Buffer, 0xAB, sizeof(Buffer));
89 ok_eq_wchar(Buffer[0], 0xABAB);
90
91 /* Query the Bar environment variable */
92 memset(Buffer, 0xAB, sizeof(Buffer));
95 ok_eq_wchar(Buffer[0], L'8');
97 ok_eq_wchar(Buffer[2], 0xABAB);
98}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
static FN_RtlQueryEnvironmentVariable * pRtlQueryEnvironmentVariable
NTSTATUS NTAPI FN_RtlQueryEnvironmentVariable(_In_opt_ PVOID Environment, _In_reads_(NameLength) PWSTR Name, _In_ SIZE_T NameLength, _Out_writes_(ValueLength) PWSTR Value, _In_ SIZE_T ValueLength, _Out_ PSIZE_T ReturnLength)
#define GetNTVersion()
Definition: apitest.h:17
#define ok_eq_wstr(value, expected)
Definition: apitest.h:141
#define ok_eq_size(value, expected)
Definition: apitest.h:126
#define ok_eq_wchar(value, expected)
Definition: apitest.h:124
#define ok_ntstatus(status, expected)
Definition: atltest.h:135
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
#define L(x)
Definition: resources.c:13
Status
Definition: gdiplustypes.h:25
PVOID PVOID PWCHAR PVOID Environment
Definition: env.c:47
static HINSTANCE hinst
Definition: edit.c:551
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define UNICODE_NULL
#define STATUS_VARIABLE_NOT_FOUND
Definition: ntstatus.h:586
short WCHAR
Definition: pedump.c:58
#define memset(x, y, z)
Definition: compat.h:39
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
ULONG_PTR * PSIZE_T
Definition: typedefs.h:80
uint16_t * PWSTR
Definition: typedefs.h:56
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
Definition: wdfregistry.h:275
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
NTSYSAPI NTSTATUS WINAPI RtlQueryEnvironmentVariable(WCHAR *, const WCHAR *, SIZE_T, WCHAR *, SIZE_T, SIZE_T *)