Moved most of the 16-bit task support and NE module loader to

dlls/kernel.
This commit is contained in:
Alexandre Julliard 2003-08-23 00:03:40 +00:00
parent df167d17c6
commit 5fbb446cfc
16 changed files with 3301 additions and 3114 deletions

View File

@ -34,6 +34,8 @@ C_SRCS = \
lcformat.c \ lcformat.c \
local16.c \ local16.c \
locale.c \ locale.c \
ne_module.c \
ne_segment.c \
powermgnt.c \ powermgnt.c \
process.c \ process.c \
resource.c \ resource.c \
@ -42,6 +44,7 @@ C_SRCS = \
string.c \ string.c \
sync.c \ sync.c \
tape.c \ tape.c \
task.c \
thread.c \ thread.c \
thunk.c \ thunk.c \
time.c \ time.c \

View File

@ -97,6 +97,7 @@ static void thread_detach(void)
/* free the 16-bit stack */ /* free the 16-bit stack */
K32WOWGlobalFree16( NtCurrentTeb()->stack_sel ); K32WOWGlobalFree16( NtCurrentTeb()->stack_sel );
NtCurrentTeb()->cur_stack = 0; NtCurrentTeb()->cur_stack = 0;
if (!(NtCurrentTeb()->tibflags & TEBF_WIN32)) TASK_ExitTask();
} }

1716
dlls/kernel/ne_module.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -34,6 +34,7 @@
#include <string.h> #include <string.h>
#include "wine/winbase16.h" #include "wine/winbase16.h"
#include "wownt32.h"
#include "wine/library.h" #include "wine/library.h"
#include "global.h" #include "global.h"
#include "task.h" #include "task.h"
@ -82,10 +83,6 @@ struct relocation_entry_s
static void NE_FixupSegmentPrologs(NE_MODULE *pModule, WORD segnum); static void NE_FixupSegmentPrologs(NE_MODULE *pModule, WORD segnum);
/* ### start build ### */
extern WORD CALLBACK NE_CallTo16_word_ww(FARPROC16,WORD,WORD);
extern WORD CALLBACK NE_CallTo16_word_www(FARPROC16,WORD,WORD,WORD);
/* ### stop build ### */
/*********************************************************************** /***********************************************************************
* NE_GetRelocAddrName * NE_GetRelocAddrName
@ -158,6 +155,8 @@ BOOL NE_LoadSegment( NE_MODULE *pModule, WORD segnum )
DWORD oldstack; DWORD oldstack;
HANDLE hFile32; HANDLE hFile32;
HFILE16 hFile16; HFILE16 hFile16;
WORD args[3];
DWORD ret;
selfloadheader = MapSL( MAKESEGPTR(SEL(pSegTable->hSeg),0) ); selfloadheader = MapSL( MAKESEGPTR(SEL(pSegTable->hSeg),0) );
oldstack = NtCurrentTeb()->cur_stack; oldstack = NtCurrentTeb()->cur_stack;
@ -169,8 +168,11 @@ BOOL NE_LoadSegment( NE_MODULE *pModule, WORD segnum )
DuplicateHandle( GetCurrentProcess(), hf, GetCurrentProcess(), &hFile32, DuplicateHandle( GetCurrentProcess(), hf, GetCurrentProcess(), &hFile32,
0, FALSE, DUPLICATE_SAME_ACCESS ); 0, FALSE, DUPLICATE_SAME_ACCESS );
hFile16 = Win32HandleToDosFileHandle( hFile32 ); hFile16 = Win32HandleToDosFileHandle( hFile32 );
pSeg->hSeg = NE_CallTo16_word_www( selfloadheader->LoadAppSeg, args[2] = pModule->self;
pModule->self, hFile16, segnum ); args[1] = hFile16;
args[0] = segnum;
WOWCallback16Ex( (DWORD)selfloadheader->LoadAppSeg, WCB16_PASCAL, sizeof(args), args, &ret );
pSeg->hSeg = LOWORD(ret);
TRACE_(dll)("Ret CallLoadAppSegProc: hSeg = 0x%04x\n", pSeg->hSeg); TRACE_(dll)("Ret CallLoadAppSegProc: hSeg = 0x%04x\n", pSeg->hSeg);
_lclose16( hFile16 ); _lclose16( hFile16 );
NtCurrentTeb()->cur_stack = oldstack; NtCurrentTeb()->cur_stack = oldstack;
@ -450,6 +452,7 @@ BOOL NE_LoadAllSegments( NE_MODULE *pModule )
SELFLOADHEADER *selfloadheader; SELFLOADHEADER *selfloadheader;
HMODULE16 mod = GetModuleHandle16("KERNEL"); HMODULE16 mod = GetModuleHandle16("KERNEL");
DWORD oldstack; DWORD oldstack;
WORD args[2];
TRACE_(module)("%.*s is a self-loading module!\n", TRACE_(module)("%.*s is a self-loading module!\n",
*((BYTE*)pModule + pModule->name_table), *((BYTE*)pModule + pModule->name_table),
@ -470,7 +473,9 @@ BOOL NE_LoadAllSegments( NE_MODULE *pModule )
hFile16 = Win32HandleToDosFileHandle( hf ); hFile16 = Win32HandleToDosFileHandle( hf );
TRACE_(dll)("CallBootAppProc(hModule=0x%04x,hf=0x%04x)\n", TRACE_(dll)("CallBootAppProc(hModule=0x%04x,hf=0x%04x)\n",
pModule->self,hFile16); pModule->self,hFile16);
NE_CallTo16_word_ww(selfloadheader->BootApp, pModule->self,hFile16); args[1] = pModule->self;
args[0] = hFile16;
WOWCallback16Ex( (DWORD)selfloadheader->BootApp, WCB16_PASCAL, sizeof(args), args, NULL );
TRACE_(dll)("Return from CallBootAppProc\n"); TRACE_(dll)("Return from CallBootAppProc\n");
_lclose16(hFile16); _lclose16(hFile16);
NtCurrentTeb()->cur_stack = oldstack; NtCurrentTeb()->cur_stack = oldstack;

1556
dlls/kernel/task.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1589,7 +1589,7 @@ FARPROC THUNK_AllocLSThunklet( SEGPTR target, DWORD relay,
THUNKLET_TYPE_LS ); THUNKLET_TYPE_LS );
if (!thunk) if (!thunk)
{ {
TDB *pTask = TASK_GetPtr( owner ); TDB *pTask = GlobalLock16( owner );
if (!ThunkletHeap) THUNK_Init(); if (!ThunkletHeap) THUNK_Init();
if ( !(thunk = HeapAlloc( ThunkletHeap, 0, sizeof(THUNKLET) )) ) if ( !(thunk = HeapAlloc( ThunkletHeap, 0, sizeof(THUNKLET) )) )
@ -1623,7 +1623,7 @@ SEGPTR THUNK_AllocSLThunklet( FARPROC target, DWORD relay,
THUNKLET_TYPE_SL ); THUNKLET_TYPE_SL );
if (!thunk) if (!thunk)
{ {
TDB *pTask = TASK_GetPtr( owner ); TDB *pTask = GlobalLock16( owner );
if (!ThunkletHeap) THUNK_Init(); if (!ThunkletHeap) THUNK_Init();
if ( !(thunk = HeapAlloc( ThunkletHeap, 0, sizeof(THUNKLET) )) ) if ( !(thunk = HeapAlloc( ThunkletHeap, 0, sizeof(THUNKLET) )) )

View File

@ -235,7 +235,7 @@ HANDLE WINAPI K32WOWHandle32( WORD handle, WOW_HANDLE_TYPE type )
return (HANDLE)(ULONG_PTR)handle; return (HANDLE)(ULONG_PTR)handle;
case WOW_TYPE_HTASK: case WOW_TYPE_HTASK:
return (HANDLE)TASK_GetPtr(handle)->teb->tid; return (HANDLE)((TDB *)GlobalLock16(handle))->teb->tid;
case WOW_TYPE_FULLHWND: case WOW_TYPE_FULLHWND:
FIXME( "conversion of full window handles not supported yet\n" ); FIXME( "conversion of full window handles not supported yet\n" );
@ -276,7 +276,7 @@ WORD WINAPI K32WOWHandle16( HANDLE handle, WOW_HANDLE_TYPE type )
return LOWORD(handle); return LOWORD(handle);
case WOW_TYPE_HTASK: case WOW_TYPE_HTASK:
return THREAD_IdToTEB((DWORD)handle)->htask16; return TASK_GetTaskFromThread( (DWORD)handle );
default: default:
ERR( "handle %p of unknown type %d\n", handle, type ); ERR( "handle %p of unknown type %d\n", handle, type );

View File

@ -21,7 +21,6 @@ C_SRCS = \
$(TOPOBJDIR)/loader/pe_image.c \ $(TOPOBJDIR)/loader/pe_image.c \
$(TOPOBJDIR)/loader/task.c \ $(TOPOBJDIR)/loader/task.c \
$(TOPOBJDIR)/loader/ne/module.c \ $(TOPOBJDIR)/loader/ne/module.c \
$(TOPOBJDIR)/loader/ne/segment.c \
$(TOPOBJDIR)/memory/codepage.c \ $(TOPOBJDIR)/memory/codepage.c \
$(TOPOBJDIR)/memory/environ.c \ $(TOPOBJDIR)/memory/environ.c \
$(TOPOBJDIR)/memory/global.c \ $(TOPOBJDIR)/memory/global.c \
@ -89,7 +88,7 @@ ASM_SRCS = \
relay16.s \ relay16.s \
relay32.s relay32.s
EXTRA_OBJS = $(ASM_SRCS:.s=.o) $(MODULE).glue.o EXTRA_OBJS = $(ASM_SRCS:.s=.o)
SUBDIRS = tests SUBDIRS = tests

View File

@ -428,7 +428,7 @@ int DRIVE_IsValid( int drive )
*/ */
int DRIVE_GetCurrentDrive(void) int DRIVE_GetCurrentDrive(void)
{ {
TDB *pTask = TASK_GetCurrent(); TDB *pTask = GlobalLock16(GetCurrentTask());
if (pTask && (pTask->curdrive & 0x80)) return pTask->curdrive & ~0x80; if (pTask && (pTask->curdrive & 0x80)) return pTask->curdrive & ~0x80;
return DRIVE_CurDrive; return DRIVE_CurDrive;
} }
@ -439,7 +439,7 @@ int DRIVE_GetCurrentDrive(void)
*/ */
int DRIVE_SetCurrentDrive( int drive ) int DRIVE_SetCurrentDrive( int drive )
{ {
TDB *pTask = TASK_GetCurrent(); TDB *pTask = GlobalLock16(GetCurrentTask());
if (!DRIVE_IsValid( drive )) if (!DRIVE_IsValid( drive ))
{ {
SetLastError( ERROR_INVALID_DRIVE ); SetLastError( ERROR_INVALID_DRIVE );
@ -619,7 +619,7 @@ const char * DRIVE_GetRoot( int drive )
*/ */
LPCWSTR DRIVE_GetDosCwd( int drive ) LPCWSTR DRIVE_GetDosCwd( int drive )
{ {
TDB *pTask = TASK_GetCurrent(); TDB *pTask = GlobalLock16(GetCurrentTask());
if (!DRIVE_IsValid( drive )) return NULL; if (!DRIVE_IsValid( drive )) return NULL;
/* Check if we need to change the directory to the new task. */ /* Check if we need to change the directory to the new task. */
@ -643,7 +643,7 @@ LPCWSTR DRIVE_GetDosCwd( int drive )
*/ */
const char * DRIVE_GetUnixCwd( int drive ) const char * DRIVE_GetUnixCwd( int drive )
{ {
TDB *pTask = TASK_GetCurrent(); TDB *pTask = GlobalLock16(GetCurrentTask());
if (!DRIVE_IsValid( drive )) return NULL; if (!DRIVE_IsValid( drive )) return NULL;
/* Check if we need to change the directory to the new task. */ /* Check if we need to change the directory to the new task. */
@ -1234,7 +1234,7 @@ int DRIVE_Chdir( int drive, LPCWSTR path )
WCHAR buffer[MAX_PATHNAME_LEN]; WCHAR buffer[MAX_PATHNAME_LEN];
LPSTR unix_cwd; LPSTR unix_cwd;
BY_HANDLE_FILE_INFORMATION info; BY_HANDLE_FILE_INFORMATION info;
TDB *pTask = TASK_GetCurrent(); TDB *pTask = GlobalLock16(GetCurrentTask());
buffer[0] = 'A' + drive; buffer[0] = 'A' + drive;
buffer[1] = ':'; buffer[1] = ':';

View File

@ -163,10 +163,8 @@ extern void TASK_CreateMainTask(void);
extern HTASK16 TASK_SpawnTask( struct _NE_MODULE *pModule, WORD cmdShow, extern HTASK16 TASK_SpawnTask( struct _NE_MODULE *pModule, WORD cmdShow,
LPCSTR cmdline, BYTE len, HANDLE *hThread ); LPCSTR cmdline, BYTE len, HANDLE *hThread );
extern void TASK_ExitTask(void); extern void TASK_ExitTask(void);
extern HTASK16 TASK_GetNextTask( HTASK16 hTask ); extern HTASK16 TASK_GetTaskFromThread( DWORD thread );
extern TDB *TASK_GetPtr( HTASK16 hTask );
extern TDB *TASK_GetCurrent(void); extern TDB *TASK_GetCurrent(void);
extern void TASK_InstallTHHook( THHOOK *pNewThook ); extern void TASK_InstallTHHook( THHOOK *pNewThook );
extern void TASK_CallTaskSignalProc( UINT16 uCode, HANDLE16 hTaskOrModule );
#endif /* __WINE_TASK_H */ #endif /* __WINE_TASK_H */

View File

@ -149,7 +149,6 @@ typedef struct _TEB
/* scheduler/thread.c */ /* scheduler/thread.c */
extern void THREAD_Init(void); extern void THREAD_Init(void);
extern TEB *THREAD_InitStack( TEB *teb, DWORD stack_size ); extern TEB *THREAD_InitStack( TEB *teb, DWORD stack_size );
extern TEB *THREAD_IdToTEB( DWORD id );
/* scheduler/sysdeps.c */ /* scheduler/sysdeps.c */
extern int SYSDEPS_SpawnThread( void (*func)(TEB *), TEB *teb ); extern int SYSDEPS_SpawnThread( void (*func)(TEB *), TEB *teb );

View File

@ -781,27 +781,6 @@ VOID WINAPI FreeLibraryAndExitThread(HINSTANCE hLibModule, DWORD dwExitCode)
ExitThread(dwExitCode); ExitThread(dwExitCode);
} }
/***********************************************************************
* PrivateLoadLibrary (KERNEL32.@)
*
* FIXME: rough guesswork, don't know what "Private" means
*/
HINSTANCE16 WINAPI PrivateLoadLibrary(LPCSTR libname)
{
return LoadLibrary16(libname);
}
/***********************************************************************
* PrivateFreeLibrary (KERNEL32.@)
*
* FIXME: rough guesswork, don't know what "Private" means
*/
void WINAPI PrivateFreeLibrary(HINSTANCE16 handle)
{
FreeLibrary16(handle);
}
/*********************************************************************** /***********************************************************************
* GetProcAddress (KERNEL32.@) * GetProcAddress (KERNEL32.@)
*/ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -148,7 +148,7 @@ static BOOL INT21_CreateHeap(void)
static BYTE *GetCurrentDTA( CONTEXT86 *context ) static BYTE *GetCurrentDTA( CONTEXT86 *context )
{ {
TDB *pTask = TASK_GetCurrent(); TDB *pTask = GlobalLock16(GetCurrentTask());
/* FIXME: This assumes DTA was set correctly! */ /* FIXME: This assumes DTA was set correctly! */
return (BYTE *)CTX_SEG_OFF_TO_LIN( context, SELECTOROF(pTask->dta), return (BYTE *)CTX_SEG_OFF_TO_LIN( context, SELECTOROF(pTask->dta),

View File

@ -35,7 +35,6 @@
#endif #endif
#include "wine/winbase16.h" #include "wine/winbase16.h"
#include "thread.h" #include "thread.h"
#include "task.h"
#include "module.h" #include "module.h"
#include "winerror.h" #include "winerror.h"
#include "selectors.h" #include "selectors.h"
@ -53,39 +52,6 @@ static TEB initial_teb;
extern struct _PDB current_process; extern struct _PDB current_process;
/***********************************************************************
* THREAD_IdToTEB
*
* Convert a thread id to a TEB, making sure it is valid.
*/
TEB *THREAD_IdToTEB( DWORD id )
{
TEB *ret = NULL;
if (!id || id == GetCurrentThreadId()) return NtCurrentTeb();
SERVER_START_REQ( get_thread_info )
{
req->handle = 0;
req->tid_in = id;
if (!wine_server_call( req )) ret = reply->teb;
}
SERVER_END_REQ;
if (!ret)
{
/* Allow task handles to be used; convert to main thread */
if ( IsTask16( id ) )
{
TDB *pTask = TASK_GetPtr( id );
if (pTask) return pTask->teb;
}
SetLastError( ERROR_INVALID_PARAMETER );
}
return ret;
}
/*********************************************************************** /***********************************************************************
* THREAD_InitTEB * THREAD_InitTEB
* *
@ -341,7 +307,6 @@ void WINAPI ExitThread( DWORD code ) /* [in] Exit code for this thread */
else else
{ {
LdrShutdownThread(); LdrShutdownThread();
if (!(NtCurrentTeb()->tibflags & TEBF_WIN32)) TASK_ExitTask();
SYSDEPS_ExitThread( code ); SYSDEPS_ExitThread( code );
} }
} }