Hi!
Bugfixes:
- INT21/42: DE_INVLDHNDL is already negative, so it should be assigned to
`rc' as is, without negation.
- INT21/5E02-...: removed AX clearing on exit - RBIL doesn't says that AX
cleared for any function AL=2,3,...
- INT21/5F07,5F08: reversed condition - now error DE_INVLDDRV returned
when DL >= (not <) lastdrive (and, thus, outside CDS).
- INT21/65: debug printf() includes extra argument.
- INT21/69: now returned error DE_INVLDDRV when get_cds() returns NULL
(was forgotten "goto error_exit;").
--- Begin Message ---
diff -ruNp old/kernel/inthndlr.c new/kernel/inthndlr.c
--- old/kernel/inthndlr.c 2004-05-11 03:33:34.000000000 +0000
+++ new/kernel/inthndlr.c 2004-05-13 05:42:04.000000000 +0000
@@ -907,17 +907,13 @@ dispatch:
case 0x42:
if (lr.AL > 2)
goto error_invalid;
- lrc = DosSeek(lr.BX, (LONG)((((ULONG) (lr.CX)) << 16) | lr.DX), lr.AL);
+ lrc = DosSeek(lr.BX, ((ULONG)lr.CX << 16) | lr.DX, lr.AL);
+ rc = DE_INVLDHNDL;
if (lrc == -1)
- {
- lrc = -DE_INVLDHNDL;
- }
- else
- {
- lr.DX = (UWORD)(lrc >> 16);
- lrc = (UWORD) lrc;
- }
- goto long_check;
+ goto error_exit;
+ lr.DX = (UWORD)(lrc >> 16);
+ lr.AX = (UWORD) lrc;
+ break;
/* Get/Set File Attributes */
case 0x43:
@@ -1260,7 +1256,6 @@ dispatch:
rc = (int)network_redirector_mx(REM_PRINTSET, &lr, (void *)Int21AX);
if (rc != SUCCESS)
goto error_exit;
- lr.AX = SUCCESS;
break;
}
break;
@@ -1269,25 +1264,18 @@ dispatch:
if (lr.AL == 7 || lr.AL == 8)
{
struct cds FAR *cdsp;
- if (lr.DL < lastdrive)
+ if (lr.DL >= lastdrive)
{
rc = DE_INVLDDRV;
goto error_exit;
}
- else
- {
- cdsp = &CDSp[lr.DL];
+ cdsp = CDSp + lr.DL;
if (lr.AL == 7)
- {
cdsp->cdsFlags |= 0x100;
- }
else
- {
cdsp->cdsFlags &= ~0x100;
- }
- }
+ break;
}
- else
{
rc = (int)network_redirector_mx(REM_DOREDIRECT, &lr, (void *)Int21AX);
/* the remote function manipulates *r directly !,
@@ -1300,7 +1288,6 @@ dispatch:
r->AX = -rc;
goto real_exit;
}
- break;
case 0x60: /* TRUENAME */
rc = DosTruename(MK_FP(lr.DS, lr.SI), adjust_far(FP_ES_DI));
@@ -1377,16 +1364,16 @@ dispatch:
lr.AX = DosYesNo(lr.DL);
break;
default:
+ rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI);
#ifdef NLS_DEBUG
- if ((rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI)) < 0)
+ if (rc < SUCCESS)
{
printf("DosGetData() := %d\n", rc);
goto error_exit;
}
- printf("DosGetData() returned successfully\n", rc);
+ printf("DosGetData() returned successfully\n");
break;
#else
- rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI);
goto short_check;
#endif
}
@@ -1423,26 +1410,25 @@ dispatch:
/* Get/Set Serial Number */
case 0x69:
+ {
+ UWORD saveCX;
+ if (lr.AL > 1)
+ goto error_invalid;
rc = (lr.BL == 0 ? default_drive : lr.BL - 1);
- if (lr.AL == 0 || lr.AL == 1)
- {
- UWORD saveCX = lr.CX;
if (get_cds(rc) == NULL)
+ {
rc = DE_INVLDDRV;
- else if (get_dpb(rc) == NULL)
+ goto error_exit;
+ }
+ if (get_dpb(rc) == NULL)
goto error_invalid;
- else
- {
+ saveCX = lr.CX;
lr.CX = lr.AL == 0 ? 0x0866 : 0x0846;
lr.AL = 0x0d;
rc = DosDevIOctl(&lr);
lr.CX = saveCX;
goto short_check;
- }
- }
- else
- goto error_invalid;
- break;
+ }
/*
case 0x6a: see case 0x68
case 0x6b: dummy func: return AL=0
--- End Message ---