1 /* $Id: curdir.c,v 1.31 2002/09/08 10:22:41 chorns 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 ******************************************************************/
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 (
254 if (lpBuffer
== NULL
)
257 Length
= RtlUnicodeStringToAnsiSize (&SystemDirectory
);
261 String
.MaximumLength
= uSize
;
262 String
.Buffer
= lpBuffer
;
264 /* convert unicode string to ansi (or oem) */
266 RtlUnicodeStringToAnsiString (&String
,
270 RtlUnicodeStringToOemString (&String
,
281 GetSystemDirectoryW (
288 if (lpBuffer
== NULL
)
291 Length
= SystemDirectory
.Length
/ sizeof (WCHAR
);
295 SystemDirectory
.Buffer
,
296 SystemDirectory
.Length
);
297 lpBuffer
[Length
] = 0;
306 GetWindowsDirectoryA (
314 if (lpBuffer
== NULL
)
317 Length
= RtlUnicodeStringToAnsiSize (&WindowsDirectory
);
321 String
.MaximumLength
= uSize
;
322 String
.Buffer
= lpBuffer
;
324 /* convert unicode string to ansi (or oem) */
326 RtlUnicodeStringToAnsiString (&String
,
330 RtlUnicodeStringToOemString (&String
,
341 GetWindowsDirectoryW (
348 if (lpBuffer
== NULL
)
351 Length
= WindowsDirectory
.Length
/ sizeof (WCHAR
);
355 WindowsDirectory
.Buffer
,
356 WindowsDirectory
.Length
);
357 lpBuffer
[Length
] = 0;