Commit 7afce0e6 authored by Alexandre Julliard's avatar Alexandre Julliard

Moved the few remaining functions in wprocs.dll to kernel.dll.

No longer load wprocs.dll unconditionally. Restored default interrupt handler behavior (reported by Andreas Mohr).
parent 3a0f8b79
......@@ -515,6 +515,12 @@ owner kernel32
652 stub IsThreadId
653 stub OkWithKernelToChangeUsers
# Extra Wine internal functions for thunking and self-loader
666 pascal UTGlue16(ptr long ptr long) UTGlue16
667 pascal EntryAddrProc(word word) EntryAddrProc16
668 pascal MyAlloc(word word word) MyAlloc16
# 700-704 are Win95 only
......
......@@ -8,7 +8,6 @@
#include "winbase.h"
#include "wine/winbase16.h"
#include "neexe.h"
#include "module.h"
#include "task.h"
#include "selectors.h"
......@@ -50,7 +49,7 @@ static BOOL process_attach(void)
NE_SetEntryPoint( hModule, 455, __get_ds() );
/* Initialize KERNEL.THHOOK */
TASK_InstallTHHook((THHOOK *)PTR_SEG_TO_LIN((SEGPTR)NE_GetEntryPoint( hModule, 332 )));
TASK_InstallTHHook((THHOOK *)PTR_SEG_TO_LIN((SEGPTR)GetProcAddress16( hModule, (LPCSTR)332 )));
/* Initialize the real-mode selector entry points */
#define SET_ENTRY_POINT( num, addr ) \
......@@ -72,7 +71,6 @@ static BOOL process_attach(void)
/* Force loading of some dlls */
if (LoadLibrary16( "system" ) < 32) return FALSE;
if (LoadLibrary16( "wprocs" ) < 32) return FALSE;
/* Initialize communications */
COMM_Init();
......
......@@ -65,7 +65,7 @@ extern LONG CALLBACK UTTHUNK_CallTo16_long_ll(FARPROC16,LONG,LONG);
/* ### stop build ### */
/****************************************************************************
* UTGlue16 (WPROCS.*)
* UTGlue16 (KERNEL Wine-specific export)
*/
DWORD WINAPI UTGlue16( LPVOID lpBuff, DWORD dwUserDefined, SEGPTR *translationList,
UTGLUEPROC target )
......@@ -148,11 +148,8 @@ static UTINFO *UTAlloc( HMODULE hModule, HMODULE16 hModule16,
if ( !UTGlue16_Segptr )
{
HMODULE16 hModule = GetModuleHandle16( "WPROCS" );
int ordinal = NE_GetOrdinal( hModule, "UTGlue16" );
if ( hModule && ordinal )
UTGlue16_Segptr = NE_GetEntryPoint( hModule, ordinal );
HMODULE16 hModule = GetModuleHandle16( "KERNEL" );
UTGlue16_Segptr = GetProcAddress16( hModule, "UTGlue16" );
if ( !UTGlue16_Segptr ) return NULL;
}
......
......@@ -2,10 +2,6 @@ name wprocs
type win16
owner kernel32
23 pascal UTGlue16(ptr long ptr long) UTGlue16
27 pascal EntryAddrProc(word word) WIN16_NE_GetEntryPoint
28 pascal MyAlloc(word word word) NE_AllocateSegment
# Interrupt vectors 0-255 are ordinals 100-355
# The 'interrupt' keyword takes care of the flags pushed on the stack by the interrupt
116 interrupt INT_Int10Handler() INT_Int10Handler
......@@ -26,6 +22,8 @@ owner kernel32
165 interrupt INT_Int41Handler() INT_Int41Handler
175 interrupt INT_Int4bHandler() INT_Int4bHandler
192 interrupt INT_Int5cHandler() NetBIOSCall16
# default handler for unimplemented interrupts
356 interrupt INT_DefaultHandler() INT_DefaultHandler
# VxDs. The first Vxd is at 400
#
......
......@@ -13,7 +13,6 @@
#include "wine/winbase16.h"
#include "winerror.h"
#include "module.h"
#include "neexe.h"
#include "toolhelp.h"
#include "file.h"
#include "ldt.h"
......@@ -30,6 +29,17 @@
DEFAULT_DEBUG_CHANNEL(module);
/*
* Segment table entry
*/
struct ne_segment_table_entry_s
{
WORD seg_data_offset; /* Sector offset of segment data */
WORD seg_data_length; /* Length of segment data */
WORD seg_flags; /* Flags associated with this segment */
WORD min_alloc; /* Minimum allocation size for this */
};
#define hFirstModule (pThhook->hExeHead)
static NE_MODULE *pCachedModule = 0; /* Module cached by NE_OpenFile */
......@@ -111,8 +121,8 @@ void NE_DumpModule( HMODULE16 hModule )
DPRINTF( "Alignment: %d\n", *pword++ );
while (*pword)
{
struct resource_typeinfo_s *ptr = (struct resource_typeinfo_s *)pword;
struct resource_nameinfo_s *pname = (struct resource_nameinfo_s *)(ptr + 1);
NE_TYPEINFO *ptr = (NE_TYPEINFO *)pword;
NE_NAMEINFO *pname = (NE_NAMEINFO *)(ptr + 1);
DPRINTF( "id=%04x count=%d\n", ptr->type_id, ptr->count );
for (i = 0; i < ptr->count; i++, pname++)
DPRINTF( "offset=%d len=%d id=%04x\n",
......@@ -284,11 +294,11 @@ WORD NE_GetOrdinal( HMODULE16 hModule, const char *name )
/***********************************************************************
* NE_GetEntryPoint (WPROCS.27)
* NE_GetEntryPoint / EntryAddrProc16 (KERNEL Wine-specific export)
*
* Return the entry point for a given ordinal.
*/
FARPROC16 WINAPI WIN16_NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
FARPROC16 WINAPI EntryAddrProc16( HMODULE16 hModule, WORD ordinal )
{
FARPROC16 ret = NE_GetEntryPointEx( hModule, ordinal, TRUE );
CURRENT_STACK16->ecx = hModule; /* FIXME: might be incorrect value */
......@@ -1215,15 +1225,8 @@ HINSTANCE16 WINAPI LoadLibrary16( LPCSTR libname )
*/
static BOOL16 MODULE_CallWEP( HMODULE16 hModule )
{
FARPROC16 WEP = (FARPROC16)0;
WORD ordinal = NE_GetOrdinal( hModule, "WEP" );
if (ordinal) WEP = NE_GetEntryPoint( hModule, ordinal );
if (!WEP)
{
WARN("module %04x doesn't have a WEP\n", hModule );
return FALSE;
}
FARPROC16 WEP = GetProcAddress16( hModule, "WEP" );
if (!WEP) return FALSE;
return NE_CallTo16_word_w( WEP, WEP_FREE_DLL );
}
......
......@@ -16,7 +16,6 @@
#include <string.h>
#include "wine/winbase16.h"
#include "neexe.h"
#include "global.h"
#include "task.h"
#include "file.h"
......@@ -30,6 +29,37 @@ DECLARE_DEBUG_CHANNEL(fixup);
DECLARE_DEBUG_CHANNEL(module);
DECLARE_DEBUG_CHANNEL(segment);
/*
* Relocation table entry
*/
struct relocation_entry_s
{
BYTE address_type; /* Relocation address type */
BYTE relocation_type; /* Relocation type */
WORD offset; /* Offset in segment to fixup */
WORD target1; /* Target specification */
WORD target2; /* Target specification */
};
/*
* Relocation address types
*/
#define NE_RADDR_LOWBYTE 0
#define NE_RADDR_SELECTOR 2
#define NE_RADDR_POINTER32 3
#define NE_RADDR_OFFSET16 5
#define NE_RADDR_POINTER48 11
#define NE_RADDR_OFFSET32 13
/*
* Relocation types
*/
#define NE_RELTYPE_INTERNAL 0
#define NE_RELTYPE_ORDINAL 1
#define NE_RELTYPE_NAME 2
#define NE_RELTYPE_OSFIXUP 3
#define NE_RELFLAG_ADDITIVE 4
#define SEL(x) ((x)|1)
static void NE_FixupSegmentPrologs(NE_MODULE *pModule, WORD segnum);
......@@ -398,7 +428,7 @@ BOOL NE_LoadAllSegments( NE_MODULE *pModule )
HFILE16 hFile16;
/* Handle self-loading modules */
SELFLOADHEADER *selfloadheader;
HMODULE16 hselfload = GetModuleHandle16("WPROCS");
HMODULE16 mod = GetModuleHandle16("KERNEL");
DWORD oldstack;
TRACE_(module)("%.*s is a self-loading module!\n",
......@@ -407,9 +437,9 @@ BOOL NE_LoadAllSegments( NE_MODULE *pModule )
if (!NE_LoadSegment( pModule, 1 )) return FALSE;
selfloadheader = (SELFLOADHEADER *)
PTR_SEG_OFF_TO_LIN(SEL(pSegTable->hSeg), 0);
selfloadheader->EntryAddrProc = NE_GetEntryPoint(hselfload,27);
selfloadheader->MyAlloc = NE_GetEntryPoint(hselfload,28);
selfloadheader->SetOwner = NE_GetEntryPoint(GetModuleHandle16("KERNEL"),403);
selfloadheader->EntryAddrProc = GetProcAddress16(mod,"EntryAddrProc");
selfloadheader->MyAlloc = GetProcAddress16(mod,"MyAlloc");
selfloadheader->SetOwner = GetProcAddress16(mod,"FarSetOwner");
pModule->self_loading_sel = SEL(GLOBAL_Alloc(GMEM_ZEROINIT, 0xFF00, pModule->self, WINE_LDT_FLAGS_DATA));
oldstack = NtCurrentTeb()->cur_stack;
NtCurrentTeb()->cur_stack = PTR_SEG_OFF_TO_SEGPTR(pModule->self_loading_sel,
......@@ -671,12 +701,10 @@ static void NE_CallDllEntryPoint( NE_MODULE *pModule, DWORD dwReason )
{
WORD hInst, ds, heap;
FARPROC16 entryPoint;
WORD ordinal;
if (!(pModule->flags & NE_FFLAGS_LIBMODULE)) return;
if (!(pModule->flags & NE_FFLAGS_BUILTIN) && pModule->expected_version < 0x0400) return;
if (!(ordinal = NE_GetOrdinal( pModule->self, "DllEntryPoint" ))) return;
if (!(entryPoint = NE_GetEntryPoint( pModule->self, ordinal ))) return;
if (!(entryPoint = GetProcAddress16( pModule->self, "DllEntryPoint" ))) return;
NE_GetDLLInitParams( pModule, &hInst, &ds, &heap );
......@@ -796,11 +824,11 @@ static WORD NE_Ne2MemFlags(WORD flags)
}
/***********************************************************************
* NE_AllocateSegment (WPROCS.26)
* MyAlloc16 (KERNEL Wine-specific export)
*
* MyAlloc() function for self-loading apps.
*/
DWORD WINAPI NE_AllocateSegment( WORD wFlags, WORD wSize, WORD wElem )
DWORD WINAPI MyAlloc16( WORD wFlags, WORD wSize, WORD wElem )
{
WORD size = wSize << wElem;
HANDLE16 hMem = 0;
......
......@@ -326,15 +326,15 @@ static void do_int2f_16( CONTEXT86 *context )
break;
case 0x84: /* Get device API entry point */
addr = (DWORD)NE_GetEntryPoint( GetModuleHandle16("WPROCS"),
VXD_BASE + BX_reg(context) );
if (!addr) /* not supported */
{
ERR("Accessing unknown VxD %04x - Expect a failure now.\n",
BX_reg(context) );
HMODULE16 mod = GetModuleHandle16("wprocs");
if (mod < 32) mod = LoadLibrary16( "wprocs" );
addr = (DWORD)GetProcAddress16( mod, (LPCSTR)(VXD_BASE + BX_reg(context)) );
if (!addr) /* not supported */
ERR("Accessing unknown VxD %04x - Expect a failure now.\n", BX_reg(context) );
context->SegEs = SELECTOROF(addr);
DI_reg(context) = OFFSETOF(addr);
}
context->SegEs = SELECTOROF(addr);
DI_reg(context) = OFFSETOF(addr);
break;
case 0x86: /* DPMI detect mode */
......
......@@ -32,13 +32,18 @@ FARPROC16 INT_GetPMHandler( BYTE intnum )
static HMODULE16 wprocs;
if (!wprocs)
{
if ((wprocs = GetModuleHandle16( "wprocs" )) < 32)
if (((wprocs = GetModuleHandle16( "wprocs" )) < 32) &&
((wprocs = LoadLibrary16( "wprocs" )) < 32))
{
ERR("could not load wprocs.dll\n");
return 0;
}
}
INT_Vectors[intnum] = NE_GetEntryPoint( wprocs, FIRST_INTERRUPT + intnum );
if (!(INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + intnum))))
{
WARN("int%x not implemented, returning dummy handler\n", intnum );
INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + 256) );
}
}
return INT_Vectors[intnum];
}
......@@ -176,3 +181,13 @@ int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
}
return 0;
}
/**********************************************************************
* INT_DefaultHandler
*
* Default interrupt handler.
*/
void WINAPI INT_DefaultHandler( CONTEXT86 *context )
{
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment