diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/bios.c b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/bios.c index a1ccb186afa..0a8d02db2a5 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/bios.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/bios.c @@ -43,6 +43,51 @@ PBIOS_DATA BiosData; /* PUBLIC FUNCTIONS ***********************************************************/ +VOID DosEchoCharacter(CHAR Character) +{ + switch (Character) + { + case '\0': + { + /* Nothing */ + break; + } + + case '\r': + case '\n': + { + /* Print both a carriage return and a newline */ + DosPrintCharacter(DOS_OUTPUT_HANDLE, '\r'); + DosPrintCharacter(DOS_OUTPUT_HANDLE, '\n'); + break; + } + + case '\b': + { + /* Erase the character */ + DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b'); + DosPrintCharacter(DOS_OUTPUT_HANDLE, ' '); + DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b'); + break; + } + + default: + { + /* Check if this is a special character */ + if (Character < 0x20) + { + DosPrintCharacter(DOS_OUTPUT_HANDLE, '^'); + Character += 'A' - 1; + } + else + { + /* Echo the character */ + DosPrintCharacter(DOS_OUTPUT_HANDLE, Character); + } + } + } +} + CHAR DosReadCharacter(WORD FileHandle) { WORD BytesRead; @@ -66,6 +111,13 @@ CHAR DosReadCharacter(WORD FileHandle) 1, &BytesRead); + /* Check if the file is actually the CON device */ + if (Descriptor && Descriptor->DeviceInfo & FILE_INFO_DEVICE) + { + /* Echo the character */ + DosEchoCharacter(Sda->ByteBuffer); + } + /* Restore the old mode and return the character */ if (Descriptor) Descriptor->DeviceInfo = OldDeviceInfo; return Sda->ByteBuffer; diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c index 18e5081c3ca..0414a060fd3 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c @@ -161,51 +161,6 @@ static BOOLEAN DosChangeDirectory(LPSTR Directory) /* PUBLIC FUNCTIONS ***********************************************************/ -VOID DosEchoCharacter(CHAR Character) -{ - switch (Character) - { - case '\0': - { - /* Nothing */ - break; - } - - case '\r': - case '\n': - { - /* Print both a carriage return and a newline */ - DosPrintCharacter(DOS_OUTPUT_HANDLE, '\r'); - DosPrintCharacter(DOS_OUTPUT_HANDLE, '\n'); - break; - } - - case '\b': - { - /* Erase the character */ - DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b'); - DosPrintCharacter(DOS_OUTPUT_HANDLE, ' '); - DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b'); - break; - } - - default: - { - /* Check if this is a special character */ - if (Character < 0x20) - { - DosPrintCharacter(DOS_OUTPUT_HANDLE, '^'); - Character += 'A' - 1; - } - else - { - /* Echo the character */ - DosPrintCharacter(DOS_OUTPUT_HANDLE, Character); - } - } - } -} - BOOLEAN DosControlBreak(VOID) { setCF(0); @@ -260,7 +215,6 @@ VOID WINAPI DosInt21h(LPWORD Stack) DPRINT("INT 21h, AH = 01h\n"); Character = DosReadCharacter(DOS_INPUT_HANDLE); - DosEchoCharacter(Character); if (Character == 0x03 && DosControlBreak()) break; setAL(Character); @@ -337,11 +291,8 @@ VOID WINAPI DosInt21h(LPWORD Stack) /* Input */ if (DosCheckInput()) { - CHAR Character = DosReadCharacter(DOS_INPUT_HANDLE); - DosEchoCharacter(Character); - Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_ZF; - setAL(Character); + setAL(DosReadCharacter(DOS_INPUT_HANDLE)); } else {