From ff8d4f287fb443b3880bcebb2823505b37207600 Mon Sep 17 00:00:00 2001 From: ripsaw8080 Date: Tue, 12 Jun 2018 20:18:42 +0000 Subject: [PATCH] More improvements for IOCTL generic block device request Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4115 --- src/dos/dos.cpp | 8 +------- src/dos/dos_ioctl.cpp | 15 +++++++-------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp index 6338086c..2864fb02 100644 --- a/src/dos/dos.cpp +++ b/src/dos/dos.cpp @@ -1118,13 +1118,7 @@ static Bitu DOS_21Handler(void) { } reg_ch=0x08; // IOCTL category: disk drive reg_ax=0x440d; // Generic block device request - if (DOS_IOCTL()) { - reg_ax=0; // AX destroyed - CALLBACK_SCF(false); - } else { - reg_ax=dos.errorcode; - CALLBACK_SCF(true); - } + DOS_21Handler(); reg_cx=old_cx; break; } diff --git a/src/dos/dos_ioctl.cpp b/src/dos/dos_ioctl.cpp index 1357bd72..ad8ebe42 100644 --- a/src/dos/dos_ioctl.cpp +++ b/src/dos/dos_ioctl.cpp @@ -156,22 +156,20 @@ bool DOS_IOCTL(void) { DOS_SetError(DOSERR_ACCESS_DENIED); return false; } - if (Drives[drive]->isRemovable()) { + if (reg_ch != 0x08 || Drives[drive]->isRemovable()) { DOS_SetError(DOSERR_FUNCTION_NUMBER_INVALID); return false; } PhysPt ptr = SegPhys(ds)+reg_dx; switch (reg_cl) { case 0x60: /* Get Device parameters */ - mem_writeb(ptr ,0x03); // special function - mem_writeb(ptr+1,(drive>=2)?0x05:0x14); // fixed disc(5), 1.44 floppy(14) - mem_writew(ptr+2,drive>=2); // nonremovable ? + //mem_writeb(ptr+0,0); // special functions (call value) + mem_writeb(ptr+1,(drive>=2)?0x05:0x07); // type: hard disk(5), 1.44 floppy(7) + mem_writew(ptr+2,(drive>=2)?0x01:0x00); // attributes: bit 0 set for nonremovable mem_writew(ptr+4,0x0000); // num of cylinders mem_writeb(ptr+6,0x00); // media type (00=other type) - // drive parameter block following - mem_writeb(ptr+7,drive); // drive - mem_writeb(ptr+8,0x00); // unit number - mem_writed(ptr+0x1f,0xffffffff); // next parameter block + // bios parameter block following + mem_writew(ptr+7,0x0200); // bytes per sector (Win3 File Mgr. uses it) break; case 0x46: /* Set volume serial number */ break; @@ -205,6 +203,7 @@ bool DOS_IOCTL(void) { DOS_SetError(DOSERR_FUNCTION_NUMBER_INVALID); return false; } + reg_ax=0; return true; } case 0x0E: /* Get Logical Drive Map */