Error Table Handling Revisited
ccrayne at crayne.org
ccrayne at crayne.org
Sun Jan 13 19:38:21 CST 2002
My previous patch has been modified to use DPMI_AllocInternalRMCB, as
requested by Ove.
-- Chuck Crayne
-----------------------------------------------------------
ccrayne at crayne.org
-----------------------------------------------------------
Change Log:
Makefile.in, include/miscemu.h, msdos/dosmem.c, msdos/int2f.c
ccrayne at crayne.org
1. Fix Error Table handling to eliminate "No real-mode handler for errors
yet" fixme, and associated SIGILL abort. 2. Fix INT_BARF message on int 2f
function 5 by adding stub to return extended error handler not installed.
--- Makefile.in.20011226 Sat Jan 12 18:51:55 2002
+++ Makefile.in Sat Jan 12 18:52:39 2002
@@ -19,7 +19,7 @@
LIBEXT = @LIBEXT@
LDCONFIG = @LDCONFIG@
MODULE = wine
-IMPORTS = ntdll
+IMPORTS = ntdll winedos
# Stand-alone programs
PROGRAMS = \
--- include/miscemu.h.20011226 Wed Jan 2 18:05:36 2002
+++ include/miscemu.h Wed Jan 2 21:40:13 2002
@@ -152,6 +152,10 @@
extern LPVOID DOSMEM_MapDosToLinear(UINT); /* linear DOS to Wine */
extern UINT DOSMEM_MapLinearToDos(LPVOID); /* linear Wine to DOS */
+/* DOS Error Table addresses */
+extern DWORD DOSMEM_ErrorCall;
+extern DWORD DOSMEM_ErrorBuffer;
+
/* memory/instr.c */
extern BOOL INSTR_EmulateInstruction( CONTEXT86 *context );
--- msdos/dosmem.c.20011226 Wed Jan 2 17:27:40 2002
+++ msdos/dosmem.c Sat Jan 5 19:21:47 2002
@@ -32,6 +32,8 @@
WORD DOSMEM_BiosSysSeg; /* BIOS ROM segment at 0xf000:0 */
DWORD DOSMEM_CollateTable;
+DWORD DOSMEM_ErrorCall;
+DWORD DOSMEM_ErrorBuffer;
/* use 2 low bits of 'size' for the housekeeping */
@@ -355,56 +357,27 @@
/***********************************************************************
* DOSMEM_InitErrorTable
*
- * Initialises the error tables (DOS 5+)
+ * Allocates real mode memory to support Int2f AX = 0x122e DL = 08 code.
+ * Allocation must be made at initialization time because DPMI support +
* does not currently reserve any real memory for later use. + *
*/
static void DOSMEM_InitErrorTable()
{
-#if 0 /* no longer used */
DWORD x;
char *call;
-
- /* We will use a snippet of real mode code that calls */ -
/* a WINE-only interrupt to handle moving the requested */ - /*
message into the buffer... */
-
- /* FIXME - There is still something wrong... */
-
- /* FIXME - Find hex values for opcodes...
-
- (On call, AX contains message number
- DI contains 'offset' (??)
- Resturn, ES:DI points to counted string )
-
- PUSH BX
- MOV BX, AX
- MOV AX, (arbitrary subfunction number)
- INT (WINE-only interrupt)
- POP BX
- RET
-
- */
-
- const int code = 4;
- const int buffer = 80;
- const int SIZE_TO_ALLOCATE = code + buffer;
-
- /* FIXME - Complete rewrite of the table system to save */ -
/* precious DOS space. Now, we return the 0001:???? as */ - /* DOS
4+ (??, it seems to be the case in MS 7.10) treats that */ - /* as
a special case and programs will use the alternate */ - /*
interface (a farcall returned with INT 24 (AX = 0x122e, DL = */ -
/* 0x08) which lets us have a smaller memory footprint anyway. */ +
const int buffersz = 80; /* Just a guess */
+ extern void INT_Int2f122eCallback();
+ /* Allocate and clear real mode message buffer */
+ x = GlobalDOSAlloc16(buffersz);
+ DOSMEM_ErrorBuffer = MAKELONG(0,(x>>16));
+ call = DOSMEM_MapRealToLinear(DOSMEM_ErrorBuffer);
+ memset(call, 0, buffersz);
+
+ /* Allocate real mode far call address for message routine */ +
DOSMEM_ErrorCall = (DWORD) DPMI_AllocInternalRMCB(INT_Int2f122eCallback);
+ TRACE("allocated real mode proc %x\n", DOSMEM_ErrorCall);
- x = GlobalDOSAlloc16(SIZE_TO_ALLOCATE);
-
- DOSMEM_ErrorCall = MAKELONG(0,(x>>16));
- DOSMEM_ErrorBuffer = DOSMEM_ErrorCall + code;
-
- call = DOSMEM_MapRealToLinear(DOSMEM_ErrorCall);
-
- memset(call, 0, SIZE_TO_ALLOCATE);
-#endif
- /* Fixme - Copy assembly into buffer here */
}
/***********************************************************************
--- msdos/int2f.c.20011226 Wed Jan 2 18:04:33 2002
+++ msdos/int2f.c Sat Jan 12 20:46:09 2002
@@ -8,7 +8,7 @@
*/
#include "config.h"
-
+#include <stdio.h>
#include <string.h>
#include "wine/winbase16.h"
#include "miscemu.h"
@@ -24,6 +24,7 @@
static void do_int2f_16( CONTEXT86 *context );
static void MSCDEX_Handler( CONTEXT86 *context );
+void INT_Int2f122eCallback(CONTEXT86 *context);
/**********************************************************************
* INT_Int2fHandler (WPROCS.147)
@@ -36,6 +37,11 @@
switch(AH_reg(context))
{
+ case 0x05:
+ AL_reg(context) = 0x01; /* not installed */
+ RESET_CFLAG(context);
+ break;
+
case 0x10:
AL_reg(context) = 0xff; /* share is installed */
break;
@@ -77,10 +83,12 @@
case 0x04:
case 0x06:
context->SegEs = 0x0001;
- DI_reg(context) = 0x0000;
+ DI_reg(context) = DL_reg(context)>>1;
break;
+ /* Return address of error message retriever */
case 0x08:
- FIXME("No real-mode handler for errors yet! (bye!)\n"); +
context->SegEs = DOSMEM_ErrorCall >> 16;
+ DI_reg(context) = DOSMEM_ErrorCall & 0xffff;
break;
default:
INT_BARF(context, 0x2f);
@@ -808,4 +816,26 @@
FIXME("Unimplemented MSCDEX function 0x%02X.\n", LOBYTE(context->Eax));
break;
}
+}
+/********************************************************************** +
* INT_Int2f122eCallback
+ *
+ * Callback routine for int 2fh function 122eh subfunction 8. + */
+
+void INT_Int2f122eCallback(CONTEXT86 *context)
+{
+ char *buff;
+ WORD *stack = CTX_SEG_OFF_TO_LIN(context, context->SegSs,
context->Esp); +
+ /* Return address of error message counted string */
+ buff = DOSMEM_MapRealToLinear(DOSMEM_ErrorBuffer);
+ sprintf(buff,"\x18""Error %3d from table
%1d\n",AX_reg(context),DI_reg(context)); + context->SegEs =
DOSMEM_ErrorBuffer >> 16;
+ DI_reg(context) = DOSMEM_ErrorBuffer & 0xffff;
+
+ /* simulate a normal RETF sequence as required by DPMI CallRMProcFar
*/ + context->Eip = *(stack++);
+ context->SegCs = *(stack++);
+ context->Esp += 2*sizeof(WORD);
}
More information about the wine-patches
mailing list