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 *****************************************************************/
33 GetCurrentDirectoryA (
38 ANSI_STRING AnsiString;
39 UNICODE_STRING UnicodeString;
41 /* initialize ansi string */
42 AnsiString.Length = 0;
43 AnsiString.MaximumLength = nBufferLength;
44 AnsiString.Buffer = lpBuffer;
46 /* allocate buffer for unicode string */
47 UnicodeString.Length = 0;
48 UnicodeString.MaximumLength = nBufferLength * sizeof(WCHAR);
49 UnicodeString.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
51 UnicodeString.MaximumLength);
53 /* get current directory */
54 UnicodeString.Length = RtlGetCurrentDirectory_U (UnicodeString.MaximumLength,
55 UnicodeString.Buffer);
56 DPRINT("UnicodeString.Buffer %S\n", UnicodeString.Buffer);
58 /* convert unicode string to ansi (or oem) */
60 RtlUnicodeStringToAnsiString (&AnsiString,
64 RtlUnicodeStringToOemString (&AnsiString,
67 DPRINT("AnsiString.Buffer %s\n", AnsiString.Buffer);
69 /* free unicode string */
70 RtlFreeHeap (RtlGetProcessHeap (),
72 UnicodeString.Buffer);
74 return AnsiString.Length;
83 GetCurrentDirectoryW (
90 Length = RtlGetCurrentDirectory_U (nBufferLength * sizeof(WCHAR),
93 return (Length / sizeof (WCHAR));
102 SetCurrentDirectoryA (
106 ANSI_STRING AnsiString;
107 UNICODE_STRING UnicodeString;
110 RtlInitAnsiString (&AnsiString,
113 /* convert ansi (or oem) to unicode */
115 RtlAnsiStringToUnicodeString (&UnicodeString,
119 RtlOemStringToUnicodeString (&UnicodeString,
123 Status = RtlSetCurrentDirectory_U (&UnicodeString);
125 RtlFreeUnicodeString (&UnicodeString);
127 if (!NT_SUCCESS(Status))
129 SetLastErrorByStatus (Status);
142 SetCurrentDirectoryW (
146 UNICODE_STRING UnicodeString;
149 RtlInitUnicodeString (&UnicodeString,
152 Status = RtlSetCurrentDirectory_U (&UnicodeString);
153 if (!NT_SUCCESS(Status))
155 SetLastErrorByStatus (Status);
173 UNICODE_STRING UnicodeString;
174 ANSI_STRING AnsiString;
176 AnsiString.Length = 0;
177 AnsiString.MaximumLength = nBufferLength;
178 AnsiString.Buffer = lpBuffer;
180 /* initialize allocate unicode string */
181 UnicodeString.Length = 0;
182 UnicodeString.MaximumLength = nBufferLength * sizeof(WCHAR);
183 UnicodeString.Buffer = RtlAllocateHeap (RtlGetProcessHeap(),
185 UnicodeString.MaximumLength);
187 UnicodeString.Length = GetTempPathW (nBufferLength,
188 UnicodeString.Buffer) * sizeof(WCHAR);
190 /* convert unicode string to ansi (or oem) */
192 RtlUnicodeStringToAnsiString (&AnsiString,
196 RtlUnicodeStringToOemString (&AnsiString,
200 /* free unicode string buffer */
201 RtlFreeHeap (RtlGetProcessHeap (),
203 UnicodeString.Buffer);
205 return AnsiString.Length;
220 UNICODE_STRING Value;
224 Value.MaximumLength = (nBufferLength - 1) * sizeof(WCHAR);
225 Value.Buffer = lpBuffer;
227 RtlInitUnicodeStringFromLiteral (&Name,
230 Status = RtlQueryEnvironmentVariable_U (NULL,
233 if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL)
235 RtlInitUnicodeStringFromLiteral (&Name,
238 Status = RtlQueryEnvironmentVariable_U (NULL,
242 if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL)
244 Value.Length = RtlGetCurrentDirectory_U (Value.MaximumLength,
249 if (NT_SUCCESS(Status))
251 lpBuffer[Value.Length / sizeof(WCHAR)] = L'\\';
252 lpBuffer[Value.Length / sizeof(WCHAR) + 1] = 0;
255 return Value.Length / sizeof(WCHAR) + 1;
264 GetSystemDirectoryA (
273 if (lpBuffer == NULL)
276 Length = RtlUnicodeStringToAnsiSize (&SystemDirectory); //len of ansi str incl. nullchar
278 if (uSize >= Length){
280 String.MaximumLength = uSize;
281 String.Buffer = lpBuffer;
283 /* convert unicode string to ansi (or oem) */
285 Status = RtlUnicodeStringToAnsiString (&String,
289 Status = RtlUnicodeStringToOemString (&String,
292 if (!NT_SUCCESS(Status) )
295 return Length-1; //good: ret chars excl. nullchar
299 return Length; //bad: ret space needed incl. nullchar
308 GetSystemDirectoryW (
315 if (lpBuffer == NULL)
318 Length = SystemDirectory.Length / sizeof (WCHAR);
319 if (uSize > Length) {
321 SystemDirectory.Buffer,
322 SystemDirectory.Length);
323 lpBuffer[Length] = 0;
325 return Length; //good: ret chars excl. nullchar
328 return Length+1; //bad: ret space needed incl. nullchar
336 GetWindowsDirectoryA (
345 if (lpBuffer == NULL)
348 Length = RtlUnicodeStringToAnsiSize (&WindowsDirectory); //len of ansi str incl. nullchar
350 if (uSize >= Length){
353 String.MaximumLength = uSize;
354 String.Buffer = lpBuffer;
356 /* convert unicode string to ansi (or oem) */
358 Status = RtlUnicodeStringToAnsiString (&String,
362 Status = RtlUnicodeStringToOemString (&String,
366 if (!NT_SUCCESS(Status))
369 return Length-1; //good: ret chars excl. nullchar
372 return Length; //bad: ret space needed incl. nullchar
381 GetWindowsDirectoryW (
388 if (lpBuffer == NULL)
391 Length = WindowsDirectory.Length / sizeof (WCHAR);
395 WindowsDirectory.Buffer,
396 WindowsDirectory.Length);
397 lpBuffer[Length] = 0;
399 return Length; //good: ret chars excl. nullchar
402 return Length+1; //bad: ret space needed incl. nullchar
410 GetSystemWindowsDirectoryA(
415 DbgPrint("Fixme: GetSystemWindowsDirectoryA\n");
416 return GetWindowsDirectoryA( lpBuffer, uSize );
424 GetSystemWindowsDirectoryW(
429 DbgPrint("Fixme: GetSystemWindowsDirectoryW\n");
430 return GetWindowsDirectoryW( lpBuffer, uSize );