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 ******************************************************************/
14 #include <ddk/ntddk.h>
15 #include <ntdll/rtl.h>
19 #include <kernel32/kernel32.h>
20 #include <kernel32/error.h>
23 /* GLOBAL VARIABLES **********************************************************/
25 UNICODE_STRING SystemDirectory;
26 UNICODE_STRING WindowsDirectory;
29 /* 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;
80 GetCurrentDirectoryW (
87 Length = RtlGetCurrentDirectory_U (nBufferLength,
90 return (Length / sizeof (WCHAR));
96 SetCurrentDirectoryA (
100 ANSI_STRING AnsiString;
101 UNICODE_STRING UnicodeString;
104 RtlInitAnsiString (&AnsiString,
107 /* convert ansi (or oem) to unicode */
109 RtlAnsiStringToUnicodeString (&UnicodeString,
113 RtlOemStringToUnicodeString (&UnicodeString,
117 Status = RtlSetCurrentDirectory_U (&UnicodeString);
119 RtlFreeUnicodeString (&UnicodeString);
121 if (!NT_SUCCESS(Status))
123 SetLastErrorByStatus (Status);
133 SetCurrentDirectoryW (
137 UNICODE_STRING UnicodeString;
140 RtlInitUnicodeString (&UnicodeString,
143 Status = RtlSetCurrentDirectory_U (&UnicodeString);
144 if (!NT_SUCCESS(Status))
146 SetLastErrorByStatus (Status);
161 UNICODE_STRING UnicodeString;
162 ANSI_STRING AnsiString;
164 AnsiString.Length = 0;
165 AnsiString.MaximumLength = nBufferLength;
166 AnsiString.Buffer = lpBuffer;
168 /* initialize allocate unicode string */
169 UnicodeString.Length = 0;
170 UnicodeString.MaximumLength = nBufferLength * sizeof(WCHAR);
171 UnicodeString.Buffer = RtlAllocateHeap (RtlGetProcessHeap(),
173 UnicodeString.MaximumLength);
175 UnicodeString.Length = GetTempPathW (nBufferLength,
176 UnicodeString.Buffer) * sizeof(WCHAR);
178 /* convert unicode string to ansi (or oem) */
180 RtlUnicodeStringToAnsiString (&AnsiString,
184 RtlUnicodeStringToOemString (&AnsiString,
188 /* free unicode string buffer */
189 RtlFreeHeap (RtlGetProcessHeap (),
191 UnicodeString.Buffer);
193 return AnsiString.Length;
205 UNICODE_STRING Value;
209 Value.MaximumLength = (nBufferLength - 1) * sizeof(WCHAR);
210 Value.Buffer = lpBuffer;
212 RtlInitUnicodeStringFromLiteral (&Name,
215 Status = RtlQueryEnvironmentVariable_U (NULL,
218 if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL)
220 RtlInitUnicodeStringFromLiteral (&Name,
223 Status = RtlQueryEnvironmentVariable_U (NULL,
227 if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL)
229 Value.Length = RtlGetCurrentDirectory_U (Value.MaximumLength,
234 if (NT_SUCCESS(Status))
236 lpBuffer[Value.Length / sizeof(WCHAR)] = L'\\';
237 lpBuffer[Value.Length / sizeof(WCHAR) + 1] = 0;
240 return Value.Length / sizeof(WCHAR) + 1;
246 GetSystemDirectoryA (
255 if (lpBuffer == NULL)
258 Length = RtlUnicodeStringToAnsiSize (&SystemDirectory); //len of ansi str incl. nullchar
260 if (uSize >= Length){
262 String.MaximumLength = uSize;
263 String.Buffer = lpBuffer;
265 /* convert unicode string to ansi (or oem) */
267 Status = RtlUnicodeStringToAnsiString (&String,
271 Status = RtlUnicodeStringToOemString (&String,
274 if (!NT_SUCCESS(Status) )
277 return Length-1; //good: ret chars excl. nullchar
281 return Length; //bad: ret space needed incl. nullchar
287 GetSystemDirectoryW (
294 if (lpBuffer == NULL)
297 Length = SystemDirectory.Length / sizeof (WCHAR);
298 if (uSize > Length) {
300 SystemDirectory.Buffer,
301 SystemDirectory.Length);
302 lpBuffer[Length] = 0;
304 return Length; //good: ret chars excl. nullchar
307 return Length+1; //bad: ret space needed incl. nullchar
313 GetWindowsDirectoryA (
322 if (lpBuffer == NULL)
325 Length = RtlUnicodeStringToAnsiSize (&WindowsDirectory); //len of ansi str incl. nullchar
327 printf("windirlen incl term %i\n", Length);
329 if (uSize >= Length){
331 printf("ok: enoug space\n");
334 String.MaximumLength = uSize;
335 String.Buffer = lpBuffer;
337 /* convert unicode string to ansi (or oem) */
339 Status = RtlUnicodeStringToAnsiString (&String,
343 Status = RtlUnicodeStringToOemString (&String,
347 if (!NT_SUCCESS(Status))
350 printf("good: ret chars %i\n",Length-1);
351 printf("dir: %s\n",lpBuffer);
352 return Length-1; //good: ret chars excl. nullchar
355 printf("bad: ret chars needed %i\n",Length);
356 return Length; //bad: ret space needed incl. nullchar
362 GetWindowsDirectoryW (
369 if (lpBuffer == NULL)
372 Length = WindowsDirectory.Length / sizeof (WCHAR);
376 WindowsDirectory.Buffer,
377 WindowsDirectory.Length);
378 lpBuffer[Length] = 0;
380 return Length; //good: ret chars excl. nullchar
383 return Length+1; //bad: ret space needed incl. nullchar