1 /* $Id: env.c,v 1.14 2002/09/07 15:12:27 chorns 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)
14 #define NTOS_USER_MODE
20 #include <kernel32/kernel32.h>
21 #include <kernel32/error.h>
24 /* FUNCTIONS ******************************************************************/
28 GetEnvironmentVariableA (
36 UNICODE_STRING VarNameU
;
37 UNICODE_STRING VarValueU
;
40 /* initialize unicode variable name string */
41 RtlInitAnsiString (&VarName
,
43 RtlAnsiStringToUnicodeString (&VarNameU
,
47 /* initialize ansi variable value string */
49 VarValue
.MaximumLength
= nSize
;
50 VarValue
.Buffer
= lpBuffer
;
52 /* initialize unicode variable value string and allocate buffer */
54 VarValueU
.MaximumLength
= nSize
* sizeof(WCHAR
);
55 VarValueU
.Buffer
= RtlAllocateHeap (RtlGetProcessHeap (),
57 VarValueU
.MaximumLength
);
59 /* get unicode environment variable */
60 Status
= RtlQueryEnvironmentVariable_U (NULL
,
63 if (!NT_SUCCESS(Status
))
65 /* free unicode buffer */
66 RtlFreeHeap (RtlGetProcessHeap (),
70 /* free unicode variable name string */
71 RtlFreeUnicodeString (&VarNameU
);
73 SetLastErrorByStatus (Status
);
74 if (Status
== STATUS_BUFFER_TOO_SMALL
)
76 return VarValueU
.Length
/ sizeof(WCHAR
) + 1;
84 /* convert unicode value string to ansi */
85 RtlUnicodeStringToAnsiString (&VarValue
,
89 /* free unicode buffer */
90 RtlFreeHeap (RtlGetProcessHeap (),
94 /* free unicode variable name string */
95 RtlFreeUnicodeString (&VarNameU
);
97 return (VarValueU
.Length
/ sizeof(WCHAR
));
103 GetEnvironmentVariableW (
109 UNICODE_STRING VarName
;
110 UNICODE_STRING VarValue
;
113 RtlInitUnicodeString (&VarName
,
117 VarValue
.MaximumLength
= nSize
* sizeof(WCHAR
);
118 VarValue
.Buffer
= lpBuffer
;
120 Status
= RtlQueryEnvironmentVariable_U (NULL
,
123 if (!NT_SUCCESS(Status
))
125 SetLastErrorByStatus (Status
);
126 if (Status
== STATUS_BUFFER_TOO_SMALL
)
128 return (VarValue
.Length
/ sizeof(WCHAR
)) + 1;
136 return (VarValue
.Length
/ sizeof(WCHAR
));
142 SetEnvironmentVariableA (
148 ANSI_STRING VarValue
;
149 UNICODE_STRING VarNameU
;
150 UNICODE_STRING VarValueU
;
153 DPRINT("SetEnvironmentVariableA(Name '%s', Value '%s')\n", lpName
, lpValue
);
155 RtlInitAnsiString (&VarName
,
157 RtlAnsiStringToUnicodeString (&VarNameU
,
161 RtlInitAnsiString (&VarValue
,
163 RtlAnsiStringToUnicodeString (&VarValueU
,
167 Status
= RtlSetEnvironmentVariable (NULL
,
171 RtlFreeUnicodeString (&VarNameU
);
172 RtlFreeUnicodeString (&VarValueU
);
174 if (!NT_SUCCESS(Status
))
176 SetLastErrorByStatus (Status
);
186 SetEnvironmentVariableW (
191 UNICODE_STRING VarName
;
192 UNICODE_STRING VarValue
;
195 DPRINT("SetEnvironmentVariableW(Name '%S', Value '%S')\n", lpName
, lpValue
);
197 RtlInitUnicodeString (&VarName
,
200 RtlInitUnicodeString (&VarValue
,
203 Status
= RtlSetEnvironmentVariable (NULL
,
206 if (!NT_SUCCESS(Status
))
208 SetLastErrorByStatus (Status
);
221 OSVERSIONINFOW VersionInformation
;
223 GetVersionExW(&VersionInformation
);
225 Version
|= ( VersionInformation
.dwMajorVersion
<< 8 );
226 Version
|= VersionInformation
.dwMinorVersion
;
228 Version
|= ( VersionInformation
.dwPlatformId
<< 16 );
237 LPOSVERSIONINFOW lpVersionInformation
240 lpVersionInformation
->dwOSVersionInfoSize
= sizeof(OSVERSIONINFO
);
241 lpVersionInformation
->dwMajorVersion
= 4;
242 lpVersionInformation
->dwMinorVersion
= 0;
243 lpVersionInformation
->dwBuildNumber
= 12;
244 lpVersionInformation
->dwPlatformId
= VER_PLATFORM_WIN32_NT
;
245 lstrcpyW((WCHAR
*)lpVersionInformation
->szCSDVersion
,L
"Ariadne was here...");
253 LPOSVERSIONINFOA lpVersionInformation
256 lpVersionInformation
->dwOSVersionInfoSize
= sizeof(OSVERSIONINFO
);
257 lpVersionInformation
->dwMajorVersion
= 4;
258 lpVersionInformation
->dwMinorVersion
= 0;
259 lpVersionInformation
->dwBuildNumber
= 12;
260 lpVersionInformation
->dwPlatformId
= VER_PLATFORM_WIN32_NT
;
261 lstrcpyA((char *)lpVersionInformation
->szCSDVersion
,"ReactOs Pre-Alpha");
268 GetEnvironmentStringsA (
272 UNICODE_STRING UnicodeString
;
273 ANSI_STRING AnsiString
;
279 EnvU
= (PWCHAR
)(NtCurrentPeb ()->ProcessParameters
->Environment
);
287 /* get environment size */
295 Length
= (ULONG
)(PtrU
- EnvU
);
296 DPRINT("Length %lu\n", Length
);
298 /* allocate environment buffer */
299 EnvPtr
= RtlAllocateHeap (RtlGetProcessHeap (),
302 DPRINT("EnvPtr %p\n", EnvPtr
);
304 /* convert unicode environment to ansi */
305 UnicodeString
.MaximumLength
= Length
* sizeof(WCHAR
) + sizeof(WCHAR
);
306 UnicodeString
.Buffer
= EnvU
;
308 AnsiString
.MaximumLength
= Length
+ 1;
309 AnsiString
.Length
= 0;
310 AnsiString
.Buffer
= EnvPtr
;
312 DPRINT ("UnicodeString.Buffer \'%S\'\n", UnicodeString
.Buffer
);
314 while (*(UnicodeString
.Buffer
))
316 UnicodeString
.Length
= wcslen (UnicodeString
.Buffer
) * sizeof(WCHAR
);
317 UnicodeString
.MaximumLength
= UnicodeString
.Length
+ sizeof(WCHAR
);
318 if (UnicodeString
.Length
> 0)
320 AnsiString
.Length
= 0;
321 AnsiString
.MaximumLength
= Length
+ 1 - (AnsiString
.Buffer
- EnvPtr
);
323 RtlUnicodeStringToAnsiString (&AnsiString
,
327 AnsiString
.Buffer
+= (AnsiString
.Length
+ 1);
328 UnicodeString
.Buffer
+= ((UnicodeString
.Length
/ sizeof(WCHAR
)) + 1);
331 *(AnsiString
.Buffer
) = 0;
339 GetEnvironmentStringsW (
343 return (LPWSTR
)(NtCurrentPeb ()->ProcessParameters
->Environment
);
349 FreeEnvironmentStringsA (
350 LPSTR EnvironmentStrings
353 if (EnvironmentStrings
== NULL
)
356 RtlFreeHeap (RtlGetProcessHeap (),
366 FreeEnvironmentStringsW (
367 LPWSTR EnvironmentStrings
376 ExpandEnvironmentStringsA (
383 ANSI_STRING Destination
;
384 UNICODE_STRING SourceU
;
385 UNICODE_STRING DestinationU
;
389 RtlInitAnsiString (&Source
,
391 RtlAnsiStringToUnicodeString (&SourceU
,
395 Destination
.Length
= 0;
396 Destination
.MaximumLength
= nSize
;
397 Destination
.Buffer
= lpDst
,
399 DestinationU
.Length
= 0;
400 DestinationU
.MaximumLength
= nSize
* sizeof(WCHAR
);
401 DestinationU
.Buffer
= RtlAllocateHeap (RtlGetProcessHeap (),
403 DestinationU
.MaximumLength
);
405 Status
= RtlExpandEnvironmentStrings_U (NULL
,
410 RtlFreeUnicodeString (&SourceU
);
412 if (!NT_SUCCESS(Status
))
414 RtlFreeHeap (RtlGetProcessHeap (),
416 DestinationU
.Buffer
);
417 SetLastErrorByStatus (Status
);
421 RtlUnicodeStringToAnsiString (&Destination
,
425 RtlFreeHeap (RtlGetProcessHeap (),
427 DestinationU
.Buffer
);
429 return (Length
/ sizeof(WCHAR
));
435 ExpandEnvironmentStringsW (
441 UNICODE_STRING Source
;
442 UNICODE_STRING Destination
;
446 RtlInitUnicodeString (&Source
,
449 Destination
.Length
= 0;
450 Destination
.MaximumLength
= nSize
* sizeof(WCHAR
);
451 Destination
.Buffer
= lpDst
;
453 Status
= RtlExpandEnvironmentStrings_U (NULL
,
457 if (!NT_SUCCESS(Status
))
459 SetLastErrorByStatus (Status
);
463 return (Length
/ sizeof(WCHAR
));