ReactOS 0.4.15-dev-7918-g2a2556c
userenv.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "winreg.h"
#include "userenv.h"
#include "wine/test.h"
Include dependency graph for userenv.c:

Go to the source code of this file.

Classes

struct  profile_item
 

Macros

#define expect(EXPECTED, GOT)   ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT))
 
#define expect_env(EXPECTED, GOT, VAR)   ok((GOT)==(EXPECTED), "Expected %d, got %d for %s (%d)\n", (EXPECTED), (GOT), (VAR), j)
 
#define expect_gle(EXPECTED)   ok(GetLastError() == (EXPECTED), "Expected %d, got %d\n", (EXPECTED), GetLastError())
 

Functions

static BOOL (WINAPI *pIsWow64Process)(HANDLE
 
static BOOL get_env (const WCHAR *env, const char *var, char **result)
 
static void test_create_env (void)
 
static void test_get_profiles_dir (void)
 
static void test_get_user_profile_dir (void)
 
 START_TEST (userenv)
 

Variables

static PBOOL
 

Macro Definition Documentation

◆ expect

#define expect (   EXPECTED,
  GOT 
)    ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT))

Definition at line 34 of file userenv.c.

◆ expect_env

#define expect_env (   EXPECTED,
  GOT,
  VAR 
)    ok((GOT)==(EXPECTED), "Expected %d, got %d for %s (%d)\n", (EXPECTED), (GOT), (VAR), j)

Definition at line 35 of file userenv.c.

◆ expect_gle

#define expect_gle (   EXPECTED)    ok(GetLastError() == (EXPECTED), "Expected %d, got %d\n", (EXPECTED), GetLastError())

Definition at line 36 of file userenv.c.

Function Documentation

◆ BOOL()

static BOOL ( WINAPI pIsWow64Process)
static

◆ get_env()

static BOOL get_env ( const WCHAR env,
const char var,
char **  result 
)
static

Definition at line 46 of file userenv.c.

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}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static LPCWSTR LPCWSTR LPCWSTR env
Definition: db.cpp:170
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define HeapAlloc
Definition: compat.h:733
#define WideCharToMultiByte
Definition: compat.h:111
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat GLfloat p
Definition: glext.h:8902
GLuint64EXT * result
Definition: glext.h:11304
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
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
const char * var
Definition: shader.c:5666
#define min(a, b)
Definition: monoChain.cc:55
#define LOCALE_USE_CP_ACP
Definition: winnls.h:20
#define NORM_IGNORECASE
Definition: winnls.h:176
#define CSTR_EQUAL
Definition: winnls.h:456
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by test_create_env().

◆ START_TEST()

START_TEST ( userenv  )

Definition at line 408 of file userenv.c.

409{
410 pIsWow64Process = (void*)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process");
411
415}
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
static void test_get_profiles_dir(void)
Definition: userenv.c:229
static void test_get_user_profile_dir(void)
Definition: userenv.c:305
static void test_create_env(void)
Definition: userenv.c:76

◆ test_create_env()

static void test_create_env ( void  )
static

Definition at line 76 of file userenv.c.

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}
#define broken(x)
Definition: _sntprintf.h:21
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define ok(value,...)
Definition: atltest.h:57
#define ARRAY_SIZE(A)
Definition: main.h:33
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
#define GetCurrentProcess()
Definition: compat.h:759
#define stricmp(_String1, _String2)
Definition: compat.h:24
#define HeapFree(x, y, z)
Definition: compat.h:735
#define GetEnvironmentVariableA(x, y, z)
Definition: compat.h:754
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableA(IN LPCSTR lpName, IN LPCSTR lpValue)
Definition: environ.c:218
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
unsigned int BOOL
Definition: ntddk_ex.h:94
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
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 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
static BOOL get_env(const WCHAR *env, const char *var, char **result)
Definition: userenv.c:46
#define expect(EXPECTED, GOT)
Definition: userenv.c:34
#define expect_env(EXPECTED, GOT, VAR)
Definition: userenv.c:35
#define win_skip
Definition: test.h:160
Definition: name.c:39
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define TOKEN_DUPLICATE
Definition: setypes.h:926
#define TOKEN_QUERY
Definition: setypes.h:928

Referenced by START_TEST().

◆ test_get_profiles_dir()

static void test_get_profiles_dir ( void  )
static

Definition at line 229 of file userenv.c.

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}
#define RegCloseKey(hKey)
Definition: registry.h:49
r l[0]
Definition: byte_order.h:168
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
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
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
DWORD WINAPI ExpandEnvironmentStringsA(IN LPCSTR lpSrc, IN LPSTR lpDst, IN DWORD nSize)
Definition: environ.c:399
BOOL WINAPI GetProfilesDirectoryA(_Out_ LPSTR lpProfileDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1536
BOOL WINAPI GetProfilesDirectoryW(_Out_ LPWSTR lpProfilesDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1576
unsigned long DWORD
Definition: ntddk_ex.h:95
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
#define expect_gle(EXPECTED)
Definition: userenv.c:36
#define KEY_READ
Definition: nt_native.h:1023
long LONG
Definition: pedump.c:60
Definition: copy.c:22
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
unsigned char BYTE
Definition: xxhash.c:193

Referenced by START_TEST().

◆ test_get_user_profile_dir()

static void test_get_user_profile_dir ( void  )
static

Definition at line 305 of file userenv.c.

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}
#define trace
Definition: atltest.h:70
#define CloseHandle
Definition: compat.h:739
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI GetUserProfileDirectoryA(_In_ HANDLE hToken, _Out_opt_ LPSTR lpProfileDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1750
BOOL WINAPI GetUserProfileDirectoryW(_In_ HANDLE hToken, _Out_opt_ LPWSTR lpProfileDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1792
GLenum GLsizei len
Definition: glext.h:6722
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
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define error(str)
Definition: mkdosfs.c:1605
#define todo_wine
Definition: custom.c:79
int ret

Referenced by START_TEST().

Variable Documentation

◆ PBOOL

Definition at line 38 of file userenv.c.