forked from Mirrors/wine-wine
Moved winedos loading functionality to dlls/kernel/instr.c and get rid
of msdos/dpmi.c.oldstable
parent
3f1498fc6c
commit
4044372596
|
@ -25,7 +25,6 @@ C_SRCS = \
|
||||||
$(TOPOBJDIR)/files/smb.c \
|
$(TOPOBJDIR)/files/smb.c \
|
||||||
$(TOPOBJDIR)/misc/options.c \
|
$(TOPOBJDIR)/misc/options.c \
|
||||||
$(TOPOBJDIR)/misc/registry.c \
|
$(TOPOBJDIR)/misc/registry.c \
|
||||||
$(TOPOBJDIR)/msdos/dpmi.c \
|
|
||||||
atom.c \
|
atom.c \
|
||||||
change.c \
|
change.c \
|
||||||
comm.c \
|
comm.c \
|
||||||
|
@ -99,7 +98,6 @@ SUBDIRS = tests
|
||||||
EXTRASUBDIRS = \
|
EXTRASUBDIRS = \
|
||||||
$(TOPOBJDIR)/files \
|
$(TOPOBJDIR)/files \
|
||||||
$(TOPOBJDIR)/misc \
|
$(TOPOBJDIR)/misc \
|
||||||
$(TOPOBJDIR)/msdos \
|
|
||||||
messages \
|
messages \
|
||||||
nls
|
nls
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
#include "winioctl.h"
|
#include "winioctl.h"
|
||||||
#include "winnt.h"
|
#include "winnt.h"
|
||||||
#include "msdos.h"
|
#include "msdos.h"
|
||||||
#include "miscemu.h"
|
|
||||||
#include "kernel_private.h"
|
#include "kernel_private.h"
|
||||||
#include "wine/server.h"
|
#include "wine/server.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
@ -509,15 +508,9 @@ static BOOL DeviceIo_IFSMgr(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbI
|
||||||
win32apieq_2_CONTEXT(pIn,&cxt);
|
win32apieq_2_CONTEXT(pIn,&cxt);
|
||||||
|
|
||||||
if(dwIoControlCode==IFS_IOCTL_21)
|
if(dwIoControlCode==IFS_IOCTL_21)
|
||||||
{
|
INSTR_CallBuiltinHandler( &cxt, 0x21 );
|
||||||
if(Dosvm.CallBuiltinHandler || DPMI_LoadDosSystem())
|
else
|
||||||
Dosvm.CallBuiltinHandler( &cxt, 0x21 );
|
INSTR_CallBuiltinHandler( &cxt, 0x2f );
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(Dosvm.CallBuiltinHandler || DPMI_LoadDosSystem())
|
|
||||||
Dosvm.CallBuiltinHandler( &cxt, 0x2f );
|
|
||||||
}
|
|
||||||
|
|
||||||
CONTEXT_2_win32apieq(&cxt,pOut);
|
CONTEXT_2_win32apieq(&cxt,pOut);
|
||||||
|
|
||||||
|
@ -676,9 +669,7 @@ static BOOL DeviceIo_VWin32(DWORD dwIoControlCode,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Dosvm.CallBuiltinHandler || DPMI_LoadDosSystem())
|
INSTR_CallBuiltinHandler( &cxt, intnum );
|
||||||
Dosvm.CallBuiltinHandler( &cxt, intnum );
|
|
||||||
|
|
||||||
CONTEXT_2_DIOCRegs( &cxt, pOut );
|
CONTEXT_2_DIOCRegs( &cxt, pOut );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -37,8 +37,6 @@
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(int);
|
WINE_DEFAULT_DEBUG_CHANNEL(int);
|
||||||
WINE_DECLARE_DEBUG_CHANNEL(io);
|
WINE_DECLARE_DEBUG_CHANNEL(io);
|
||||||
|
|
||||||
#ifdef __i386__
|
|
||||||
|
|
||||||
/* macros to set parts of a DWORD */
|
/* macros to set parts of a DWORD */
|
||||||
#define SET_LOWORD(dw,val) ((dw) = ((dw) & 0xffff0000) | LOWORD(val))
|
#define SET_LOWORD(dw,val) ((dw) = ((dw) & 0xffff0000) | LOWORD(val))
|
||||||
#define SET_LOBYTE(dw,val) ((dw) = ((dw) & 0xffffff00) | LOBYTE(val))
|
#define SET_LOBYTE(dw,val) ((dw) = ((dw) & 0xffffff00) | LOBYTE(val))
|
||||||
|
@ -67,6 +65,33 @@ inline static void *get_stack( CONTEXT86 *context )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void (WINAPI *DOS_EmulateInterruptPM)( CONTEXT86 *context, BYTE intnum );
|
||||||
|
static void (WINAPI *DOS_CallBuiltinHandler)( CONTEXT86 *context, BYTE intnum );
|
||||||
|
static DWORD (WINAPI *DOS_inport)( int port, int size );
|
||||||
|
static void (WINAPI *DOS_outport)( int port, int size, DWORD val );
|
||||||
|
|
||||||
|
|
||||||
|
static void init_winedos(void)
|
||||||
|
{
|
||||||
|
static HMODULE module;
|
||||||
|
|
||||||
|
if (module) return;
|
||||||
|
module = LoadLibraryA( "winedos.dll" );
|
||||||
|
if (!module)
|
||||||
|
{
|
||||||
|
ERR("could not load winedos.dll, DOS subsystem unavailable\n");
|
||||||
|
module = (HMODULE)1; /* don't try again */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#define GET_ADDR(func) DOS_##func = (void *)GetProcAddress(module, #func);
|
||||||
|
GET_ADDR(inport);
|
||||||
|
GET_ADDR(outport);
|
||||||
|
GET_ADDR(EmulateInterruptPM);
|
||||||
|
GET_ADDR(CallBuiltinHandler);
|
||||||
|
#undef GET_ADDR
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* INSTR_ReplaceSelector
|
* INSTR_ReplaceSelector
|
||||||
*
|
*
|
||||||
|
@ -339,7 +364,8 @@ static DWORD INSTR_inport( WORD port, int size, CONTEXT86 *context )
|
||||||
{
|
{
|
||||||
DWORD res = ~0U;
|
DWORD res = ~0U;
|
||||||
|
|
||||||
if (Dosvm.inport || DPMI_LoadDosSystem()) res = Dosvm.inport( port, size );
|
if (!DOS_inport) init_winedos();
|
||||||
|
if (DOS_inport) res = DOS_inport( port, size );
|
||||||
|
|
||||||
if (TRACE_ON(io))
|
if (TRACE_ON(io))
|
||||||
{
|
{
|
||||||
|
@ -370,7 +396,8 @@ static DWORD INSTR_inport( WORD port, int size, CONTEXT86 *context )
|
||||||
*/
|
*/
|
||||||
static void INSTR_outport( WORD port, int size, DWORD val, CONTEXT86 *context )
|
static void INSTR_outport( WORD port, int size, DWORD val, CONTEXT86 *context )
|
||||||
{
|
{
|
||||||
if (Dosvm.outport || DPMI_LoadDosSystem()) Dosvm.outport( port, size, val );
|
if (!DOS_outport) init_winedos();
|
||||||
|
if (DOS_outport) DOS_outport( port, size, val );
|
||||||
|
|
||||||
if (TRACE_ON(io))
|
if (TRACE_ON(io))
|
||||||
{
|
{
|
||||||
|
@ -689,14 +716,11 @@ DWORD INSTR_EmulateInstruction( EXCEPTION_RECORD *rec, CONTEXT86 *context )
|
||||||
|
|
||||||
case 0xcd: /* int <XX> */
|
case 0xcd: /* int <XX> */
|
||||||
if (IS_SELECTOR_SYSTEM(context->SegCs)) break; /* don't emulate it in 32-bit code */
|
if (IS_SELECTOR_SYSTEM(context->SegCs)) break; /* don't emulate it in 32-bit code */
|
||||||
if (!Dosvm.EmulateInterruptPM && !DPMI_LoadDosSystem())
|
if (!DOS_EmulateInterruptPM) init_winedos();
|
||||||
{
|
if (DOS_EmulateInterruptPM)
|
||||||
ERR("could not initialize interrupt handling\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
context->Eip += prefixlen + 2;
|
context->Eip += prefixlen + 2;
|
||||||
Dosvm.EmulateInterruptPM( context, instr[1] );
|
DOS_EmulateInterruptPM( context, instr[1] );
|
||||||
return ExceptionContinueExecution;
|
return ExceptionContinueExecution;
|
||||||
}
|
}
|
||||||
break; /* Unable to emulate it */
|
break; /* Unable to emulate it */
|
||||||
|
@ -786,4 +810,40 @@ DWORD INSTR_EmulateInstruction( EXCEPTION_RECORD *rec, CONTEXT86 *context )
|
||||||
return ExceptionContinueSearch; /* Unable to emulate it */
|
return ExceptionContinueSearch; /* Unable to emulate it */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __i386__ */
|
|
||||||
|
/***********************************************************************
|
||||||
|
* INSTR_CallBuiltinHandler
|
||||||
|
*/
|
||||||
|
void INSTR_CallBuiltinHandler( CONTEXT86 *context, BYTE intnum )
|
||||||
|
{
|
||||||
|
if (!DOS_CallBuiltinHandler) init_winedos();
|
||||||
|
if (DOS_CallBuiltinHandler) DOS_CallBuiltinHandler( context, intnum );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DOS3Call (KERNEL.102)
|
||||||
|
*/
|
||||||
|
void WINAPI DOS3Call( CONTEXT86 *context )
|
||||||
|
{
|
||||||
|
INSTR_CallBuiltinHandler( context, 0x21 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* NetBIOSCall (KERNEL.103)
|
||||||
|
*/
|
||||||
|
void WINAPI NetBIOSCall16( CONTEXT86 *context )
|
||||||
|
{
|
||||||
|
INSTR_CallBuiltinHandler( context, 0x5c );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetSetKernelDOSProc (KERNEL.311)
|
||||||
|
*/
|
||||||
|
FARPROC16 WINAPI GetSetKernelDOSProc16( FARPROC16 DosProc )
|
||||||
|
{
|
||||||
|
FIXME("(DosProc=0x%08x): stub\n", (UINT)DosProc);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -53,17 +53,8 @@ extern BOOL WOWTHUNK_Init(void);
|
||||||
|
|
||||||
extern VOID SYSLEVEL_CheckNotLevel( INT level );
|
extern VOID SYSLEVEL_CheckNotLevel( INT level );
|
||||||
|
|
||||||
typedef struct
|
extern DWORD INSTR_EmulateInstruction( EXCEPTION_RECORD *rec, CONTEXT86 *context );
|
||||||
{
|
extern void INSTR_CallBuiltinHandler( CONTEXT86 *context, BYTE intnum );
|
||||||
void (WINAPI *EmulateInterruptPM)( CONTEXT86 *context, BYTE intnum );
|
|
||||||
void (WINAPI *CallBuiltinHandler)( CONTEXT86 *context, BYTE intnum );
|
|
||||||
|
|
||||||
/* I/O functions */
|
|
||||||
DWORD (WINAPI *inport)( int port, int size );
|
|
||||||
void (WINAPI *outport)( int port, int size, DWORD val );
|
|
||||||
} DOSVM_TABLE;
|
|
||||||
|
|
||||||
extern DOSVM_TABLE Dosvm;
|
|
||||||
|
|
||||||
/* this structure is always located at offset 0 of the DGROUP segment */
|
/* this structure is always located at offset 0 of the DGROUP segment */
|
||||||
#include "pshpack1.h"
|
#include "pshpack1.h"
|
||||||
|
|
|
@ -1087,8 +1087,7 @@ static DWORD VxDCall_VWin32( DWORD service, CONTEXT86 *context )
|
||||||
|
|
||||||
SET_AX( context, callnum );
|
SET_AX( context, callnum );
|
||||||
SET_CX( context, parm );
|
SET_CX( context, parm );
|
||||||
if(Dosvm.CallBuiltinHandler || DPMI_LoadDosSystem())
|
INSTR_CallBuiltinHandler( context, 0x31 );
|
||||||
Dosvm.CallBuiltinHandler( context, 0x31 );
|
|
||||||
|
|
||||||
return LOWORD(context->Eax);
|
return LOWORD(context->Eax);
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,12 +104,6 @@ extern LPVOID DOSMEM_MapRealToLinear(DWORD); /* real-mode to linear */
|
||||||
extern LPVOID DOSMEM_MapDosToLinear(UINT); /* linear DOS to Wine */
|
extern LPVOID DOSMEM_MapDosToLinear(UINT); /* linear DOS to Wine */
|
||||||
extern UINT DOSMEM_MapLinearToDos(LPVOID); /* linear Wine to DOS */
|
extern UINT DOSMEM_MapLinearToDos(LPVOID); /* linear Wine to DOS */
|
||||||
|
|
||||||
/* memory/instr.c */
|
|
||||||
extern DWORD INSTR_EmulateInstruction( EXCEPTION_RECORD *rec, CONTEXT86 *context );
|
|
||||||
|
|
||||||
/* msdos/dpmi.c */
|
|
||||||
extern BOOL DPMI_LoadDosSystem(void);
|
|
||||||
|
|
||||||
#define PTR_REAL_TO_LIN(seg,off) \
|
#define PTR_REAL_TO_LIN(seg,off) \
|
||||||
((void*)(((unsigned int)(seg) << 4) + LOWORD(off)))
|
((void*)(((unsigned int)(seg) << 4) + LOWORD(off)))
|
||||||
|
|
||||||
|
|
88
msdos/dpmi.c
88
msdos/dpmi.c
|
@ -1,88 +0,0 @@
|
||||||
/*
|
|
||||||
* DPMI 0.9 emulation
|
|
||||||
*
|
|
||||||
* Copyright 1995 Alexandre Julliard
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "wine/port.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "windef.h"
|
|
||||||
#include "winbase.h"
|
|
||||||
#include "kernel_private.h"
|
|
||||||
#include "wine/debug.h"
|
|
||||||
#include "wine/windef16.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(int31);
|
|
||||||
|
|
||||||
DOSVM_TABLE Dosvm = { NULL, };
|
|
||||||
|
|
||||||
static HMODULE DosModule;
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* DPMI_LoadDosSystem
|
|
||||||
*/
|
|
||||||
BOOL DPMI_LoadDosSystem(void)
|
|
||||||
{
|
|
||||||
if (DosModule) return TRUE;
|
|
||||||
DosModule = LoadLibraryA( "winedos.dll" );
|
|
||||||
if (!DosModule) {
|
|
||||||
ERR("could not load winedos.dll, DOS subsystem unavailable\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#define GET_ADDR(func) Dosvm.func = (void *)GetProcAddress(DosModule, #func);
|
|
||||||
|
|
||||||
GET_ADDR(inport);
|
|
||||||
GET_ADDR(outport);
|
|
||||||
GET_ADDR(EmulateInterruptPM);
|
|
||||||
GET_ADDR(CallBuiltinHandler);
|
|
||||||
#undef GET_ADDR
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* NetBIOSCall (KERNEL.103)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void WINAPI NetBIOSCall16( CONTEXT86 *context )
|
|
||||||
{
|
|
||||||
if (Dosvm.CallBuiltinHandler || DPMI_LoadDosSystem())
|
|
||||||
Dosvm.CallBuiltinHandler( context, 0x5c );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* DOS3Call (KERNEL.102)
|
|
||||||
*/
|
|
||||||
void WINAPI DOS3Call( CONTEXT86 *context )
|
|
||||||
{
|
|
||||||
if (Dosvm.CallBuiltinHandler || DPMI_LoadDosSystem())
|
|
||||||
Dosvm.CallBuiltinHandler( context, 0x21 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetSetKernelDOSProc (KERNEL.311)
|
|
||||||
*/
|
|
||||||
FARPROC16 WINAPI GetSetKernelDOSProc16( FARPROC16 DosProc )
|
|
||||||
{
|
|
||||||
FIXME("(DosProc=0x%08x): stub\n", (UINT)DosProc);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
Loading…
Reference in New Issue