cmd.exe: Add support for working directories per drive.
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 4c80289..f38cd97 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -1108,12 +1108,23 @@
/* Change to that directory */
WINE_TRACE("Really changing to directory '%s'\n", string);
+
status = SetCurrentDirectory (string);
if (!status) {
errorlevel = 1;
WCMD_print_error ();
return;
}
+
+ /* Set special =C: type environment variable */
+ if ((string[1] == ':') && IsCharAlpha (string[0])) {
+ char env[4];
+ strcpy(env, "=");
+ strncpy(env+1, string, 2);
+ env[3] = 0x00;
+ SetEnvironmentVariable(env, string);
+ }
+
}
return;
}
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 1a093fa..de6aa6d 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -460,6 +460,17 @@
*/
if ((cmd[1] == ':') && IsCharAlpha (cmd[0]) && (strlen(cmd) == 2)) {
+ char envvar[5];
+ char dir[MAX_PATH];
+
+ /* According to MSDN CreateProcess docs, special env vars record
+ the current directory on each drive, in the form =C:
+ so see if one specified, and if so go back to it */
+ strcpy(envvar, "=");
+ strcat(envvar, cmd);
+ if (GetEnvironmentVariable(envvar, dir, MAX_PATH) == 0) {
+ sprintf(cmd, "%s\\", cmd);
+ }
status = SetCurrentDirectory (cmd);
if (!status) WCMD_print_error ();
HeapFree( GetProcessHeap(), 0, cmd );