diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 4c80289829..f38cd9795b 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -1108,12 +1108,23 @@ void WCMD_setshow_default (char *command) { /* 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 1a093fac54..de6aa6d9cf 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -460,6 +460,17 @@ void WCMD_process_command (char *command) */ 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 );