Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
b18dbd26
Commit
b18dbd26
authored
Jul 25, 2000
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Perform NE_InitProcess in the context of the new task.
parent
37b51f4a
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
68 additions
and
79 deletions
+68
-79
directory.c
files/directory.c
+5
-7
task.h
include/task.h
+0
-1
module.c
loader/ne/module.c
+54
-11
task.c
loader/task.c
+9
-60
No files found.
files/directory.c
View file @
b18dbd26
...
...
@@ -25,7 +25,6 @@
#include "wingdi.h"
#include "wine/winuser16.h"
#include "winerror.h"
#include "process.h"
#include "drive.h"
#include "file.h"
#include "heap.h"
...
...
@@ -509,17 +508,16 @@ done:
*
* Helper function for DIR_SearchPath.
*/
static
BOOL
DIR_TryModulePath
(
LPCSTR
name
,
DOS_FULL_NAME
*
full_name
)
static
BOOL
DIR_TryModulePath
(
LPCSTR
name
,
DOS_FULL_NAME
*
full_name
,
BOOL
win32
)
{
PDB
*
pdb
=
PROCESS_Current
();
/* FIXME: for now, GetModuleFileNameA can't return more */
/* than OFS_MAXPATHNAME. This may change with Win32. */
char
buffer
[
OFS_MAXPATHNAME
];
LPSTR
p
;
if
(
pdb
->
flags
&
PDB32_WIN16_PROC
)
{
if
(
!
win32
)
{
if
(
!
GetCurrentTask
())
return
FALSE
;
if
(
!
GetModuleFileName16
(
GetCurrentTask
(),
buffer
,
sizeof
(
buffer
)
))
buffer
[
0
]
=
'\0'
;
...
...
@@ -595,7 +593,7 @@ DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
/* Try the path of the current executable (for Win32 search order) */
if
(
win32
&&
DIR_TryModulePath
(
name
,
full_name
))
goto
done
;
if
(
win32
&&
DIR_TryModulePath
(
name
,
full_name
,
win32
))
goto
done
;
/* Try the current directory */
...
...
@@ -613,7 +611,7 @@ DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
/* Try the path of the current executable (for Win16 search order) */
if
(
!
win32
&&
DIR_TryModulePath
(
name
,
full_name
))
goto
done
;
if
(
!
win32
&&
DIR_TryModulePath
(
name
,
full_name
,
win32
))
goto
done
;
/* Try all directories in path */
...
...
include/task.h
View file @
b18dbd26
...
...
@@ -149,7 +149,6 @@ extern BOOL TASK_Create( struct _NE_MODULE *pModule, UINT16 cmdShow,
extern
void
TASK_KillTask
(
HTASK16
hTask
);
extern
HTASK16
TASK_GetNextTask
(
HTASK16
hTask
);
extern
void
TASK_Reschedule
(
void
);
extern
void
TASK_CallToStart
(
void
);
extern
void
TASK_InstallTHHook
(
THHOOK
*
pNewThook
);
extern
void
TASK_CallTaskSignalProc
(
UINT16
uCode
,
HANDLE16
hTaskOrModule
);
...
...
loader/ne/module.c
View file @
b18dbd26
...
...
@@ -39,7 +39,7 @@ static NE_MODULE *pCachedModule = 0; /* Module cached by NE_OpenFile */
static
HINSTANCE16
NE_LoadModule
(
LPCSTR
name
,
BOOL
lib_only
);
static
BOOL16
NE_FreeModule
(
HMODULE16
hModule
,
BOOL
call_wep
);
static
HINSTANCE16
NE_InitProcess
(
NE_MODULE
*
pModule
,
HTASK
hTask
)
;
static
void
NE_InitProcess
(
void
)
WINE_NORETURN
;
static
HINSTANCE16
MODULE_LoadModule16
(
LPCSTR
libname
,
BOOL
implicit
,
BOOL
lib_only
);
...
...
@@ -997,9 +997,11 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
TEB
*
teb
=
NULL
;
BOOL
lib_only
=
!
paramBlock
||
(
paramBlock
==
(
LPVOID
)
-
1
);
LOADPARAMS16
*
params
;
HINSTANCE16
instance
;
HINSTANCE16
instance
=
0
;
HMODULE16
hModule
;
NE_MODULE
*
pModule
;
HTASK
hTask
;
TDB
*
pTask
;
LPSTR
cmdline
;
WORD
cmdShow
;
int
socket
;
...
...
@@ -1050,7 +1052,7 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
CloseHandle
(
req
->
handle
);
if
(
!
(
teb
=
THREAD_Create
(
socket
,
0
,
FALSE
)))
goto
error
;
teb
->
startup
=
TASK_CallToStart
;
teb
->
startup
=
NE_InitProcess
;
/* Create a task for this process */
...
...
@@ -1059,13 +1061,22 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
cmdline
=
PTR_SEG_TO_LIN
(
params
->
cmdLine
);
if
(
!
TASK_Create
(
pModule
,
cmdShow
,
teb
,
cmdline
+
1
,
*
cmdline
))
goto
error
;
if
((
instance
=
NE_InitProcess
(
pModule
,
teb
->
htask16
))
<
32
)
goto
error
;
hTask
=
teb
->
htask16
;
if
(
SYSDEPS_SpawnThread
(
teb
)
==
-
1
)
goto
error
;
/* Post event to start the task */
PostEvent16
(
teb
->
htask16
);
OldYield16
();
PostEvent16
(
hTask
);
/* Wait until we get the instance handle */
do
{
DirectedYield16
(
hTask
);
if
(
!
IsTask16
(
hTask
))
break
;
if
(
!
(
pTask
=
(
TDB
*
)
GlobalLock16
(
hTask
)))
break
;
instance
=
pTask
->
hInstance
;
GlobalUnlock16
(
hTask
);
}
while
(
!
instance
);
return
instance
;
...
...
@@ -1079,11 +1090,11 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
/**********************************************************************
* NE_InitProcess
*/
static
HINSTANCE16
NE_InitProcess
(
NE_MODULE
*
pModule
,
HTASK
hTask
)
static
void
NE_InitProcess
(
void
)
{
TDB
*
pTask
=
(
TDB
*
)
GlobalLock16
(
GetCurrentTask
()
);
NE_MODULE
*
pModule
=
NE_GetPtr
(
pTask
->
hModule
);
HINSTANCE16
hInstance
,
hPrevInstance
;
TDB
*
pTask
;
SEGTABLEENTRY
*
pSegTable
=
NE_SEG_TABLE
(
pModule
);
WORD
sp
;
...
...
@@ -1116,9 +1127,10 @@ static HINSTANCE16 NE_InitProcess( NE_MODULE *pModule, HTASK hTask )
if
(
hInstance
>=
32
)
{
CONTEXT86
context
;
/* Enter instance handles into task struct */
pTask
=
(
TDB
*
)
GlobalLock16
(
hTask
);
pTask
->
hInstance
=
hInstance
;
pTask
->
hPrevInstance
=
hPrevInstance
;
...
...
@@ -1129,10 +1141,41 @@ static HINSTANCE16 NE_InitProcess( NE_MODULE *pModule, HTASK hTask )
sp
&=
~
1
;
sp
-=
sizeof
(
STACK16FRAME
);
pTask
->
teb
->
cur_stack
=
PTR_SEG_OFF_TO_SEGPTR
(
GlobalHandleToSel16
(
hInstance
),
sp
);
/* Registers at initialization must be:
* ax zero
* bx stack size in bytes
* cx heap size in bytes
* si previous app instance
* di current app instance
* bp zero
* es selector to the PSP
* ds dgroup of the application
* ss stack selector
* sp top of the stack
*/
memset
(
&
context
,
0
,
sizeof
(
context
)
);
CS_reg
(
&
context
)
=
GlobalHandleToSel16
(
pSegTable
[
pModule
->
cs
-
1
].
hSeg
);
DS_reg
(
&
context
)
=
GlobalHandleToSel16
(
pTask
->
hInstance
);
ES_reg
(
&
context
)
=
pTask
->
hPDB
;
EIP_reg
(
&
context
)
=
pModule
->
ip
;
EBX_reg
(
&
context
)
=
pModule
->
stack_size
;
ECX_reg
(
&
context
)
=
pModule
->
heap_size
;
EDI_reg
(
&
context
)
=
pTask
->
hInstance
;
ESI_reg
(
&
context
)
=
pTask
->
hPrevInstance
;
/* Now call 16-bit entry point */
TRACE
(
"Starting main program: cs:ip=%04lx:%04lx ds=%04lx ss:sp=%04x:%04x
\n
"
,
CS_reg
(
&
context
),
EIP_reg
(
&
context
),
DS_reg
(
&
context
),
SELECTOROF
(
pTask
->
teb
->
cur_stack
),
OFFSETOF
(
pTask
->
teb
->
cur_stack
)
);
ExitThread
(
Callbacks
->
CallRegisterShortProc
(
&
context
,
0
)
);
}
SYSLEVEL_LeaveWin16Lock
();
return
hInstance
;
ExitThread
(
hInstance
)
;
}
/***********************************************************************
...
...
loader/task.c
View file @
b18dbd26
...
...
@@ -213,57 +213,6 @@ static BOOL TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
/***********************************************************************
* TASK_CallToStart
*
* 32-bit entry point for a new task. This function is responsible for
* setting up the registers and jumping to the 16-bit entry point.
*/
void
TASK_CallToStart
(
void
)
{
TDB
*
pTask
=
(
TDB
*
)
GlobalLock16
(
GetCurrentTask
()
);
NE_MODULE
*
pModule
=
NE_GetPtr
(
pTask
->
hModule
);
SEGTABLEENTRY
*
pSegTable
=
NE_SEG_TABLE
(
pModule
);
CONTEXT86
context
;
SYSLEVEL_EnterWin16Lock
();
/* Add task to 16-bit scheduler pool if necessary */
if
(
hCurrentTask
!=
GetCurrentTask
()
)
TASK_Reschedule
();
/* Registers at initialization must be:
* ax zero
* bx stack size in bytes
* cx heap size in bytes
* si previous app instance
* di current app instance
* bp zero
* es selector to the PSP
* ds dgroup of the application
* ss stack selector
* sp top of the stack
*/
memset
(
&
context
,
0
,
sizeof
(
context
)
);
CS_reg
(
&
context
)
=
GlobalHandleToSel16
(
pSegTable
[
pModule
->
cs
-
1
].
hSeg
);
DS_reg
(
&
context
)
=
GlobalHandleToSel16
(
pTask
->
hInstance
);
ES_reg
(
&
context
)
=
pTask
->
hPDB
;
EIP_reg
(
&
context
)
=
pModule
->
ip
;
EBX_reg
(
&
context
)
=
pModule
->
stack_size
;
ECX_reg
(
&
context
)
=
pModule
->
heap_size
;
EDI_reg
(
&
context
)
=
pTask
->
hInstance
;
ESI_reg
(
&
context
)
=
pTask
->
hPrevInstance
;
TRACE
(
"Starting main program: cs:ip=%04lx:%04lx ds=%04lx ss:sp=%04x:%04x
\n
"
,
CS_reg
(
&
context
),
EIP_reg
(
&
context
),
DS_reg
(
&
context
),
SELECTOROF
(
pTask
->
teb
->
cur_stack
),
OFFSETOF
(
pTask
->
teb
->
cur_stack
)
);
Callbacks
->
CallRegisterShortProc
(
&
context
,
0
);
}
/***********************************************************************
* TASK_Create
*
* NOTE: This routine might be called by a Win32 thread. Thus, we need
...
...
@@ -287,18 +236,18 @@ BOOL TASK_Create( NE_MODULE *pModule, UINT16 cmdShow, TEB *teb, LPCSTR cmdline,
/* Fill the task structure */
pTask
->
nEvents
=
0
;
pTask
->
hSelf
=
hTask
;
pTask
->
flags
=
0
;
pTask
->
hSelf
=
hTask
;
if
(
teb
->
tibflags
&
TEBF_WIN32
)
pTask
->
flags
|=
TDBF_WIN32
;
if
(
teb
->
tibflags
&
TEBF_WIN32
)
{
pTask
->
flags
|=
TDBF_WIN32
;
pTask
->
hInstance
=
pModule
->
self
;
pTask
->
hPrevInstance
=
0
;
/* NOTE: for 16-bit tasks, the instance handles are updated later on
in NE_InitProcess */
}
if
(
pModule
->
lpDosTask
)
pTask
->
flags
|=
TDBF_WINOLDAP
;
pTask
->
hInstance
=
pModule
->
self
;
pTask
->
hPrevInstance
=
0
;
/* NOTE: for 16-bit tasks, the instance handles are updated later on
in NE_InitProcess */
pTask
->
version
=
pModule
->
expected_version
;
pTask
->
hModule
=
pModule
->
self
;
pTask
->
hParent
=
GetCurrentTask
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment