Implemented int 0x21 long file name function 0x71a0: Get Volume Info.
diff --git a/msdos/int21.c b/msdos/int21.c
index 8f1a94f..cbb692f 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -1564,7 +1564,7 @@
break;
case 0x41: /* "UNLINK" - DELETE FILE */
- TRACE("UNLINK%s\n",
+ TRACE("UNLINK %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context)));
bSetDOSExtendedError = (!DeleteFileA( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
EDX_reg(context) )));
@@ -1610,7 +1610,7 @@
CX_reg(context) ));
break;
case 0x02:
- TRACE("GET COMPRESSED FILE SIZE for %s stub\n",
+ FIXME("GET COMPRESSED FILE SIZE for %s stub\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context)));
}
break;
@@ -2217,15 +2217,48 @@
EDI_reg(context))))
bSetDOSExtendedError = TRUE;
break;
+ case 0xa0:
+ {
+ LPCSTR driveroot = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context));
+ LPSTR buffer = (LPSTR)CTX_SEG_OFF_TO_LIN(context, ES_reg(context),EDI_reg(context));
+ int drive;
+ UINT flags;
+
+ TRACE("LONG FILENAME - GET VOLUME INFORMATION for drive having root dir '%s'.\n", driveroot);
+ AX_reg(context) = 0;
+ if (!driveroot)
+ {
+ INT_BARF( context, 0x21 );
+ SET_CFLAG(context);
+ break;
+ }
+ drive = toupper(driveroot[0]) - 'A';
+ flags = DRIVE_GetFlags(toupper(driveroot[0]) - 'A');
+ BX_reg(context) = 0x4000; /* support for LFN functions */
+ if (flags & DRIVE_CASE_SENSITIVE)
+ BX_reg(context) |= 1;
+ if (flags & DRIVE_CASE_PRESERVING)
+ BX_reg(context) |= 2;
+ /***** FIXME: not supported yet (needed ?)
+ if (flags & DRIVE_UNICODE)
+ BX_reg(context) |= 4;
+ if (flags & DRIVE_COMPRESSED)
+ BX_reg(context) |= 0x8000;
+ *****/
+ CX_reg(context) = (flags & DRIVE_SHORT_NAMES) ? 11 : 255; /* FIXME: 12 ? */
+ DX_reg(context) = MAX_PATH; /* FIXME: which len if DRIVE_SHORT_NAMES ? */
+ if (DRIVE_GetType(drive) == TYPE_CDROM)
+ /* valid for data _and_ audio */
+ strcpy(buffer, "CDFS"); /* FIXME: fail if no CD in drive */
+ else
+ strcpy(buffer, "FAT");
+ }
+ break;
case 0xa1: /* Find close */
TRACE("LONG FILENAME - FINDCLOSE for handle %d\n",
BX_reg(context));
bSetDOSExtendedError = (!FindClose16( BX_reg(context) ));
break;
- case 0xa0:
- TRACE("LONG FILENAME - GET VOLUME INFORMATION for drive %s stub\n",
- (LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context)));
- break;
case 0x60:
switch(CL_reg(context))
{
@@ -2286,7 +2319,7 @@
}
break;
case 0x56: /* Move (rename) file */
- TRACE("LONG FILENAME - RENAME FILE %s to %s stub\n",
+ FIXME("LONG FILENAME - RENAME FILE %s to %s stub\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context)),
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, ES_reg(context), EDI_reg(context)));
default: