3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/curdir.c
6 * PURPOSE: Current directory functions
12 /* INCLUDES ******************************************************************/
17 #include <kernel32/kernel32.h>
20 /* GLOBAL VARIABLES **********************************************************/
22 UNICODE_STRING SystemDirectory;
23 UNICODE_STRING WindowsDirectory;
26 /* FUNCTIONS *****************************************************************/
30 GetCurrentDirectoryA (
35 ANSI_STRING AnsiString;
36 UNICODE_STRING UnicodeString;
38 /* initialize ansi string */
39 AnsiString.Length = 0;
40 AnsiString.MaximumLength = nBufferLength;
41 AnsiString.Buffer = lpBuffer;
43 /* allocate buffer for unicode string */
44 UnicodeString.Length = 0;
45 UnicodeString.MaximumLength = nBufferLength * sizeof(WCHAR);
46 UnicodeString.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
48 UnicodeString.MaximumLength);
50 /* get current directory */
51 UnicodeString.Length = RtlGetCurrentDirectory_U (UnicodeString.MaximumLength,
52 UnicodeString.Buffer);
53 DPRINT("UnicodeString.Buffer %S\n", UnicodeString.Buffer);
55 /* convert unicode string to ansi (or oem) */
57 RtlUnicodeStringToAnsiString (&AnsiString,
61 RtlUnicodeStringToOemString (&AnsiString,
64 DPRINT("AnsiString.Buffer %s\n", AnsiString.Buffer);
66 /* free unicode string */
67 RtlFreeHeap (RtlGetProcessHeap (),
69 UnicodeString.Buffer);
71 return AnsiString.Length;
77 GetCurrentDirectoryW (
84 Length = RtlGetCurrentDirectory_U (nBufferLength,
87 return (Length / sizeof (WCHAR));
93 SetCurrentDirectoryA (
97 ANSI_STRING AnsiString;
98 UNICODE_STRING UnicodeString;
101 RtlInitAnsiString (&AnsiString,
104 /* convert ansi (or oem) to unicode */
106 RtlAnsiStringToUnicodeString (&UnicodeString,
110 RtlOemStringToUnicodeString (&UnicodeString,
114 Status = RtlSetCurrentDirectory_U (&UnicodeString);
116 RtlFreeUnicodeString (&UnicodeString);
118 if (!NT_SUCCESS(Status))
120 SetLastErrorByStatus (Status);
130 SetCurrentDirectoryW (
134 UNICODE_STRING UnicodeString;
137 RtlInitUnicodeString (&UnicodeString,
140 Status = RtlSetCurrentDirectory_U (&UnicodeString);
141 if (!NT_SUCCESS(Status))
143 SetLastErrorByStatus (Status);
158 UNICODE_STRING UnicodeString;
159 ANSI_STRING AnsiString;
161 AnsiString.Length = 0;
162 AnsiString.MaximumLength = nBufferLength;
163 AnsiString.Buffer = lpBuffer;
165 /* initialize allocate unicode string */
166 UnicodeString.Length = 0;
167 UnicodeString.MaximumLength = nBufferLength * sizeof(WCHAR);
168 UnicodeString.Buffer = RtlAllocateHeap (RtlGetProcessHeap(),
170 UnicodeString.MaximumLength);
172 UnicodeString.Length = GetTempPathW (nBufferLength,
173 UnicodeString.Buffer) * sizeof(WCHAR);
175 /* convert unicode string to ansi (or oem) */
177 RtlUnicodeStringToAnsiString (&AnsiString,
181 RtlUnicodeStringToOemString (&AnsiString,
185 /* free unicode string buffer */
186 RtlFreeHeap (RtlGetProcessHeap (),
188 UnicodeString.Buffer);
190 return AnsiString.Length;
202 UNICODE_STRING Value;
206 Value.MaximumLength = (nBufferLength - 1) * sizeof(WCHAR);
207 Value.Buffer = lpBuffer;
209 RtlInitUnicodeStringFromLiteral (&Name,
212 Status = RtlQueryEnvironmentVariable_U (NULL,
215 if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL)
217 RtlInitUnicodeStringFromLiteral (&Name,
220 Status = RtlQueryEnvironmentVariable_U (NULL,
224 if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL)
226 Value.Length = RtlGetCurrentDirectory_U (Value.MaximumLength,
231 if (NT_SUCCESS(Status))
233 lpBuffer[Value.Length / sizeof(WCHAR)] = L'\\';
234 lpBuffer[Value.Length / sizeof(WCHAR) + 1] = 0;
237 return Value.Length / sizeof(WCHAR) + 1;
243 GetSystemDirectoryA (
252 if (lpBuffer == NULL)
255 Length = RtlUnicodeStringToAnsiSize (&SystemDirectory); //len of ansi str incl. nullchar
257 if (uSize >= Length){
259 String.MaximumLength = uSize;
260 String.Buffer = lpBuffer;
262 /* convert unicode string to ansi (or oem) */
264 Status = RtlUnicodeStringToAnsiString (&String,
268 Status = RtlUnicodeStringToOemString (&String,
271 if (!NT_SUCCESS(Status) )
274 return Length-1; //good: ret chars excl. nullchar
278 return Length; //bad: ret space needed incl. nullchar
284 GetSystemDirectoryW (
291 if (lpBuffer == NULL)
294 Length = SystemDirectory.Length / sizeof (WCHAR);
295 if (uSize > Length) {
297 SystemDirectory.Buffer,
298 SystemDirectory.Length);
299 lpBuffer[Length] = 0;
301 return Length; //good: ret chars excl. nullchar
304 return Length+1; //bad: ret space needed incl. nullchar
310 GetWindowsDirectoryA (
319 if (lpBuffer == NULL)
322 Length = RtlUnicodeStringToAnsiSize (&WindowsDirectory); //len of ansi str incl. nullchar
324 if (uSize >= Length){
327 String.MaximumLength = uSize;
328 String.Buffer = lpBuffer;
330 /* convert unicode string to ansi (or oem) */
332 Status = RtlUnicodeStringToAnsiString (&String,
336 Status = RtlUnicodeStringToOemString (&String,
340 if (!NT_SUCCESS(Status))
343 return Length-1; //good: ret chars excl. nullchar
346 return Length; //bad: ret space needed incl. nullchar
352 GetWindowsDirectoryW (
359 if (lpBuffer == NULL)
362 Length = WindowsDirectory.Length / sizeof (WCHAR);
366 WindowsDirectory.Buffer,
367 WindowsDirectory.Length);
368 lpBuffer[Length] = 0;
370 return Length; //good: ret chars excl. nullchar
373 return Length+1; //bad: ret space needed incl. nullchar