1 /* $Id: env.c,v 1.13 2002/04/01 22:08:20 hbirr Exp $
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
));