- Add few remaining members to the SYSVARS list.
- Implement retrieving the (DOS) boot drive (by using the host boot drive letter from %SYSTEMDRIVE%).
Should fix Win3.11 and MSD 2.0+ boot drive retrieval.

svn path=/trunk/; revision=68377
This commit is contained in:
Hermès Bélusca-Maïto 2015-07-07 23:51:57 +00:00
parent 9370c5b6ea
commit 49467814ac
2 changed files with 63 additions and 39 deletions

View file

@ -333,7 +333,7 @@ VOID WINAPI DosInt21h(LPWORD Stack)
break;
}
/* Write string to STDOUT */
/* Write String to STDOUT */
case 0x09:
{
String = (PCHAR)SEG_OFF_TO_PTR(getDS(), getDX());
@ -756,8 +756,17 @@ VOID WINAPI DosInt21h(LPWORD Stack)
/* Extended functionalities */
case 0x33:
{
if (getAL() == 0x06)
switch (getAL())
{
/*
* DOS 4+ - GET BOOT DRIVE
*/
case 0x05:
{
setDL(SysVars->BootDrive);
break;
}
/*
* DOS 5+ - GET TRUE VERSION NUMBER
* This function always returns the true version number, unlike
@ -765,24 +774,29 @@ VOID WINAPI DosInt21h(LPWORD Stack)
* See Ralf Brown: http://www.ctyme.com/intr/rb-2730.htm
* for more information.
*/
case 0x06:
{
/*
* Return the true DOS version: Minor:Major in BH:BL
* The Windows NT DOS box returns BX=3205h (version 5.50).
*/
setBX(NTDOS_VERSION);
/*
* 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);
/* DOS revision 0 */
setDL(0x00);
/* Unpatched DOS */
setDH(0x00);
/* Unpatched DOS */
setDH(0x00);
break;
}
default:
{
DPRINT1("INT 21h, AH = 33h, subfunction AL = %Xh NOT IMPLEMENTED\n",
getAL());
}
}
// else
// {
// /* Invalid subfunction */
// setAL(0xFF);
// }
break;
}
@ -841,7 +855,7 @@ VOID WINAPI DosInt21h(LPWORD Stack)
/* SWITCH character - AVAILDEV */
case 0x37:
{
if (getAL() == 0x00)
switch (getAL())
{
/*
* DOS 2+ - "SWITCHAR" - GET SWITCH CHARACTER
@ -850,44 +864,46 @@ VOID WINAPI DosInt21h(LPWORD Stack)
* See Ralf Brown: http://www.ctyme.com/intr/rb-2752.htm
* for more information.
*/
setDL('/');
setAL(0x00);
}
else if (getAL() == 0x01)
{
case 0x00:
setDL('/');
setAL(0x00);
break;
/*
* DOS 2+ - "SWITCHAR" - SET SWITCH CHARACTER
* This setting is ignored by MS-DOS 5+.
* See Ralf Brown: http://www.ctyme.com/intr/rb-2753.htm
* for more information.
*/
// getDL();
setAL(0xFF);
}
else if (getAL() == 0x02)
{
case 0x01:
// getDL();
setAL(0xFF);
break;
/*
* DOS 2.x and 3.3+ only - "AVAILDEV" - SPECIFY \DEV\ PREFIX USE
* See Ralf Brown: http://www.ctyme.com/intr/rb-2754.htm
* for more information.
*/
// setDL();
setAL(0xFF);
}
else if (getAL() == 0x03)
{
case 0x02:
// setDL();
setAL(0xFF);
break;
/*
* DOS 2.x and 3.3+ only - "AVAILDEV" - SPECIFY \DEV\ PREFIX USE
* See Ralf Brown: http://www.ctyme.com/intr/rb-2754.htm
* for more information.
*/
// getDL();
setAL(0xFF);
}
else
{
case 0x03:
// getDL();
setAL(0xFF);
break;
/* Invalid subfunction */
setAL(0xFF);
default:
setAL(0xFF);
break;
}
break;
@ -1379,7 +1395,7 @@ VOID WINAPI DosInt21h(LPWORD Stack)
break;
}
/* Terminate With Return Code */
/* Terminate with Return Code */
case 0x4C:
{
DosTerminateProcess(Sda->CurrentPsp, getAL(), 0);
@ -2090,6 +2106,10 @@ BOOLEAN DosKRNLInitialize(VOID)
/* The last drive can be redefined with the LASTDRIVE command. At the moment, set the real maximum possible, 'Z'. */
SysVars->NumLocalDrives = 'Z' - 'A' + 1;
/* The boot drive is initialized to the %SYSTEMDRIVE% value */
// NOTE: Using the NtSystemRoot system variable might be OS-specific...
SysVars->BootDrive = SharedUserData->NtSystemRoot[0] - 'A' + 1;
/* Initialize the NUL device driver */
SysVars->NullDevice.Link = 0xFFFFFFFF;
SysVars->NullDevice.DeviceAttributes = DOS_DEVATTR_NUL | DOS_DEVATTR_CHARACTER;

View file

@ -91,6 +91,10 @@ typedef struct _DOS_SYSVARS
BYTE NumLocalDrives; // Set by LASTDRIVE
DOS_DRIVER NullDevice;
BYTE NullDriverRoutine[7];
BYTE Reserved2[8];
BYTE BootDrive;
BYTE UseDwordMoves;
WORD ExtMemSize;
} DOS_SYSVARS, *PDOS_SYSVARS;
typedef struct _DOS_CLOCK_TRANSFER_RECORD