Moving support for current dir on several drives from cmd.exe to NTDLL.

svn path=/trunk/; revision=1891
This commit is contained in:
Carl Nettelblad 2001-05-06 16:09:03 +00:00
parent ba2a8ca045
commit 8efef1784a

View file

@ -1,4 +1,4 @@
/* $Id: path.c,v 1.9 2001/04/29 21:09:20 cnettel Exp $ /* $Id: path.c,v 1.10 2001/05/06 16:09:03 cnettel Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -276,6 +276,7 @@ RtlGetCurrentDirectory_U (
NTSTATUS STDCALL RtlSetCurrentDirectory_U (PUNICODE_STRING name) NTSTATUS STDCALL RtlSetCurrentDirectory_U (PUNICODE_STRING name)
{ {
UNICODE_STRING full; UNICODE_STRING full;
UNICODE_STRING envvar;
OBJECT_ATTRIBUTES Attr; OBJECT_ATTRIBUTES Attr;
IO_STATUS_BLOCK iosb; IO_STATUS_BLOCK iosb;
PCURDIR cd; PCURDIR cd;
@ -287,6 +288,7 @@ NTSTATUS STDCALL RtlSetCurrentDirectory_U (PUNICODE_STRING name)
PFILE_NAME_INFORMATION filenameinfo; PFILE_NAME_INFORMATION filenameinfo;
ULONG backslashcount = 0; ULONG backslashcount = 0;
PWSTR cntr; PWSTR cntr;
WCHAR var[4];
DPRINT ("RtlSetCurrentDirectory %wZ\n", name); DPRINT ("RtlSetCurrentDirectory %wZ\n", name);
@ -371,7 +373,6 @@ NTSTATUS STDCALL RtlSetCurrentDirectory_U (PUNICODE_STRING name)
} }
DPRINT("%d \n",backslashcount); DPRINT("%d \n",backslashcount);
for (;backslashcount;wcs--) for (;backslashcount;wcs--)
{ {
@ -409,6 +410,15 @@ NTSTATUS STDCALL RtlSetCurrentDirectory_U (PUNICODE_STRING name)
NtClose (cd->Handle); NtClose (cd->Handle);
cd->Handle = handle; cd->Handle = handle;
if (cd->DosPath.Buffer[1]==':')
{
envvar.Length = 2 * swprintf (var, L"=%c:", cd->DosPath.Buffer[0]);
envvar.MaximumLength = 8;
envvar.Buffer = var;
RtlSetEnvironmentVariable(NULL,&envvar,&cd->DosPath);
}
RtlFreeHeap (RtlGetProcessHeap (), RtlFreeHeap (RtlGetProcessHeap (),
0, 0,
buf); buf);
@ -434,6 +444,7 @@ RtlGetFullPathName_U (
{ {
WCHAR *wcs, var[4], drive; WCHAR *wcs, var[4], drive;
int len; int len;
int reallen;
DWORD offs, sz, type; DWORD offs, sz, type;
UNICODE_STRING usvar, pfx; UNICODE_STRING usvar, pfx;
PCURDIR cd; PCURDIR cd;
@ -453,6 +464,7 @@ RtlGetFullPathName_U (
if (!len) if (!len)
return 0; return 0;
reallen=len;
/* strip trailing path separator (but don't change '\') */ /* strip trailing path separator (but don't change '\') */
if ((len > 1) && if ((len > 1) &&
IS_PATH_SEPARATOR(DosName[len - 1])) IS_PATH_SEPARATOR(DosName[len - 1]))
@ -469,7 +481,7 @@ CHECKPOINT;
offs = sz >> 17; offs = sz >> 17;
sz &= 0x0000FFFF; sz &= 0x0000FFFF;
if (sz + 8 >= size) if (sz + 8 >= size)
return sz + 10; return sz + 10;
wcscpy (buf, L"\\\\.\\"); wcscpy (buf, L"\\\\.\\");
wcsncat (buf, DosName + offs, sz / sizeof(WCHAR)); wcsncat (buf, DosName + offs, sz / sizeof(WCHAR));
return sz + 8; return sz + 8;
@ -522,16 +534,6 @@ CHECKPOINT;
return pfx.Length + len * 2 + 2; return pfx.Length + len * 2 + 2;
swprintf (buf, L"%c:\\", drive); swprintf (buf, L"%c:\\", drive);
} }
else
{
CHECKPOINT;
if (pfx.Length > 6)
{
CHECKPOINT;
buf[pfx.Length / 2] = L'\\';
pfx.Length += 2;
}
}
} }
break; break;