2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/misc/env.c
5 * PURPOSE: Environment functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 #include <ddk/ntddk.h>
16 #include <kernel32/kernel32.h>
18 #define MAX_ENVIRONMENT_VARS 255
19 #define MAX_VALUE 1024
21 typedef struct _ENV_ELEMENT
28 ENV_ELEMENT Environment
[MAX_ENVIRONMENT_VARS
+1];
31 DWORD STDCALL
GetEnvironmentVariableA(LPCSTR lpName
,
35 WCHAR BufferW
[MAX_VALUE
];
36 WCHAR NameW
[MAX_PATH
];
40 while ((*lpName
)!=0 && i
< MAX_PATH
)
48 RetValue
= GetEnvironmentVariableW(NameW
,BufferW
,nSize
);
50 lpBuffer
[i
] = (char)BufferW
[i
];
56 GetEnvironmentVariableW(
64 NameLen
= lstrlenW(lpName
);
69 if ( _wcsnicmp(Environment
[i
].Name
.Buffer
,lpName
,min(NameLen
,Environment
[i
].Name
.Length
/sizeof(WCHAR
))) != 0 ) {
70 lstrcpynW(lpBuffer
,Environment
[i
].Value
.Buffer
,min(nSize
,Environment
[i
].Value
.Length
/sizeof(WCHAR
)));
72 return lstrlenW(Environment
[i
].Value
.Buffer
);
85 SetEnvironmentVariableA(
90 WCHAR NameW
[MAX_PATH
];
91 WCHAR ValueW
[MAX_VALUE
];
94 while ((*lpName
)!=0 && i
< MAX_PATH
)
104 while ((*lpValue
)!=0 && i
< MAX_PATH
)
106 ValueW
[i
] = *lpValue
;
111 return SetEnvironmentVariableW(NameW
,ValueW
);
118 SetEnvironmentVariableW(
123 UINT NameLen
, ValueLen
;
127 NameLen
= lstrlenW(lpName
);
128 ValueLen
= lstrlenW(lpValue
);
133 if ( _wcsnicmp(Environment
[i
].Name
.Buffer
,lpName
,min(NameLen
,Environment
[i
].Name
.Length
/sizeof(WCHAR
))) != 0 ) {
134 if ( lpValue
!= NULL
) {
135 lstrcpynW(Environment
[i
].Value
.Buffer
,lpValue
,min(ValueLen
,Environment
[i
].Value
.MaximumLength
/sizeof(WCHAR
)));
139 Environment
[i
].Valid
= FALSE
;
140 Environment
[i
].Value
.Length
= 0;
141 Environment
[i
].Name
.Length
= 0;
151 if ( nEnvVar
>= MAX_ENVIRONMENT_VARS
)
156 if ( Environment
[i
].Valid
== FALSE
)
160 if ( i
== nEnvVar
) {
161 NameBuffer
= (WCHAR
*)HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS
|HEAP_ZERO_MEMORY
,MAX_PATH
*sizeof(WCHAR
) );
162 ValueBuffer
= (WCHAR
*)HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS
|HEAP_ZERO_MEMORY
,MAX_VALUE
*sizeof(WCHAR
) );
164 Environment
[i
].Name
.Buffer
= NameBuffer
;
165 Environment
[i
].Name
.MaximumLength
= MAX_PATH
*sizeof(WCHAR
);
167 Environment
[i
].Value
.Buffer
= ValueBuffer
;
168 Environment
[i
].Value
.MaximumLength
= MAX_VALUE
*sizeof(WCHAR
);
171 Environment
[i
].Valid
= TRUE
;
173 lstrcpynW(Environment
[i
].Name
.Buffer
,lpValue
,min(NameLen
,(Environment
[i
].Name
.MaximumLength
-sizeof(WCHAR
))/sizeof(WCHAR
)));
174 Environment
[i
].Name
.Length
= NameLen
*sizeof(WCHAR
);
177 lstrcpynW(Environment
[i
].Value
.Buffer
,lpValue
,min(ValueLen
,(Environment
[i
].Value
.MaximumLength
-sizeof(WCHAR
)))/sizeof(WCHAR
));
178 Environment
[i
].Value
.Length
= ValueLen
*sizeof(WCHAR
);
191 OSVERSIONINFO VersionInformation
;
192 GetVersionExW(&VersionInformation
);
194 Version
|= ( VersionInformation
.dwMajorVersion
<< 8 );
195 Version
|= VersionInformation
.dwMinorVersion
;
197 Version
|= ( VersionInformation
.dwPlatformId
<< 16 );
208 LPOSVERSIONINFO lpVersionInformation
211 lpVersionInformation
->dwOSVersionInfoSize
= sizeof(OSVERSIONINFO
);
212 lpVersionInformation
->dwMajorVersion
= 4;
213 lpVersionInformation
->dwMinorVersion
= 0;
214 lpVersionInformation
->dwBuildNumber
= 12;
215 lpVersionInformation
->dwPlatformId
= VER_PLATFORM_WIN32_NT
;
216 lstrcpyW((WCHAR
*)lpVersionInformation
->szCSDVersion
,L
"Ariadne was here...");
223 LPOSVERSIONINFO lpVersionInformation
226 lpVersionInformation
->dwOSVersionInfoSize
= sizeof(OSVERSIONINFO
);
227 lpVersionInformation
->dwMajorVersion
= 4;
228 lpVersionInformation
->dwMinorVersion
= 0;
229 lpVersionInformation
->dwBuildNumber
= 12;
230 lpVersionInformation
->dwPlatformId
= VER_PLATFORM_WIN32_NT
;
231 lstrcpyA((char *)lpVersionInformation
->szCSDVersion
,"ReactOs Pre-Alpha");
239 LPSTR STDCALL
GetEnvironmentStringsA(VOID
)
242 WCHAR
*EnvironmentStringsW
;
243 char *EnvironmentStringsA
;
250 /* FIXME: This doesn't work */
252 EnvironmentStringsW
= GetEnvironmentStringsW();
253 EnvironmentStringsA
= (char *)EnvironmentStringsW
;
255 for(i
=0;i
<nEnvVar
;i
++)
257 if ( Environment
[i
].Valid
)
259 size
+= Environment
[i
].Name
.Length
;
260 size
+= sizeof(WCHAR
); // =
261 size
+= Environment
[i
].Value
.Length
;
262 size
+= sizeof(WCHAR
); // zero
265 size
+= sizeof(WCHAR
);
266 size
/= sizeof(WCHAR
);
268 EnvironmentStringsA
[i
] = (char)EnvironmentStringsW
[i
];
269 return EnvironmentStringsA
;
274 LPWSTR STDCALL
GetEnvironmentStringsW(VOID
)
279 WCHAR
*EnvironmentString
;
280 WCHAR
*EnvironmentStringSave
;
285 /* FIXME: This doesn't work, why not? */
287 for(i
=0;i
<nEnvVar
;i
++)
289 if ( Environment
[i
].Valid
)
291 size
+= Environment
[i
].Name
.Length
;
292 size
+= sizeof(WCHAR
); // =
293 size
+= Environment
[i
].Value
.Length
;
294 size
+= sizeof(WCHAR
); // zero
297 size
+= sizeof(WCHAR
); // extra zero
298 DPRINT("size %d\n",size
);
299 EnvironmentString
= (WCHAR
*)HeapAlloc(GetProcessHeap(),
300 HEAP_GENERATE_EXCEPTIONS
|HEAP_ZERO_MEMORY
,
302 DPRINT("EnvironmentString %x\n",EnvironmentString
);
303 EnvironmentStringSave
= EnvironmentString
;
304 for(i
=0;i
<nEnvVar
;i
++)
306 if ( Environment
[i
].Valid
)
308 wcscpy(EnvironmentString
,Environment
[i
].Name
.Buffer
);
309 wcscat(EnvironmentString
,L
"=");
310 wcscat(EnvironmentString
,Environment
[i
].Value
.Buffer
);
312 size
= Environment
[i
].Name
.Length
;
313 size
+= sizeof(WCHAR
); // =
314 size
+= Environment
[i
].Value
.Length
;
315 size
+= sizeof(WCHAR
); // zero
316 EnvironmentString
+= (size
/sizeof(WCHAR
));
319 *EnvironmentString
= 0;
320 return EnvironmentStringSave
;
327 FreeEnvironmentStringsA(
328 LPSTR EnvironmentStrings
331 if ( EnvironmentStrings
== NULL
)
333 HeapFree(GetProcessHeap(),0,EnvironmentStrings
);
339 FreeEnvironmentStringsW(
340 LPWSTR EnvironmentStrings
343 if ( EnvironmentStrings
== NULL
)
345 HeapFree(GetProcessHeap(),0,EnvironmentStrings
);
351 LPCSTR lpSrc
, LPSTR lpDst
, DWORD nSize
, DWORD
*nWritten
)
357 if ( nWritten
== NULL
)
360 if ( *lpSrc
!= '%' ) {
365 lpVar
= (LPSTR
)lpSrc
;
369 lpEnd
= strchr( lpVar
, '%' );
370 if ( lpEnd
== NULL
) {
376 nWritten
= GetEnvironmentVariableA(lpVar
,lpDst
,nSize
);
382 if ( nWritten
> nSize
)
385 return (lpEnd
- lpVar
) -1;
389 DWORD STDCALL
ExpandEnvironmentStringsA(
390 LPCSTR lpSrc
, LPSTR lpDst
, DWORD nSize
396 while(*lpSrc
!= 0 && nSize
> 0 )
398 if ( *lpSrc
== '%' ) {
399 v
= ExpandVariableA(lpSrc
,lpDst
,nSize
, &bw
);
426 LPCWSTR lpSrc
, LPWSTR lpDst
, DWORD nSize
, DWORD
*nWritten
)
431 if ( nWritten
== NULL
)
434 if ( *lpSrc
!= L
'%' ) {
439 lpVar
= (LPWSTR
)lpSrc
;
443 lpEnd
= wcschr( lpVar
, L
'%' );
444 if ( lpEnd
== NULL
) {
450 nWritten
= GetEnvironmentVariableW(lpVar
,lpDst
,nSize
);
456 if ( nWritten
> nSize
)
459 return ((lpEnd
- lpVar
)/2) -1;
463 DWORD STDCALL
ExpandEnvironmentStringsW(
464 LPCWSTR lpSrc
, LPWSTR lpDst
, DWORD nSize
470 while(*lpSrc
!= 0 && nSize
> 0 )
472 if ( *lpSrc
== L
'%' ) {
473 v
= ExpandVariableW(lpSrc
,lpDst
,nSize
, &bw
);