ReactOS 0.4.15-dev-7924-g5949c20
userenv.c
Go to the documentation of this file.
1/*
2 * Unit test suite for userenv functions
3 *
4 * Copyright 2008 Google (Lei Zhang)
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <stdarg.h>
24
25#include "windef.h"
26#include "winbase.h"
27#include "winnls.h"
28#include "winreg.h"
29
30#include "userenv.h"
31
32#include "wine/test.h"
33
34#define expect(EXPECTED,GOT) ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT))
35#define expect_env(EXPECTED,GOT,VAR) ok((GOT)==(EXPECTED), "Expected %d, got %d for %s (%d)\n", (EXPECTED), (GOT), (VAR), j)
36#define expect_gle(EXPECTED) ok(GetLastError() == (EXPECTED), "Expected %d, got %d\n", (EXPECTED), GetLastError())
37
38static BOOL (WINAPI *pIsWow64Process)(HANDLE,PBOOL);
39
41{
42 const char * name;
43};
44
45/* Helper function for retrieving environment variables */
46static BOOL get_env(const WCHAR * env, const char * var, char ** result)
47{
48 const WCHAR * p = env;
49 int envlen, varlen, buflen;
50 char buf[256];
51
52 if (!env || !var || !result) return FALSE;
53
54 varlen = strlen(var);
55 do
56 {
57 if (!WideCharToMultiByte( CP_ACP, 0, p, -1, buf, sizeof(buf), NULL, NULL )) buf[sizeof(buf)-1] = 0;
58 envlen = strlen(buf);
60 {
61 if (buf[varlen] == '=')
62 {
63 buflen = strlen(buf);
64 *result = HeapAlloc(GetProcessHeap(), 0, buflen + 1);
65 if (!*result) return FALSE;
66 memcpy(*result, buf, buflen + 1);
67 return TRUE;
68 }
69 }
70 while (*p) p++;
71 p++;
72 } while (*p);
73 return FALSE;
74}
75
76static void test_create_env(void)
77{
79 HANDLE htok;
80 WCHAR * env[4];
81 char * st, systemroot[100];
82 int i, j;
83
84 static const struct profile_item common_vars[] = {
85 { "ComSpec" },
86 { "COMPUTERNAME" },
87 { "NUMBER_OF_PROCESSORS" },
88 { "OS" },
89 { "PROCESSOR_ARCHITECTURE" },
90 { "PROCESSOR_IDENTIFIER" },
91 { "PROCESSOR_LEVEL" },
92 { "PROCESSOR_REVISION" },
93 { "SystemDrive" },
94 { "SystemRoot" },
95 { "windir" }
96 };
97 static const struct profile_item common_post_nt4_vars[] = {
98 { "ALLUSERSPROFILE" },
99 { "TEMP" },
100 { "TMP" },
101 { "CommonProgramFiles" },
102 { "ProgramFiles" },
103 { "PATH" },
104 { "USERPROFILE" }
105 };
106 static const struct profile_item common_win64_vars[] = {
107 { "ProgramW6432" },
108 { "CommonProgramW6432" }
109 };
110
111 r = SetEnvironmentVariableA("WINE_XYZZY", "ZZYZX");
112 expect(TRUE, r);
113
114 r = GetEnvironmentVariableA("SystemRoot", systemroot, sizeof(systemroot));
115 ok(r != 0, "GetEnvironmentVariable failed (%d)\n", GetLastError());
116
117 r = SetEnvironmentVariableA("SystemRoot", "overwrite");
118 expect(TRUE, r);
119
120 if (0)
121 {
122 /* Crashes on NT4 */
124 expect(FALSE, r);
125 }
126
128 expect(TRUE, r);
129
130 if (0)
131 {
132 /* Crashes on NT4 */
134 expect(FALSE, r);
135 }
136
138 expect(TRUE, r);
139
140 r = CreateEnvironmentBlock((LPVOID) &env[1], htok, FALSE);
141 expect(TRUE, r);
142
144 expect(TRUE, r);
145
146 r = CreateEnvironmentBlock((LPVOID) &env[3], htok, TRUE);
147 expect(TRUE, r);
148
149 r = SetEnvironmentVariableA("SystemRoot", systemroot);
150 expect(TRUE, r);
151
152 for(i=0; i<4; i++)
153 {
154 r = get_env(env[i], "SystemRoot", &st);
155#ifdef __REACTOS__
156 ok(!stricmp(st, "SystemRoot=overwrite"), "%s\n", st);
157#else
158 ok(!strcmp(st, "SystemRoot=overwrite"), "%s\n", st);
159#endif
160 expect(TRUE, r);
161 HeapFree(GetProcessHeap(), 0, st);
162 }
163
164 /* Test for common environment variables (NT4 and higher) */
165 for (i = 0; i < ARRAY_SIZE(common_vars); i++)
166 {
167 for (j = 0; j < 4; j++)
168 {
169 r = get_env(env[j], common_vars[i].name, &st);
170 expect_env(TRUE, r, common_vars[i].name);
171 if (r) HeapFree(GetProcessHeap(), 0, st);
172 }
173 }
174
175 /* Test for common environment variables (post NT4) */
176 if (!GetEnvironmentVariableA("ALLUSERSPROFILE", NULL, 0))
177 {
178 win_skip("Some environment variables are not present on NT4\n");
179 }
180 else
181 {
182 for (i = 0; i < ARRAY_SIZE(common_post_nt4_vars); i++)
183 {
184 for (j = 0; j < 4; j++)
185 {
186 r = get_env(env[j], common_post_nt4_vars[i].name, &st);
187 expect_env(TRUE, r, common_post_nt4_vars[i].name);
188 if (r) HeapFree(GetProcessHeap(), 0, st);
189 }
190 }
191 }
192
193 if(pIsWow64Process)
194 pIsWow64Process(GetCurrentProcess(), &is_wow64);
195 if (sizeof(void*)==8 || is_wow64)
196 {
197 for (i = 0; i < ARRAY_SIZE(common_win64_vars); i++)
198 {
199 for (j=0; j<4; j++)
200 {
201 r = get_env(env[j], common_win64_vars[i].name, &st);
202 ok(r || broken(!r)/* Vista,2k3,XP */, "Expected 1, got 0 for %s\n", common_win64_vars[i].name);
203 if (r) HeapFree(GetProcessHeap(), 0, st);
204 }
205 }
206 }
207
208 r = get_env(env[0], "WINE_XYZZY", &st);
209 expect(FALSE, r);
210
211 r = get_env(env[1], "WINE_XYZZY", &st);
212 expect(FALSE, r);
213
214 r = get_env(env[2], "WINE_XYZZY", &st);
215 expect(TRUE, r);
216 if (r) HeapFree(GetProcessHeap(), 0, st);
217
218 r = get_env(env[3], "WINE_XYZZY", &st);
219 expect(TRUE, r);
220 if (r) HeapFree(GetProcessHeap(), 0, st);
221
222 for (i = 0; i < ARRAY_SIZE(env); i++)
223 {
225 expect(TRUE, r);
226 }
227}
228
229static void test_get_profiles_dir(void)
230{
231 static const char ProfileListA[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList";
232 static const char ProfilesDirectory[] = "ProfilesDirectory";
233 BOOL r;
234 DWORD cch, profiles_len;
235 LONG l;
236 HKEY key;
237 char *profiles_dir, *buf, small_buf[1];
238
239 l = RegOpenKeyExA(HKEY_LOCAL_MACHINE, ProfileListA, 0, KEY_READ, &key);
240 ok(!l, "RegOpenKeyExA failed: %d\n", GetLastError());
241
242 l = RegQueryValueExA(key, ProfilesDirectory, NULL, NULL, NULL, &cch);
243 if (l)
244 {
245 win_skip("No ProfilesDirectory value (NT4), skipping tests\n");
246 return;
247 }
249 RegQueryValueExA(key, ProfilesDirectory, NULL, NULL, (BYTE *)buf, &cch);
251 profiles_len = ExpandEnvironmentStringsA(buf, NULL, 0);
252 profiles_dir = HeapAlloc(GetProcessHeap(), 0, profiles_len);
253 ExpandEnvironmentStringsA(buf, profiles_dir, profiles_len);
255
256 SetLastError(0xdeadbeef);
258 expect(FALSE, r);
260 SetLastError(0xdeadbeef);
262 expect(FALSE, r);
264 SetLastError(0xdeadbeef);
265 cch = 1;
266 r = GetProfilesDirectoryA(small_buf, &cch);
267 expect(FALSE, r);
269 /* MSDN claims the returned character count includes the NULL terminator
270 * when the buffer is too small, but that's not in fact what gets returned.
271 */
272 ok(cch == profiles_len - 1, "expected %d, got %d\n", profiles_len - 1, cch);
273 /* Allocate one more character than the return value to prevent a buffer
274 * overrun.
275 */
276 buf = HeapAlloc(GetProcessHeap(), 0, cch + 1);
278 /* Rather than a BOOL, the return value is also the number of characters
279 * stored in the buffer.
280 */
281 expect(profiles_len - 1, r);
282 ok(!strcmp(buf, profiles_dir), "expected %s, got %s\n", profiles_dir, buf);
283
285 HeapFree(GetProcessHeap(), 0, profiles_dir);
286
287 SetLastError(0xdeadbeef);
289 expect(FALSE, r);
291
292 cch = 0;
293 SetLastError(0xdeadbeef);
295 expect(FALSE, r);
297 ok(cch, "expected cch > 0\n");
298
299 SetLastError(0xdeadbeef);
301 expect(FALSE, r);
303}
304
306{
307 BOOL ret;
308 DWORD error, len;
310 char *dirA;
311 WCHAR *dirW;
312
313 if (!GetEnvironmentVariableA( "ALLUSERSPROFILE", NULL, 0 ))
314 {
315 win_skip("Skipping tests on NT4\n");
316 return;
317 }
318
320 ok(ret, "expected success %u\n", GetLastError());
321
322 SetLastError( 0xdeadbeef );
325 ok(!ret, "expected failure\n");
326 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
327
328 SetLastError( 0xdeadbeef );
331 ok(!ret, "expected failure\n");
332 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
333
334 dirA = HeapAlloc( GetProcessHeap(), 0, 32 );
335 SetLastError( 0xdeadbeef );
338 ok(!ret, "expected failure\n");
339 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
340 HeapFree( GetProcessHeap(), 0, dirA );
341
342 len = 0;
343 SetLastError( 0xdeadbeef );
346 ok(!ret, "expected failure\n");
347 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
348 ok(!len, "expected 0, got %u\n", len);
349
350 len = 0;
352 SetLastError( 0xdeadbeef );
355 ok(!ret, "expected failure\n");
356 ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error);
357 ok(len, "expected len > 0\n");
358 HeapFree( GetProcessHeap(), 0, dirA );
359
361 SetLastError( 0xdeadbeef );
363 ok(ret, "expected success %u\n", GetLastError());
364 ok(len, "expected len > 0\n");
365 ok(lstrlenA( dirA ) == len - 1, "length mismatch %d != %d - 1\n", lstrlenA( dirA ), len );
366 trace("%s\n", dirA);
367 HeapFree( GetProcessHeap(), 0, dirA );
368
369 SetLastError( 0xdeadbeef );
372 ok(!ret, "expected failure\n");
373 todo_wine ok(error == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", error);
374
375 SetLastError( 0xdeadbeef );
378 ok(!ret, "expected failure\n");
379 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
380
381 dirW = HeapAlloc( GetProcessHeap(), 0, 32 );
382 SetLastError( 0xdeadbeef );
385 ok(!ret, "expected failure\n");
386 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
387 HeapFree( GetProcessHeap(), 0, dirW );
388
389 len = 0;
390 SetLastError( 0xdeadbeef );
393 ok(!ret, "expected failure\n");
394 ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error);
395 ok(len, "expected len > 0\n");
396
397 dirW = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len * sizeof(WCHAR) );
398 SetLastError( 0xdeadbeef );
400 ok(ret, "expected success %u\n", GetLastError());
401 ok(len, "expected len > 0\n");
402 ok(lstrlenW( dirW ) == len - 1, "length mismatch %d != %d - 1\n", lstrlenW( dirW ), len );
403 HeapFree( GetProcessHeap(), 0, dirW );
404
406}
407
409{
410 pIsWow64Process = (void*)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process");
411
415}
#define broken(x)
Definition: _sntprintf.h:21
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
#define ARRAY_SIZE(A)
Definition: main.h:33
#define RegCloseKey(hKey)
Definition: registry.h:49
r l[0]
Definition: byte_order.h:168
static LPCWSTR LPCWSTR LPCWSTR env
Definition: db.cpp:170
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4009
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define GetProcAddress(x, y)
Definition: compat.h:753
#define HeapAlloc
Definition: compat.h:733
#define GetCurrentProcess()
Definition: compat.h:759
#define stricmp(_String1, _String2)
Definition: compat.h:24
#define HeapFree(x, y, z)
Definition: compat.h:735
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define WideCharToMultiByte
Definition: compat.h:111
#define GetEnvironmentVariableA(x, y, z)
Definition: compat.h:754
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrlenW
Definition: compat.h:750
DWORD WINAPI ExpandEnvironmentStringsA(IN LPCSTR lpSrc, IN LPSTR lpDst, IN DWORD nSize)
Definition: environ.c:399
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableA(IN LPCSTR lpName, IN LPCSTR lpValue)
Definition: environ.c:218
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
BOOL is_wow64
Definition: msi.c:54
BOOL WINAPI DestroyEnvironmentBlock(IN LPVOID lpEnvironment)
Definition: environment.c:725
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit)
Definition: environment.c:503
BOOL WINAPI GetUserProfileDirectoryA(_In_ HANDLE hToken, _Out_opt_ LPSTR lpProfileDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1750
BOOL WINAPI GetProfilesDirectoryA(_Out_ LPSTR lpProfileDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1536
BOOL WINAPI GetUserProfileDirectoryW(_In_ HANDLE hToken, _Out_opt_ LPWSTR lpProfileDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1792
BOOL WINAPI GetProfilesDirectoryW(_Out_ LPWSTR lpProfilesDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1576
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLuint64EXT * result
Definition: glext.h:11304
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
Definition: glfuncs.h:248
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 token
Definition: glfuncs.h:210
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 GLint GLint j
Definition: glfuncs.h:250
LCID WINAPI GetThreadLocale(void)
Definition: lang.c:1459
INT WINAPI CompareStringA(LCID lcid, DWORD flags, LPCSTR str1, INT len1, LPCSTR str2, INT len2)
Definition: lang.c:2695
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
const char * var
Definition: shader.c:5666
#define todo_wine
Definition: custom.c:79
static BOOL get_env(const WCHAR *env, const char *var, char **result)
Definition: userenv.c:46
static void test_get_profiles_dir(void)
Definition: userenv.c:229
#define expect_gle(EXPECTED)
Definition: userenv.c:36
static PBOOL
Definition: userenv.c:38
static void test_get_user_profile_dir(void)
Definition: userenv.c:305
static void test_create_env(void)
Definition: userenv.c:76
#define expect(EXPECTED, GOT)
Definition: userenv.c:34
#define expect_env(EXPECTED, GOT, VAR)
Definition: userenv.c:35
#define min(a, b)
Definition: monoChain.cc:55
#define BOOL
Definition: nt_native.h:43
#define KEY_READ
Definition: nt_native.h:1023
long LONG
Definition: pedump.c:60
#define win_skip
Definition: test.h:160
Definition: copy.c:22
Definition: name.c:39
const char * name
Definition: userenv.c:42
PVOID HANDLE
Definition: typedefs.h:73
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
#define LOCALE_USE_CP_ACP
Definition: winnls.h:20
#define NORM_IGNORECASE
Definition: winnls.h:176
#define CSTR_EQUAL
Definition: winnls.h:456
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define TOKEN_DUPLICATE
Definition: setypes.h:926
#define TOKEN_QUERY
Definition: setypes.h:928
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193