1 /* $Id: curdir.c,v 1.43 2004/06/06 17:29:57 hbirr Exp $
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 "../include/debug.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 RtlRosInitUnicodeStringFromLiteral (&Name
,
230 Status
= RtlQueryEnvironmentVariable_U (NULL
,
233 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_TOO_SMALL
)
235 RtlRosInitUnicodeStringFromLiteral (&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
);