[KERNEL32_WINETEST] Add a PCH.
[reactos.git] / modules / rostests / winetests / kernel32 / environ.c
1 /*
2 * Unit test suite for environment functions.
3 *
4 * Copyright 2002 Dmitry Timoshkov
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 "precomp.h"
22
23 static CHAR string[MAX_PATH];
24 #define ok_w(res, format, szString) \
25 \
26 WideCharToMultiByte(CP_ACP, 0, szString, -1, string, MAX_PATH, NULL, NULL); \
27 ok(res, format, string);
28
29 static BOOL (WINAPI *pGetComputerNameExA)(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD);
30 static BOOL (WINAPI *pGetComputerNameExW)(COMPUTER_NAME_FORMAT,LPWSTR,LPDWORD);
31 static BOOL (WINAPI *pOpenProcessToken)(HANDLE,DWORD,PHANDLE);
32 static BOOL (WINAPI *pGetUserProfileDirectoryA)(HANDLE,LPSTR,LPDWORD);
33
34 static void init_functionpointers(void)
35 {
36 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
37 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
38 HMODULE huserenv = LoadLibraryA("userenv.dll");
39
40 pGetComputerNameExA = (void *)GetProcAddress(hkernel32, "GetComputerNameExA");
41 pGetComputerNameExW = (void *)GetProcAddress(hkernel32, "GetComputerNameExW");
42 pOpenProcessToken = (void *)GetProcAddress(hadvapi32, "OpenProcessToken");
43 pGetUserProfileDirectoryA = (void *)GetProcAddress(huserenv,
44 "GetUserProfileDirectoryA");
45 }
46
47 static void test_Predefined(void)
48 {
49 char Data[1024];
50 DWORD DataSize;
51 char Env[sizeof(Data)];
52 DWORD EnvSize;
53 HANDLE Token;
54 BOOL NoErr;
55
56 /*
57 * Check value of %USERPROFILE%, should be same as GetUserProfileDirectory()
58 * If this fails, your test environment is probably not set up
59 */
60 if (pOpenProcessToken == NULL || pGetUserProfileDirectoryA == NULL)
61 {
62 skip("Skipping USERPROFILE check\n");
63 return;
64 }
65 NoErr = pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token);
66 ok(NoErr, "Failed to open token, error %u\n", GetLastError());
67 DataSize = sizeof(Data);
68 NoErr = pGetUserProfileDirectoryA(Token, Data, &DataSize);
69 ok(NoErr, "Failed to get user profile dir, error %u\n", GetLastError());
70 if (NoErr)
71 {
72 EnvSize = GetEnvironmentVariableA("USERPROFILE", Env, sizeof(Env));
73 ok(EnvSize != 0 && EnvSize <= sizeof(Env),
74 "Failed to retrieve environment variable USERPROFILE, error %u\n",
75 GetLastError());
76 ok(strcmp(Data, Env) == 0,
77 "USERPROFILE env var %s doesn't match GetUserProfileDirectory %s\n",
78 Env, Data);
79 }
80 else
81 skip("Skipping USERPROFILE check, can't get user profile dir\n");
82 NoErr = CloseHandle(Token);
83 ok(NoErr, "Failed to close token, error %u\n", GetLastError());
84 }
85
86 static void test_GetSetEnvironmentVariableA(void)
87 {
88 char buf[256];
89 BOOL ret;
90 DWORD ret_size;
91 static const char name[] = "SomeWildName";
92 static const char name_cased[] = "sOMEwILDnAME";
93 static const char value[] = "SomeWildValue";
94
95 ret = SetEnvironmentVariableA(name, value);
96 ok(ret == TRUE,
97 "unexpected error in SetEnvironmentVariableA, GetLastError=%d\n",
98 GetLastError());
99
100 /* Try to retrieve the environment variable we just set */
101 ret_size = GetEnvironmentVariableA(name, NULL, 0);
102 ok(ret_size == strlen(value) + 1,
103 "should return length with terminating 0 ret_size=%d\n", ret_size);
104
105 lstrcpyA(buf, "foo");
106 ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value));
107 ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n");
108 ok(ret_size == strlen(value) + 1,
109 "should return length with terminating 0 ret_size=%d\n", ret_size);
110
111 lstrcpyA(buf, "foo");
112 ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value) + 1);
113 ok(lstrcmpA(buf, value) == 0, "should touch the buffer\n");
114 ok(ret_size == strlen(value),
115 "should return length without terminating 0 ret_size=%d\n", ret_size);
116
117 lstrcpyA(buf, "foo");
118 ret_size = GetEnvironmentVariableA(name_cased, buf, lstrlenA(value) + 1);
119 ok(lstrcmpA(buf, value) == 0, "should touch the buffer\n");
120 ok(ret_size == strlen(value),
121 "should return length without terminating 0 ret_size=%d\n", ret_size);
122
123 /* Remove that environment variable */
124 ret = SetEnvironmentVariableA(name_cased, NULL);
125 ok(ret == TRUE, "should erase existing variable\n");
126
127 lstrcpyA(buf, "foo");
128 ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value) + 1);
129 ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n");
130 ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND,
131 "should not find variable but ret_size=%d GetLastError=%d\n",
132 ret_size, GetLastError());
133
134 /* Check behavior of SetEnvironmentVariableA(name, "") */
135 ret = SetEnvironmentVariableA(name, value);
136 ok(ret == TRUE,
137 "unexpected error in SetEnvironmentVariableA, GetLastError=%d\n",
138 GetLastError());
139
140 lstrcpyA(buf, "foo");
141 ret_size = GetEnvironmentVariableA(name_cased, buf, lstrlenA(value) + 1);
142 ok(lstrcmpA(buf, value) == 0, "should touch the buffer\n");
143 ok(ret_size == strlen(value),
144 "should return length without terminating 0 ret_size=%d\n", ret_size);
145
146 ret = SetEnvironmentVariableA(name_cased, "");
147 ok(ret == TRUE,
148 "should not fail with empty value but GetLastError=%d\n", GetLastError());
149
150 lstrcpyA(buf, "foo");
151 SetLastError(0);
152 ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value) + 1);
153 ok(ret_size == 0 &&
154 ((GetLastError() == 0 && lstrcmpA(buf, "") == 0) ||
155 (GetLastError() == ERROR_ENVVAR_NOT_FOUND)),
156 "%s should be set to \"\" (NT) or removed (Win9x) but ret_size=%d GetLastError=%d and buf=%s\n",
157 name, ret_size, GetLastError(), buf);
158
159 /* Test the limits */
160 ret_size = GetEnvironmentVariableA(NULL, NULL, 0);
161 ok(ret_size == 0 && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_ENVVAR_NOT_FOUND),
162 "should not find variable but ret_size=%d GetLastError=%d\n",
163 ret_size, GetLastError());
164
165 ret_size = GetEnvironmentVariableA(NULL, buf, lstrlenA(value) + 1);
166 ok(ret_size == 0 && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_ENVVAR_NOT_FOUND),
167 "should not find variable but ret_size=%d GetLastError=%d\n",
168 ret_size, GetLastError());
169
170 ret_size = GetEnvironmentVariableA("", buf, lstrlenA(value) + 1);
171 ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND,
172 "should not find variable but ret_size=%d GetLastError=%d\n",
173 ret_size, GetLastError());
174 }
175
176 static void test_GetSetEnvironmentVariableW(void)
177 {
178 WCHAR buf[256];
179 BOOL ret;
180 DWORD ret_size;
181 static const WCHAR name[] = {'S','o','m','e','W','i','l','d','N','a','m','e',0};
182 static const WCHAR value[] = {'S','o','m','e','W','i','l','d','V','a','l','u','e',0};
183 static const WCHAR name_cased[] = {'s','O','M','E','w','I','L','D','n','A','M','E',0};
184 static const WCHAR empty_strW[] = { 0 };
185 static const WCHAR fooW[] = {'f','o','o',0};
186
187 ret = SetEnvironmentVariableW(name, value);
188 if (ret == FALSE && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
189 {
190 /* Must be Win9x which doesn't support the Unicode functions */
191 win_skip("SetEnvironmentVariableW is not implemented\n");
192 return;
193 }
194 ok(ret == TRUE,
195 "unexpected error in SetEnvironmentVariableW, GetLastError=%d\n",
196 GetLastError());
197
198 /* Try to retrieve the environment variable we just set */
199 ret_size = GetEnvironmentVariableW(name, NULL, 0);
200 ok(ret_size == lstrlenW(value) + 1,
201 "should return length with terminating 0 ret_size=%d\n",
202 ret_size);
203
204 lstrcpyW(buf, fooW);
205 ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value));
206 ok_w(lstrcmpW(buf, fooW) == 0 ||
207 lstrlenW(buf) == 0, /* Vista */
208 "Expected untouched or empty buffer, got \"%s\"\n", buf);
209
210 ok(ret_size == lstrlenW(value) + 1,
211 "should return length with terminating 0 ret_size=%d\n", ret_size);
212
213 lstrcpyW(buf, fooW);
214 ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1);
215 ok(lstrcmpW(buf, value) == 0, "should touch the buffer\n");
216 ok(ret_size == lstrlenW(value),
217 "should return length without terminating 0 ret_size=%d\n", ret_size);
218
219 lstrcpyW(buf, fooW);
220 ret_size = GetEnvironmentVariableW(name_cased, buf, lstrlenW(value) + 1);
221 ok(lstrcmpW(buf, value) == 0, "should touch the buffer\n");
222 ok(ret_size == lstrlenW(value),
223 "should return length without terminating 0 ret_size=%d\n", ret_size);
224
225 /* Remove that environment variable */
226 ret = SetEnvironmentVariableW(name_cased, NULL);
227 ok(ret == TRUE, "should erase existing variable\n");
228
229 lstrcpyW(buf, fooW);
230 ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1);
231 ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n");
232 ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND,
233 "should not find variable but ret_size=%d GetLastError=%d\n",
234 ret_size, GetLastError());
235
236 /* Check behavior of SetEnvironmentVariableW(name, "") */
237 ret = SetEnvironmentVariableW(name, value);
238 ok(ret == TRUE,
239 "unexpected error in SetEnvironmentVariableW, GetLastError=%d\n",
240 GetLastError());
241
242 lstrcpyW(buf, fooW);
243 ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1);
244 ok(lstrcmpW(buf, value) == 0, "should touch the buffer\n");
245 ok(ret_size == lstrlenW(value),
246 "should return length without terminating 0 ret_size=%d\n", ret_size);
247
248 ret = SetEnvironmentVariableW(name_cased, empty_strW);
249 ok(ret == TRUE, "should not fail with empty value but GetLastError=%d\n", GetLastError());
250
251 lstrcpyW(buf, fooW);
252 ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1);
253 ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND,
254 "should not find variable but ret_size=%d GetLastError=%d\n",
255 ret_size, GetLastError());
256 ok(lstrcmpW(buf, empty_strW) == 0, "should copy an empty string\n");
257
258 /* Test the limits */
259 ret_size = GetEnvironmentVariableW(NULL, NULL, 0);
260 ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND,
261 "should not find variable but ret_size=%d GetLastError=%d\n",
262 ret_size, GetLastError());
263
264 if (0) /* Both tests crash on Vista */
265 {
266 ret_size = GetEnvironmentVariableW(NULL, buf, lstrlenW(value) + 1);
267 ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND,
268 "should not find variable but ret_size=%d GetLastError=%d\n",
269 ret_size, GetLastError());
270
271 ret = SetEnvironmentVariableW(NULL, NULL);
272 ok(ret == FALSE && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_ENVVAR_NOT_FOUND),
273 "should fail with NULL, NULL but ret=%d and GetLastError=%d\n",
274 ret, GetLastError());
275 }
276 }
277
278 static void test_ExpandEnvironmentStringsA(void)
279 {
280 const char* value="Long long value";
281 const char* not_an_env_var="%NotAnEnvVar%";
282 char buf[256], buf1[256], buf2[0x8000];
283 DWORD ret_size, ret_size1;
284
285 SetEnvironmentVariableA("EnvVar", value);
286
287 ret_size = ExpandEnvironmentStringsA(NULL, buf1, sizeof(buf1));
288 ok(ret_size == 1 || ret_size == 0 /* Win9x */ || ret_size == 2 /* NT4 */,
289 "ExpandEnvironmentStrings returned %d\n", ret_size);
290
291 /* Try to get the required buffer size 'the natural way' */
292 strcpy(buf, "%EnvVar%");
293 ret_size = ExpandEnvironmentStringsA(buf, NULL, 0);
294 ok(ret_size == strlen(value)+1 || /* win98 */
295 ret_size == (strlen(value)+1)*2 || /* NT4 */
296 ret_size == strlen(value)+2 || /* win2k, XP, win2k3 */
297 ret_size == 0 /* Win95 */,
298 "ExpandEnvironmentStrings returned %d instead of %d, %d or %d\n",
299 ret_size, lstrlenA(value)+1, lstrlenA(value)+2, 0);
300
301 /* Again, side-stepping the Win95 bug */
302 ret_size = ExpandEnvironmentStringsA(buf, buf1, 0);
303 /* v5.1.2600.2945 (XP SP2) returns len + 2 here! */
304 ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2 ||
305 ret_size == (strlen(value)+1)*2 /* NT4 */,
306 "ExpandEnvironmentStrings returned %d instead of %d\n",
307 ret_size, lstrlenA(value)+1);
308
309 /* Try with a buffer that's too small */
310 ret_size = ExpandEnvironmentStringsA(buf, buf1, 12);
311 /* v5.1.2600.2945 (XP SP2) returns len + 2 here! */
312 ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2 ||
313 ret_size == (strlen(value)+1)*2 /* NT4 */,
314 "ExpandEnvironmentStrings returned %d instead of %d\n",
315 ret_size, lstrlenA(value)+1);
316
317 /* Try with a buffer of just the right size */
318 /* v5.1.2600.2945 (XP SP2) needs and returns len + 2 here! */
319 ret_size = ExpandEnvironmentStringsA(buf, buf1, ret_size);
320 ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2 ||
321 ret_size == (strlen(value)+1)*2 /* NT4 */,
322 "ExpandEnvironmentStrings returned %d instead of %d\n",
323 ret_size, lstrlenA(value)+1);
324 ok(!strcmp(buf1, value), "ExpandEnvironmentStrings returned [%s]\n", buf1);
325
326 /* Try with an unset environment variable */
327 strcpy(buf, not_an_env_var);
328 ret_size = ExpandEnvironmentStringsA(buf, buf1, sizeof(buf1));
329 ok(ret_size == strlen(not_an_env_var)+1 ||
330 ret_size == (strlen(not_an_env_var)+1)*2 /* NT4 */,
331 "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlenA(not_an_env_var)+1);
332 ok(!strcmp(buf1, not_an_env_var), "ExpandEnvironmentStrings returned [%s]\n", buf1);
333
334 /* test a large destination size */
335 strcpy(buf, "12345");
336 ret_size = ExpandEnvironmentStringsA(buf, buf2, sizeof(buf2));
337 ok(!strcmp(buf, buf2), "ExpandEnvironmentStrings failed %s vs %s. ret_size = %d\n", buf, buf2, ret_size);
338
339 ret_size1 = GetWindowsDirectoryA(buf1,256);
340 ok ((ret_size1 >0) && (ret_size1<256), "GetWindowsDirectory Failed\n");
341 ret_size = ExpandEnvironmentStringsA("%SystemRoot%",buf,sizeof(buf));
342 if (ERROR_ENVVAR_NOT_FOUND != GetLastError())
343 {
344 ok(!strcmp(buf, buf1), "ExpandEnvironmentStrings failed %s vs %s. ret_size = %d\n", buf, buf1, ret_size);
345 }
346
347 /* Try with a variable that references another */
348 SetEnvironmentVariableA("IndirectVar", "Foo%EnvVar%Bar");
349 strcpy(buf, "Indirect-%IndirectVar%-Indirect");
350 strcpy(buf2, "Indirect-Foo%EnvVar%Bar-Indirect");
351 ret_size = ExpandEnvironmentStringsA(buf, buf1, sizeof(buf1));
352 ok(ret_size == strlen(buf2)+1 ||
353 ret_size == (strlen(buf2)+1)*2 /* NT4 */,
354 "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlenA(buf2)+1);
355 ok(!strcmp(buf1, buf2), "ExpandEnvironmentStrings returned [%s]\n", buf1);
356 SetEnvironmentVariableA("IndirectVar", NULL);
357
358 SetEnvironmentVariableA("EnvVar", NULL);
359 }
360
361 static void test_GetComputerName(void)
362 {
363 DWORD size;
364 BOOL ret;
365 LPSTR name;
366 LPWSTR nameW;
367 DWORD error;
368 int name_len;
369
370 size = 0;
371 ret = GetComputerNameA((LPSTR)0xdeadbeef, &size);
372 error = GetLastError();
373 ok(!ret && error == ERROR_BUFFER_OVERFLOW, "GetComputerNameA should have failed with ERROR_BUFFER_OVERFLOW instead of %d\n", error);
374
375 /* Only Vista returns the computer name length as documented in the MSDN */
376 if (size != 0)
377 {
378 size++; /* nul terminating character */
379 name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(name[0]));
380 ok(name != NULL, "HeapAlloc failed with error %d\n", GetLastError());
381 ret = GetComputerNameA(name, &size);
382 ok(ret, "GetComputerNameA failed with error %d\n", GetLastError());
383 HeapFree(GetProcessHeap(), 0, name);
384 }
385
386 size = MAX_COMPUTERNAME_LENGTH + 1;
387 name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(name[0]));
388 ok(name != NULL, "HeapAlloc failed with error %d\n", GetLastError());
389 ret = GetComputerNameA(name, &size);
390 ok(ret, "GetComputerNameA failed with error %d\n", GetLastError());
391 trace("computer name is \"%s\"\n", name);
392 name_len = strlen(name);
393 ok(size == name_len, "size should be same as length, name_len=%d, size=%d\n", name_len, size);
394 HeapFree(GetProcessHeap(), 0, name);
395
396 size = 0;
397 SetLastError(0xdeadbeef);
398 ret = GetComputerNameW((LPWSTR)0xdeadbeef, &size);
399 error = GetLastError();
400 if (error == ERROR_CALL_NOT_IMPLEMENTED)
401 win_skip("GetComputerNameW is not implemented\n");
402 else
403 {
404 ok(!ret && error == ERROR_BUFFER_OVERFLOW, "GetComputerNameW should have failed with ERROR_BUFFER_OVERFLOW instead of %d\n", error);
405 size++; /* nul terminating character */
406 nameW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(nameW[0]));
407 ok(nameW != NULL, "HeapAlloc failed with error %d\n", GetLastError());
408 ret = GetComputerNameW(nameW, &size);
409 ok(ret, "GetComputerNameW failed with error %d\n", GetLastError());
410 HeapFree(GetProcessHeap(), 0, nameW);
411 }
412 }
413
414 static void test_GetComputerNameExA(void)
415 {
416 DWORD size;
417 BOOL ret;
418 LPSTR name;
419 DWORD error;
420
421 static const int MAX_COMP_NAME = 32767;
422
423 if (!pGetComputerNameExA)
424 {
425 win_skip("GetComputerNameExA function not implemented\n");
426 return;
427 }
428
429 size = 0;
430 ret = pGetComputerNameExA(ComputerNameDnsDomain, (LPSTR)0xdeadbeef, &size);
431 error = GetLastError();
432 ok(ret == 0, "Expected 0, got %d\n", ret);
433 ok(error == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", error);
434
435 /* size is not set in win2k */
436 if (size == 0)
437 {
438 win_skip("Win2k doesn't set the size\n");
439 size = MAX_COMP_NAME;
440 }
441 name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(name[0]));
442 ok(name != NULL, "HeapAlloc failed with error %d\n", GetLastError());
443 ret = pGetComputerNameExA(ComputerNameDnsDomain, name, &size);
444 ok(ret, "GetComputerNameExA(ComputerNameDnsDomain) failed with error %d\n", GetLastError());
445 trace("domain name is \"%s\"\n", name);
446 HeapFree(GetProcessHeap(), 0, name);
447
448 size = 0;
449 ret = pGetComputerNameExA(ComputerNameDnsFullyQualified, (LPSTR)0xdeadbeef, &size);
450 error = GetLastError();
451 ok(ret == 0, "Expected 0, got %d\n", ret);
452 ok(error == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", error);
453
454 /* size is not set in win2k */
455 if (size == 0)
456 size = MAX_COMP_NAME;
457 name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(name[0]));
458 ok(name != NULL, "HeapAlloc failed with error %d\n", GetLastError());
459 ret = pGetComputerNameExA(ComputerNameDnsFullyQualified, name, &size);
460 ok(ret, "GetComputerNameExA(ComputerNameDnsFullyQualified) failed with error %d\n", GetLastError());
461 trace("fully qualified hostname is \"%s\"\n", name);
462 HeapFree(GetProcessHeap(), 0, name);
463
464 size = 0;
465 ret = pGetComputerNameExA(ComputerNameDnsHostname, (LPSTR)0xdeadbeef, &size);
466 error = GetLastError();
467 ok(ret == 0, "Expected 0, got %d\n", ret);
468 ok(error == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", error);
469
470 /* size is not set in win2k */
471 if (size == 0)
472 size = MAX_COMP_NAME;
473 name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(name[0]));
474 ok(name != NULL, "HeapAlloc failed with error %d\n", GetLastError());
475 ret = pGetComputerNameExA(ComputerNameDnsHostname, name, &size);
476 ok(ret, "GetComputerNameExA(ComputerNameDnsHostname) failed with error %d\n", GetLastError());
477 trace("hostname is \"%s\"\n", name);
478 HeapFree(GetProcessHeap(), 0, name);
479
480 size = 0;
481 ret = pGetComputerNameExA(ComputerNameNetBIOS, (LPSTR)0xdeadbeef, &size);
482 error = GetLastError();
483 ok(ret == 0, "Expected 0, got %d\n", ret);
484 ok(error == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", error);
485
486 /* size is not set in win2k */
487 if (size == 0)
488 size = MAX_COMP_NAME;
489 name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(name[0]));
490 ok(name != NULL, "HeapAlloc failed with error %d\n", GetLastError());
491 ret = pGetComputerNameExA(ComputerNameNetBIOS, name, &size);
492 ok(ret, "GetComputerNameExA(ComputerNameNetBIOS) failed with error %d\n", GetLastError());
493 trace("NetBIOS name is \"%s\"\n", name);
494 HeapFree(GetProcessHeap(), 0, name);
495 }
496
497 static void test_GetComputerNameExW(void)
498 {
499 DWORD size;
500 BOOL ret;
501 LPWSTR nameW;
502 DWORD error;
503
504 if (!pGetComputerNameExW)
505 {
506 win_skip("GetComputerNameExW function not implemented\n");
507 return;
508 }
509
510 size = 0;
511 ret = pGetComputerNameExW(ComputerNameDnsDomain, (LPWSTR)0xdeadbeef, &size);
512 error = GetLastError();
513 ok(!ret && error == ERROR_MORE_DATA, "GetComputerNameExW should have failed with ERROR_MORE_DATA instead of %d\n", error);
514 nameW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(nameW[0]));
515 ok(nameW != NULL, "HeapAlloc failed with error %d\n", GetLastError());
516 ret = pGetComputerNameExW(ComputerNameDnsDomain, nameW, &size);
517 ok(ret, "GetComputerNameExW(ComputerNameDnsDomain) failed with error %d\n", GetLastError());
518 HeapFree(GetProcessHeap(), 0, nameW);
519
520 size = 0;
521 ret = pGetComputerNameExW(ComputerNameDnsFullyQualified, (LPWSTR)0xdeadbeef, &size);
522 error = GetLastError();
523 ok(!ret && error == ERROR_MORE_DATA, "GetComputerNameExW should have failed with ERROR_MORE_DATA instead of %d\n", error);
524 nameW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(nameW[0]));
525 ok(nameW != NULL, "HeapAlloc failed with error %d\n", GetLastError());
526 ret = pGetComputerNameExW(ComputerNameDnsFullyQualified, nameW, &size);
527 ok(ret, "GetComputerNameExW(ComputerNameDnsFullyQualified) failed with error %d\n", GetLastError());
528 HeapFree(GetProcessHeap(), 0, nameW);
529
530 size = 0;
531 ret = pGetComputerNameExW(ComputerNameDnsHostname, (LPWSTR)0xdeadbeef, &size);
532 error = GetLastError();
533 ok(!ret && error == ERROR_MORE_DATA, "GetComputerNameExW should have failed with ERROR_MORE_DATA instead of %d\n", error);
534 nameW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(nameW[0]));
535 ok(nameW != NULL, "HeapAlloc failed with error %d\n", GetLastError());
536 ret = pGetComputerNameExW(ComputerNameDnsHostname, nameW, &size);
537 ok(ret, "GetComputerNameExW(ComputerNameDnsHostname) failed with error %d\n", GetLastError());
538 HeapFree(GetProcessHeap(), 0, nameW);
539
540 size = 0;
541 ret = pGetComputerNameExW(ComputerNameNetBIOS, (LPWSTR)0xdeadbeef, &size);
542 error = GetLastError();
543 ok(!ret && error == ERROR_MORE_DATA, "GetComputerNameExW should have failed with ERROR_MORE_DATA instead of %d\n", error);
544 nameW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(nameW[0]));
545 ok(nameW != NULL, "HeapAlloc failed with error %d\n", GetLastError());
546 ret = pGetComputerNameExW(ComputerNameNetBIOS, nameW, &size);
547 ok(ret, "GetComputerNameExW(ComputerNameNetBIOS) failed with error %d\n", GetLastError());
548 HeapFree(GetProcessHeap(), 0, nameW);
549 }
550
551 START_TEST(environ)
552 {
553 init_functionpointers();
554
555 test_Predefined();
556 test_GetSetEnvironmentVariableA();
557 test_GetSetEnvironmentVariableW();
558 test_ExpandEnvironmentStringsA();
559 test_GetComputerName();
560 test_GetComputerNameExA();
561 test_GetComputerNameExW();
562 }