25#define WIN32_NO_STATUS
47 'f',
'o',
'=',
't',
'i',
't',
'i',0,
48 'f',
'o',
'o',
'o',
'=',
't',
'u',
't',
'u',0,
49 's',
'r',
'=',
'a',
'n',
'=',
'o',
'u',
'o',0,
50 'g',
'=',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
51 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
52 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
53 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
54 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
55 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
56 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
57 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
58 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
59 'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',0,
60 '=',
'o',
'O',
'H',
'=',
'I',
'I',
'I',0,
87 {
"g", 256,
STATUS_SUCCESS,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
88"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
111 name.MaximumLength =
name.Length + 2;
121 "[%d]: Wrong status for '%s', expecting %lx got %lx\n",
123 if (nts ==
test->status)
switch (nts)
131 "Wrong result for %s/%d\n",
test->var,
test->len);
132 ok(bv[
test->len] ==
'@',
"Writing too far away in the buffer for %s/%d\n",
test->var,
test->len);
136 "Wrong returned length %d (too small buffer) for %s\n",
value.Length,
test->var );
147 value_length =
test->len;
154 "[%d]: Wrong status for '%s', expecting %lx got %lx\n",
156 if (nts ==
test->status)
switch (nts)
160 ok(return_length ==
strlen(
test->val),
"Wrong length %Id for %s\n",
161 return_length,
test->var);
162 ok(!
memcmp(bv, bn, return_length),
"Wrong result for %s/%d\n",
test->var,
test->len);
163 ok(bv[
test->len] ==
'@',
"Writing too far away in the buffer for %s/%d\n",
test->var,
test->len);
167 "Wrong returned length %Id (too small buffer) for %s\n", return_length,
test->var);
172 else win_skip(
"RtlQueryEnvironmentVariable not available, skipping tests\n");
177 static const struct test
183 {
"hello%foo%world",
"hellototoworld"},
184 {
"hello%=oOH%world",
"helloIIIworld"},
185 {
"hello%foo",
"hello%foo"},
186 {
"hello%bar%world",
"hello%bar%world"},
216 nts = pRtlExpandEnvironmentStrings_U(
small_env, &us_src, &us_dst, &ul);
219 "Wrong returned length for %s: %lu\n",
test->src, ul );
225 nts = pRtlExpandEnvironmentStrings_U(
small_env, &us_src, &us_dst, &ul);
228 "Wrong returned length for %s: %lu\n",
test->src, ul);
230 "Wrong returned length for %s: %lu\n",
test->src, ul);
231 ok(
lstrcmpW(
dst, rst) == 0,
"Wrong result for %s: expecting %s\n",
238 nts = pRtlExpandEnvironmentStrings_U(
small_env, &us_src, &us_dst, &ul);
241 "Wrong returned length for %s (with buffer too small): %lu\n",
test->src, ul);
242 ok(
dst[8] ==
'-',
"Writing too far in buffer (got %c/%d)\n",
dst[8],
dst[8]);
256 const WCHAR *expected_str;
258 int expected_count_out;
261 {
L"Long long value",
L"abcdefghijklmnopqrstuv", 0, 16 },
262 {
L"Long long value",
L"abcdefghijklmnopqrstuv", 1, 16 },
263 {
L"Long long value",
L"Lbcdefghijklmnopqrstuv", 2, 16 },
264 {
L"Long long value",
L"Locdefghijklmnopqrstuv", 3, 16 },
265 {
L"Long long value",
L"Long long valuopqrstuv", 15, 16 },
266 {
L"Long long value",
L"Long long value", 16, 16 },
267 {
L"Long long value",
L"Long long value", 17, 16 },
268 {
L"%TVAR% long long",
L"abcdefghijklmnopqrstuv", 0, 15 },
269 {
L"%TVAR% long long",
L"", 1, 15 },
270 {
L"%TVAR% long long",
L"", 2, 15 },
271 {
L"%TVAR% long long",
L"", 4, 15 },
272 {
L"%TVAR% long long",
L"WINE", 5, 15 },
273 {
L"%TVAR% long long",
L"WINE fghijklmnopqrstuv", 6, 15 },
274 {
L"%TVAR% long long",
L"WINE lghijklmnopqrstuv", 7, 15 },
275 {
L"%TVAR% long long",
L"WINE long long", 15, 15 },
276 {
L"%TVAR% long long",
L"WINE long long", 16, 15 },
277 {
L"%TVAR%%TVAR% long",
L"", 4, 14 },
278 {
L"%TVAR%%TVAR% long",
L"WINE", 5, 14 },
279 {
L"%TVAR%%TVAR% long",
L"WINE", 6, 14 },
280 {
L"%TVAR%%TVAR% long",
L"WINE", 8, 14 },
281 {
L"%TVAR%%TVAR% long",
L"WINEWINE", 9, 14 },
282 {
L"%TVAR%%TVAR% long",
L"WINEWINE jklmnopqrstuv", 10, 14 },
283 {
L"%TVAR%%TVAR% long",
L"WINEWINE long", 14, 14 },
284 {
L"%TVAR%%TVAR% long",
L"WINEWINE long", 15, 14 },
285 {
L"%TVAR% %TVAR% long",
L"WINE", 5, 15 },
286 {
L"%TVAR% %TVAR% long",
L"WINE ", 6, 15 },
287 {
L"%TVAR% %TVAR% long",
L"WINE ", 8, 15 },
288 {
L"%TVAR% %TVAR% long",
L"WINE ", 9, 15 },
289 {
L"%TVAR% %TVAR% long",
L"WINE WINE", 10, 15 },
290 {
L"%TVAR% %TVAR% long",
L"WINE WINE klmnopqrstuv", 11, 15 },
291 {
L"%TVAR% %TVAR% long",
L"WINE WINE llmnopqrstuv", 12, 15 },
292 {
L"%TVAR% %TVAR% long",
L"WINE WINE lonnopqrstuv", 14, 15 },
293 {
L"%TVAR% %TVAR% long",
L"WINE WINE long", 15, 15 },
294 {
L"%TVAR% %TVAR% long",
L"WINE WINE long", 16, 15 },
295 {
L"%TVAR2% long long",
L"abcdefghijklmnopqrstuv", 1, 18 },
296 {
L"%TVAR2% long long",
L"%bcdefghijklmnopqrstuv", 2, 18 },
297 {
L"%TVAR2% long long",
L"%TVdefghijklmnopqrstuv", 4, 18 },
298 {
L"%TVAR2% long long",
L"%TVAR2ghijklmnopqrstuv", 7, 18 },
299 {
L"%TVAR2% long long",
L"%TVAR2%hijklmnopqrstuv", 8, 18 },
300 {
L"%TVAR2% long long",
L"%TVAR2% ijklmnopqrstuv", 9, 18 },
301 {
L"%TVAR2% long long",
L"%TVAR2% ljklmnopqrstuv", 10, 18 },
302 {
L"%TVAR2% long long",
L"%TVAR2% long long", 18, 18 },
303 {
L"%TVAR2% long long",
L"%TVAR2% long long", 19, 18 },
304 {
L"%TVAR long long",
L"abcdefghijklmnopqrstuv", 1, 16 },
305 {
L"%TVAR long long",
L"%bcdefghijklmnopqrstuv", 2, 16 },
306 {
L"%TVAR long long",
L"%Tcdefghijklmnopqrstuv", 3, 16 },
307 {
L"%TVAR long long",
L"%TVAR long lonopqrstuv", 15, 16 },
308 {
L"%TVAR long long",
L"%TVAR long long", 16, 16 },
309 {
L"%TVAR long long",
L"%TVAR long long", 17, 16 },
318 if (pRtlExpandEnvironmentStrings !=
NULL)
328 ok(out_len ==
test->expected_count_out,
"Test %d: got %Iu\n",
i, out_len);
329 ok(
status == expected_status,
"Test %d: Expected status %lx, got %lx\n",
i, expected_status,
status);
348 status = pRtlExpandEnvironmentStrings_U(
NULL, &us_src, &us_dst, &out_len);
349 ok(out_len /
sizeof(
WCHAR) ==
test->expected_count_out,
"Test %d: got %lu\n",
i, out_len);
350 ok(
status == expected_status,
"Test %d: Expected status %lx, got %lx\n",
i, expected_status,
status);
383 "wrong maxlength %u/%u\n",
str->MaximumLength,
expect->MaximumLength );
385 if (!
str->MaximumLength)
397 if (
str->Length <
str->MaximumLength)
400 ok_(__FILE__,
line)( !
ptr[
str->Length /
sizeof(
WCHAR)],
"string not null-terminated %s\n",
405#define check_string(params,str,expect,pos) check_string_(__LINE__,params,str,expect,pos)
412 static WCHAR exeW[] = {
'c',
':',
'\\',
'f',
'o',
'o',
'.',
'e',
'x',
'e',0};
413 static WCHAR dummyW[] = {
'd',
'u',
'm',
'm',
'y',
'1',0};
414 static WCHAR dummy_dirW[
MAX_PATH] = {
'd',
'u',
'm',
'm',
'y',
'2',0};
415 static WCHAR dummy_env[] = {
'a',
'=',
'b',0,
'c',
'=',
'd',0,0};
430 "wrong AllocationSize %lx/%lx\n",
params->AllocationSize,
params->Size );
433 ok(
params->DebugFlags == 0,
"wrong Flags %lu\n",
params->DebugFlags );
434 ok(
params->ConsoleHandle == 0,
"wrong ConsoleHandle %p\n",
params->ConsoleHandle );
437 ok(
params->ConsoleFlags == 1,
"wrong ConsoleFlags %lu\n",
params->ConsoleFlags );
440 ok(
params->ConsoleFlags == 0,
"wrong ConsoleFlags %lu\n",
params->ConsoleFlags );
441 ok(
params->hStdInput == 0,
"wrong hStdInput %p\n",
params->hStdInput );
442 ok(
params->hStdOutput == 0,
"wrong hStdOutput %p\n",
params->hStdOutput );
443 ok(
params->hStdError == 0,
"wrong hStdError %p\n",
params->hStdError );
446 ok(
params->dwXSize == 0,
"wrong dwXSize %lu\n",
params->dwXSize );
447 ok(
params->dwYSize == 0,
"wrong dwYSize %lu\n",
params->dwYSize );
448 ok(
params->dwXCountChars == 0,
"wrong dwXCountChars %lu\n",
params->dwXCountChars );
449 ok(
params->dwYCountChars == 0,
"wrong dwYCountChars %lu\n",
params->dwYCountChars );
450 ok(
params->dwFillAttribute == 0,
"wrong dwFillAttribute %lu\n",
params->dwFillAttribute );
451 ok(
params->dwFlags == 0,
"wrong dwFlags %lu\n",
params->dwFlags );
452 ok(
params->wShowWindow == 0,
"wrong wShowWindow %lu\n",
params->wShowWindow );
456 "wrong length %x\n",
params->CurrentDirectory.DosPath.MaximumLength );
459 if (
params->DllPath.MaximumLength)
471 "wrong pos %Ix/%lx\n",
pos,
params->Size );
479 "wrong len %Ix/%Ix\n",
params->EnvironmentSize,
481 pRtlDestroyProcessParameters(
params );
489 "wrong AllocationSize %lx/%lx\n",
params->AllocationSize,
params->Size );
496 dummy_dirW[dummy_dir.
Length /
sizeof(
WCHAR)] =
'\\';
509 "wrong pos %Ix/%lx\n",
pos,
params->Size );
517 "wrong len %Ix/%Ix\n",
params->EnvironmentSize,
519 pRtlDestroyProcessParameters(
params );
528 ok(
size != ~(
SIZE_T)0,
"not a heap block %p\n", cur_params );
546 ok( (
char *)
str == (
char *)cur_params + cur_params->
Size,
547 "wrong end ptr %p/%p\n",
str, (
char *)cur_params + cur_params->
Size );
552 "initial environment inside block %p / %p\n", cur_params,
initial_env );
585#define check_env_var(a, b) check_env_var_(__LINE__, a, b)
607 old_env =
NtCurrentTeb()->Peb->ProcessParameters->Environment;
617 ok(prev == old_env,
"got wrong previous env %p\n", prev);
666 WCHAR value_buffer[9];
670 value_string.
Buffer = value_buffer;
678 "wrong size %Iu\n", value_string.
Length/
sizeof(
WCHAR));
684#define query_env_var(a, b, c) query_env_var_(__LINE__, a, b, c)
747 pRtlQueryEnvironmentVariable_U = (
void*)
GetProcAddress(
mod,
"RtlQueryEnvironmentVariable_U");
749 pRtlExpandEnvironmentStrings = (
void*)
GetProcAddress(
mod,
"RtlExpandEnvironmentStrings");
750 pRtlExpandEnvironmentStrings_U = (
void*)
GetProcAddress(
mod,
"RtlExpandEnvironmentStrings_U");
751 pRtlCreateProcessParameters = (
void*)
GetProcAddress(
mod,
"RtlCreateProcessParameters");
752 pRtlDestroyProcessParameters = (
void*)
GetProcAddress(
mod,
"RtlDestroyProcessParameters");
std::map< E_MODULE, HMODULE > mod
static FN_RtlQueryEnvironmentVariable * pRtlQueryEnvironmentVariable
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
static const TCHAR empty_str[]
static LPCWSTR LPCWSTR LPCWSTR env
static const WCHAR empty[1]
#define GetEnvironmentVariableW(x, y, z)
#define GetProcAddress(x, y)
#define GetEnvironmentVariableA(x, y, z)
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableA(IN LPCSTR lpName, IN LPCSTR lpValue)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
GLenum const GLfloat * params
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum GLenum GLenum input
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
static struct test_info tests[]
static const WCHAR dummyW[]
static void query_env_var_(int line, WCHAR *env, const WCHAR *var, const WCHAR *value)
static DWORD LPDWORD LPCSTR DWORD srclen
static DWORD LPDWORD reslen
static void check_env_var_(int line, const char *var, const char *value)
static void test_process_params(void)
#define check_env_var(a, b)
#define check_string(params, str, expect, pos)
static NTSTATUS set_env_var(WCHAR **env, const WCHAR *var, const WCHAR *value)
static void testExpand(void)
static UINT_PTR align(UINT_PTR size, unsigned int alignment)
static WCHAR * get_params_string(RTL_USER_PROCESS_PARAMETERS *params, UNICODE_STRING *str)
static void test_RtlSetCurrentEnvironment(void)
static const UNICODE_STRING const UNICODE_STRING const UNICODE_STRING const UNICODE_STRING PWSTR
static SIZE_T get_env_length(const WCHAR *env)
static void test_RtlExpandEnvironmentStrings(void)
static void test_RtlSetEnvironmentVariable(void)
static DWORD LPDWORD LPCSTR src
static void * initial_env
static WCHAR WCHAR SIZE_T *static WCHAR WCHAR SIZE_T *static PULONG
static UINT_PTR check_string_(int line, RTL_USER_PROCESS_PARAMETERS *params, UNICODE_STRING *str, const UNICODE_STRING *expect, UINT_PTR pos)
static void testQuery(void)
#define query_env_var(a, b, c)
unsigned __int3264 UINT_PTR
NTSYSAPI NTSTATUS NTAPI RtlSetEnvironmentVariable(_In_z_ PWSTR *Environment, _In_ PUNICODE_STRING Name, _In_ PUNICODE_STRING Value)
NTSYSAPI NTSTATUS NTAPI RtlCreateEnvironment(_In_ BOOLEAN Inherit, _Out_ PWSTR *Environment)
NTSYSAPI VOID NTAPI RtlDestroyEnvironment(_In_ PWSTR Environment)
NTSYSAPI NTSTATUS NTAPI RtlQueryEnvironmentVariable_U(_In_opt_ PWSTR Environment, _In_ PCUNICODE_STRING Name, _Out_ PUNICODE_STRING Value)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STATUS_VARIABLE_NOT_FOUND
#define _WIN32_WINNT_VISTA
#define STATUS_BUFFER_TOO_SMALL
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
UNICODE_STRING CommandLine
UNICODE_STRING RuntimeInfo
UNICODE_STRING ImagePathName
UNICODE_STRING WindowTitle
#define STATUS_INVALID_PARAMETER
SIZE_T WINAPI HeapSize(HANDLE, DWORD, LPCVOID)
DWORD WINAPI GetLastError(void)
NTSYSAPI void WINAPI RtlSetCurrentEnvironment(PWSTR, PWSTR *)
#define PROCESS_PARAMS_FLAG_NORMALIZED
#define ERROR_ENVVAR_NOT_FOUND