3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/env.c
6 * PURPOSE: Environment functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 #include <ddk/ntddk.h>
13 #include <ntdll/rtl.h>
19 #include <kernel32/kernel32.h>
20 #include <kernel32/error.h>
23 /* FUNCTIONS ******************************************************************/
27 GetEnvironmentVariableA (
35 UNICODE_STRING VarNameU;
36 UNICODE_STRING VarValueU;
39 /* initialize unicode variable name string */
40 RtlInitAnsiString (&VarName,
42 RtlAnsiStringToUnicodeString (&VarNameU,
46 /* initialize ansi variable value string */
48 VarValue.MaximumLength = nSize;
49 VarValue.Buffer = lpBuffer;
51 /* initialize unicode variable value string and allocate buffer */
53 VarValueU.MaximumLength = nSize * sizeof(WCHAR);
54 VarValueU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
56 VarValueU.MaximumLength);
58 /* get unicode environment variable */
59 Status = RtlQueryEnvironmentVariable_U (NULL,
62 if (!NT_SUCCESS(Status))
64 /* free unicode buffer */
65 RtlFreeHeap (RtlGetProcessHeap (),
69 /* free unicode variable name string */
70 RtlFreeUnicodeString (&VarNameU);
72 SetLastErrorByStatus (Status);
73 if (Status == STATUS_BUFFER_TOO_SMALL)
75 return VarValueU.Length / sizeof(WCHAR) + 1;
83 /* convert unicode value string to ansi */
84 RtlUnicodeStringToAnsiString (&VarValue,
88 /* free unicode buffer */
89 RtlFreeHeap (RtlGetProcessHeap (),
93 /* free unicode variable name string */
94 RtlFreeUnicodeString (&VarNameU);
96 return (VarValueU.Length / sizeof(WCHAR));
102 GetEnvironmentVariableW (
108 UNICODE_STRING VarName;
109 UNICODE_STRING VarValue;
112 RtlInitUnicodeString (&VarName,
116 VarValue.MaximumLength = nSize * sizeof(WCHAR);
117 VarValue.Buffer = lpBuffer;
119 Status = RtlQueryEnvironmentVariable_U (NULL,
122 if (!NT_SUCCESS(Status))
124 SetLastErrorByStatus (Status);
125 if (Status == STATUS_BUFFER_TOO_SMALL)
127 return (VarValue.Length / sizeof(WCHAR)) + 1;
135 return (VarValue.Length / sizeof(WCHAR));
141 SetEnvironmentVariableA (
147 ANSI_STRING VarValue;
148 UNICODE_STRING VarNameU;
149 UNICODE_STRING VarValueU;
152 DPRINT("SetEnvironmentVariableA(Name '%s', Value '%s')\n", lpName, lpValue);
154 RtlInitAnsiString (&VarName,
156 RtlAnsiStringToUnicodeString (&VarNameU,
160 RtlInitAnsiString (&VarValue,
162 RtlAnsiStringToUnicodeString (&VarValueU,
166 Status = RtlSetEnvironmentVariable (NULL,
170 RtlFreeUnicodeString (&VarNameU);
171 RtlFreeUnicodeString (&VarValueU);
173 if (!NT_SUCCESS(Status))
175 SetLastErrorByStatus (Status);
185 SetEnvironmentVariableW (
190 UNICODE_STRING VarName;
191 UNICODE_STRING VarValue;
194 DPRINT("SetEnvironmentVariableW(Name '%S', Value '%S')\n", lpName, lpValue);
196 RtlInitUnicodeString (&VarName,
199 RtlInitUnicodeString (&VarValue,
202 Status = RtlSetEnvironmentVariable (NULL,
205 if (!NT_SUCCESS(Status))
207 SetLastErrorByStatus (Status);
220 OSVERSIONINFO VersionInformation;
221 GetVersionExW(&VersionInformation);
223 Version |= ( VersionInformation.dwMajorVersion << 8 );
224 Version |= VersionInformation.dwMinorVersion;
226 Version |= ( VersionInformation.dwPlatformId << 16 );
235 LPOSVERSIONINFO lpVersionInformation
238 lpVersionInformation->dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
239 lpVersionInformation->dwMajorVersion = 4;
240 lpVersionInformation->dwMinorVersion = 0;
241 lpVersionInformation->dwBuildNumber = 12;
242 lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
243 lstrcpyW((WCHAR *)lpVersionInformation->szCSDVersion,L"Ariadne was here...");
251 LPOSVERSIONINFO lpVersionInformation
254 lpVersionInformation->dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
255 lpVersionInformation->dwMajorVersion = 4;
256 lpVersionInformation->dwMinorVersion = 0;
257 lpVersionInformation->dwBuildNumber = 12;
258 lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
259 lstrcpyA((char *)lpVersionInformation->szCSDVersion,"ReactOs Pre-Alpha");
266 GetEnvironmentStringsA (
270 UNICODE_STRING UnicodeString;
271 ANSI_STRING AnsiString;
277 EnvU = (PWCHAR)(NtCurrentPeb ()->ProcessParameters->Environment);
285 /* get environment size */
293 Length = (ULONG)(PtrU - EnvU);
294 DPRINT("Length %lu\n", Length);
296 /* allocate environment buffer */
297 EnvPtr = RtlAllocateHeap (RtlGetProcessHeap (),
300 DPRINT("EnvPtr %p\n", EnvPtr);
302 /* convert unicode environment to ansi */
303 UnicodeString.MaximumLength = Length * sizeof(WCHAR) + sizeof(WCHAR);
304 UnicodeString.Buffer = EnvU;
306 AnsiString.MaximumLength = Length + 1;
307 AnsiString.Length = 0;
308 AnsiString.Buffer = EnvPtr;
310 DPRINT ("UnicodeString.Buffer \'%S\'\n", UnicodeString.Buffer);
312 while (*(UnicodeString.Buffer))
314 UnicodeString.Length = wcslen (UnicodeString.Buffer) * sizeof(WCHAR);
315 UnicodeString.MaximumLength = UnicodeString.Length + sizeof(WCHAR);
316 if (UnicodeString.Length > 0)
318 AnsiString.Length = 0;
319 AnsiString.MaximumLength = Length + 1 - (AnsiString.Buffer - EnvPtr);
321 RtlUnicodeStringToAnsiString (&AnsiString,
325 AnsiString.Buffer += (AnsiString.Length + 1);
326 UnicodeString.Buffer += ((UnicodeString.Length / sizeof(WCHAR)) + 1);
329 *(AnsiString.Buffer) = 0;
337 GetEnvironmentStringsW (
341 return (LPWSTR)(NtCurrentPeb ()->ProcessParameters->Environment);
347 FreeEnvironmentStringsA (
348 LPSTR EnvironmentStrings
351 if (EnvironmentStrings == NULL)
354 RtlFreeHeap (RtlGetProcessHeap (),
364 FreeEnvironmentStringsW (
365 LPWSTR EnvironmentStrings
374 ExpandEnvironmentStringsA (
381 ANSI_STRING Destination;
382 UNICODE_STRING SourceU;
383 UNICODE_STRING DestinationU;
387 RtlInitAnsiString (&Source,
389 RtlAnsiStringToUnicodeString (&SourceU,
393 Destination.Length = 0;
394 Destination.MaximumLength = nSize;
395 Destination.Buffer = lpDst,
397 DestinationU.Length = 0;
398 DestinationU.MaximumLength = nSize * sizeof(WCHAR);
399 DestinationU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
401 DestinationU.MaximumLength);
403 Status = RtlExpandEnvironmentStrings_U (NULL,
408 RtlFreeUnicodeString (&SourceU);
410 if (!NT_SUCCESS(Status))
412 RtlFreeHeap (RtlGetProcessHeap (),
414 DestinationU.Buffer);
415 SetLastErrorByStatus (Status);
419 RtlUnicodeStringToAnsiString (&Destination,
423 RtlFreeHeap (RtlGetProcessHeap (),
425 DestinationU.Buffer);
427 return (Length / sizeof(WCHAR));
433 ExpandEnvironmentStringsW (
439 UNICODE_STRING Source;
440 UNICODE_STRING Destination;
444 RtlInitUnicodeString (&Source,
447 Destination.Length = 0;
448 Destination.MaximumLength = nSize * sizeof(WCHAR);
449 Destination.Buffer = lpDst;
451 Status = RtlExpandEnvironmentStrings_U (NULL,
455 if (!NT_SUCCESS(Status))
457 SetLastErrorByStatus (Status);
461 return (Length / sizeof(WCHAR));