diff --git a/subsystems/ntvdm/bop.c b/subsystems/ntvdm/bop.c index 5904030de51..12950c20d9c 100644 --- a/subsystems/ntvdm/bop.c +++ b/subsystems/ntvdm/bop.c @@ -24,262 +24,262 @@ */ EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - ControlBop + NULL, // 0x00 + NULL, // 0x01 + NULL, // 0x02 + NULL, // 0x03 + NULL, // 0x04 + NULL, // 0x05 + NULL, // 0x06 + NULL, // 0x07 + NULL, // 0x08 + NULL, // 0x09 + NULL, // 0x0A + NULL, // 0x0B + NULL, // 0x0C + NULL, // 0x0D + NULL, // 0x0E + NULL, // 0x0F + NULL, // 0x10 + NULL, // 0x11 + NULL, // 0x12 + NULL, // 0x13 + NULL, // 0x14 + NULL, // 0x15 + NULL, // 0x16 + NULL, // 0x17 + NULL, // 0x18 + NULL, // 0x19 + NULL, // 0x1A + NULL, // 0x1B + NULL, // 0x1C + NULL, // 0x1D + NULL, // 0x1E + NULL, // 0x1F + NULL, // 0x20 + NULL, // 0x21 + NULL, // 0x22 + NULL, // 0x23 + NULL, // 0x24 + NULL, // 0x25 + NULL, // 0x26 + NULL, // 0x27 + NULL, // 0x28 + NULL, // 0x29 + NULL, // 0x2A + NULL, // 0x2B + NULL, // 0x2C + NULL, // 0x2D + NULL, // 0x2E + NULL, // 0x2F + NULL, // 0x30 + NULL, // 0x31 + NULL, // 0x32 + NULL, // 0x33 + NULL, // 0x34 + NULL, // 0x35 + NULL, // 0x36 + NULL, // 0x37 + NULL, // 0x38 + NULL, // 0x39 + NULL, // 0x3A + NULL, // 0x3B + NULL, // 0x3C + NULL, // 0x3D + NULL, // 0x3E + NULL, // 0x3F + NULL, // 0x40 + NULL, // 0x41 + NULL, // 0x42 + NULL, // 0x43 + NULL, // 0x44 + NULL, // 0x45 + NULL, // 0x46 + NULL, // 0x47 + NULL, // 0x48 + NULL, // 0x49 + NULL, // 0x4A + NULL, // 0x4B + NULL, // 0x4C + NULL, // 0x4D + NULL, // 0x4E + NULL, // 0x4F + NULL, // 0x50 + NULL, // 0x51 + NULL, // 0x52 + NULL, // 0x53 + NULL, // 0x54 + NULL, // 0x55 + NULL, // 0x56 + NULL, // 0x57 + NULL, // 0x58 + NULL, // 0x59 + NULL, // 0x5A + NULL, // 0x5B + NULL, // 0x5C + NULL, // 0x5D + NULL, // 0x5E + NULL, // 0x5F + NULL, // 0x60 + NULL, // 0x61 + NULL, // 0x62 + NULL, // 0x63 + NULL, // 0x64 + NULL, // 0x65 + NULL, // 0x66 + NULL, // 0x67 + NULL, // 0x68 + NULL, // 0x69 + NULL, // 0x6A + NULL, // 0x6B + NULL, // 0x6C + NULL, // 0x6D + NULL, // 0x6E + NULL, // 0x6F + NULL, // 0x70 + NULL, // 0x71 + NULL, // 0x72 + NULL, // 0x73 + NULL, // 0x74 + NULL, // 0x75 + NULL, // 0x76 + NULL, // 0x77 + NULL, // 0x78 + NULL, // 0x79 + NULL, // 0x7A + NULL, // 0x7B + NULL, // 0x7C + NULL, // 0x7D + NULL, // 0x7E + NULL, // 0x7F + NULL, // 0x80 + NULL, // 0x81 + NULL, // 0x82 + NULL, // 0x83 + NULL, // 0x84 + NULL, // 0x85 + NULL, // 0x86 + NULL, // 0x87 + NULL, // 0x88 + NULL, // 0x89 + NULL, // 0x8A + NULL, // 0x8B + NULL, // 0x8C + NULL, // 0x8D + NULL, // 0x8E + NULL, // 0x8F + NULL, // 0x90 + NULL, // 0x91 + NULL, // 0x92 + NULL, // 0x93 + NULL, // 0x94 + NULL, // 0x95 + NULL, // 0x96 + NULL, // 0x97 + NULL, // 0x98 + NULL, // 0x99 + NULL, // 0x9A + NULL, // 0x9B + NULL, // 0x9C + NULL, // 0x9D + NULL, // 0x9E + NULL, // 0x9F + NULL, // 0xA0 + NULL, // 0xA1 + NULL, // 0xA2 + NULL, // 0xA3 + NULL, // 0xA4 + NULL, // 0xA5 + NULL, // 0xA6 + NULL, // 0xA7 + NULL, // 0xA8 + NULL, // 0xA9 + NULL, // 0xAA + NULL, // 0xAB + NULL, // 0xAC + NULL, // 0xAD + NULL, // 0xAE + NULL, // 0xAF + NULL, // 0xB0 + NULL, // 0xB1 + NULL, // 0xB2 + NULL, // 0xB3 + NULL, // 0xB4 + NULL, // 0xB5 + NULL, // 0xB6 + NULL, // 0xB7 + NULL, // 0xB8 + NULL, // 0xB9 + NULL, // 0xBA + NULL, // 0xBB + NULL, // 0xBC + NULL, // 0xBD + NULL, // 0xBE + NULL, // 0xBF + NULL, // 0xC0 + NULL, // 0xC1 + NULL, // 0xC2 + NULL, // 0xC3 + NULL, // 0xC4 + NULL, // 0xC5 + NULL, // 0xC6 + NULL, // 0xC7 + NULL, // 0xC8 + NULL, // 0xC9 + NULL, // 0xCA + NULL, // 0xCB + NULL, // 0xCC + NULL, // 0xCD + NULL, // 0xCE + NULL, // 0xCF + NULL, // 0xD0 + NULL, // 0xD1 + NULL, // 0xD2 + NULL, // 0xD3 + NULL, // 0xD4 + NULL, // 0xD5 + NULL, // 0xD6 + NULL, // 0xD7 + NULL, // 0xD8 + NULL, // 0xD9 + NULL, // 0xDA + NULL, // 0xDB + NULL, // 0xDC + NULL, // 0xDD + NULL, // 0xDE + NULL, // 0xDF + NULL, // 0xE0 + NULL, // 0xE1 + NULL, // 0xE2 + NULL, // 0xE3 + NULL, // 0xE4 + NULL, // 0xE5 + NULL, // 0xE6 + NULL, // 0xE7 + NULL, // 0xE8 + NULL, // 0xE9 + NULL, // 0xEA + NULL, // 0xEB + NULL, // 0xEC + NULL, // 0xED + NULL, // 0xEE + NULL, // 0xEF + NULL, // 0xF0 + NULL, // 0xF1 + NULL, // 0xF2 + NULL, // 0xF3 + NULL, // 0xF4 + NULL, // 0xF5 + NULL, // 0xF6 + NULL, // 0xF7 + NULL, // 0xF8 + NULL, // 0xF9 + NULL, // 0xFA + NULL, // 0xFB + NULL, // 0xFC + NULL, // 0xFD + NULL, // 0xFE + ControlBop // 0xFF }; /* PUBLIC FUNCTIONS ***********************************************************/ diff --git a/subsystems/ntvdm/dos.c b/subsystems/ntvdm/dos.c index 537a5c8ad73..05747d44c78 100644 --- a/subsystems/ntvdm/dos.c +++ b/subsystems/ntvdm/dos.c @@ -1780,6 +1780,7 @@ VOID WINAPI DosInt21h(LPWORD Stack) PDOS_PSP PspBlock = SEGMENT_TO_PSP(CurrentPsp); /* + * DOS 2+ - GET DOS VERSION * See Ralf Brown: http://www.ctyme.com/intr/rb-2711.htm * for more information. */ @@ -1808,12 +1809,49 @@ VOID WINAPI DosInt21h(LPWORD Stack) setBL(0x00); setCX(0x0000); - /* Return DOS version: Minor:Major in AH:AL */ + /* + * Return DOS version: Minor:Major in AH:AL + * The Windows NT DOS box returns version 5.00, subject to SETVER. + */ setAX(PspBlock->DosVersion); break; } + /* Extended functionalities */ + case 0x33: + { + if (getAL() == 0x06) + { + /* + * DOS 5+ - GET TRUE VERSION NUMBER + * This function always returns the true version number, unlike + * AH=30h, whose return value may be changed with SETVER. + * See Ralf Brown: http://www.ctyme.com/intr/rb-2730.htm + * for more information. + */ + + /* + * Return the true DOS version: Minor:Major in BH:BL + * The Windows NT DOS box returns BX=3205h (version 5.50). + */ + setBX(NTDOS_VERSION); + + /* DOS revision 0 */ + setDL(0x00); + + /* Unpatched DOS */ + setDH(0x00); + } + // else + // { + // /* Invalid subfunction */ + // setAL(0xFF); + // } + + break; + } + /* Get Interrupt Vector */ case 0x35: { @@ -1873,10 +1911,11 @@ VOID WINAPI DosInt21h(LPWORD Stack) } else { + /* Invalid subfunction */ setAL(0xFF); } - break; + break; } /* Create Directory */ diff --git a/subsystems/ntvdm/dos.h b/subsystems/ntvdm/dos.h index 0ec0d83275b..dcf9e124fe1 100644 --- a/subsystems/ntvdm/dos.h +++ b/subsystems/ntvdm/dos.h @@ -16,9 +16,11 @@ /* DEFINES ********************************************************************/ // -// We are DOS 6.00 +// We are DOS 5.00 (reported by INT 21h, AH=30h) +// and DOS 5.50 (reported by INT 21h, AX=3306h) for Windows NT Compatibility // -#define DOS_VERSION MAKEWORD(6, 0) +#define DOS_VERSION MAKEWORD(5, 00) +#define NTDOS_VERSION MAKEWORD(5, 50) #define DOS_CONFIG_PATH L"%SystemRoot%\\system32\\CONFIG.NT" #define DOS_COMMAND_INTERPRETER L"%SystemRoot%\\system32\\COMMAND.COM /k %SystemRoot%\\system32\\AUTOEXEC.NT"