Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
f6a93619
Commit
f6a93619
authored
Feb 28, 1999
by
Ulrich Weigand
Committed by
Alexandre Julliard
Feb 28, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adapted to CreateProcess changes.
parent
fe14b660
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
125 additions
and
128 deletions
+125
-128
dosexe.h
include/dosexe.h
+4
-6
pe_image.h
include/pe_image.h
+4
-4
module.c
loader/dos/module.c
+62
-63
main.c
loader/main.c
+1
-4
pe_image.c
loader/pe_image.c
+50
-46
main.c
miscemu/main.c
+1
-3
dpmi.c
msdos/dpmi.c
+3
-2
No files found.
include/dosexe.h
View file @
f6a93619
...
...
@@ -30,10 +30,7 @@ typedef struct _DOSTASK {
#define MZ_SUPPORTED
struct
_NE_MODULE
;
extern
int
MZ_InitTask
(
LPDOSTASK
lpDosTask
);
extern
int
MZ_InitMemory
(
LPDOSTASK
lpDosTask
,
struct
_NE_MODULE
*
pModule
);
extern
BOOL
MZ_InitTask
(
LPDOSTASK
lpDosTask
);
extern
void
MZ_KillModule
(
LPDOSTASK
lpDosTask
);
extern
LPDOSTASK
MZ_AllocDPMITask
(
HMODULE16
hModule
);
...
...
@@ -43,8 +40,9 @@ extern LPDOSTASK MZ_AllocDPMITask( HMODULE16 hModule );
extern
void
MZ_Tick
(
WORD
handle
);
extern
HINSTANCE16
MZ_CreateProcess
(
LPCSTR
name
,
LPCSTR
cmdline
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
);
extern
BOOL
MZ_CreateProcess
(
HFILE
hFile
,
OFSTRUCT
*
ofs
,
LPCSTR
cmdline
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
);
extern
int
DOSVM_Enter
(
PCONTEXT
context
);
extern
void
DOSVM_SetTimer
(
unsigned
ticks
);
extern
unsigned
DOSVM_GetTimer
(
void
);
...
...
include/pe_image.h
View file @
f6a93619
...
...
@@ -33,12 +33,12 @@ extern HRSRC PE_FindResourceExW(struct _wine_modref*,LPCWSTR,LPCWSTR,WORD);
extern
DWORD
PE_SizeofResource
(
HMODULE
,
HRSRC
);
extern
HMODULE
PE_LoadLibraryExA
(
LPCSTR
,
HFILE
,
DWORD
);
extern
HGLOBAL
PE_LoadResource
(
struct
_wine_modref
*
wm
,
HRSRC
);
extern
HMODULE
PE_LoadImage
(
LPCSTR
nam
e
,
OFSTRUCT
*
ofs
,
LPCSTR
*
modName
);
extern
HMODULE
PE_LoadImage
(
HFILE
hFil
e
,
OFSTRUCT
*
ofs
,
LPCSTR
*
modName
);
extern
struct
_wine_modref
*
PE_CreateModule
(
HMODULE
hModule
,
OFSTRUCT
*
ofs
,
DWORD
flags
,
BOOL
builtin
);
extern
HINSTANCE16
PE_CreateProcess
(
LPCSTR
name
,
LPCSTR
cmd_line
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
);
extern
BOOL
PE_CreateProcess
(
HFILE
hFile
,
OFSTRUCT
*
ofs
,
LPCSTR
cmd_line
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
);
struct
_THDB
;
/* forward definition */
extern
void
PE_InitTls
(
struct
_THDB
*
);
...
...
loader/dos/module.c
View file @
f6a93619
...
...
@@ -18,6 +18,7 @@
#include <sys/time.h>
#include "windef.h"
#include "wine/winbase16.h"
#include "winerror.h"
#include "module.h"
#include "peexe.h"
#include "neexe.h"
...
...
@@ -174,11 +175,11 @@ static WORD MZ_InitEnvironment( LPDOSTASK lpDosTask, LPCSTR env, LPCSTR name )
return
seg
;
}
int
MZ_InitMemory
(
LPDOSTASK
lpDosTask
,
NE_MODULE
*
pModule
)
static
BOOL
MZ_InitMemory
(
LPDOSTASK
lpDosTask
,
NE_MODULE
*
pModule
)
{
int
x
;
if
(
lpDosTask
->
img_ofs
)
return
32
;
/* already allocated */
if
(
lpDosTask
->
img_ofs
)
return
TRUE
;
/* already allocated */
/* allocate 1MB+64K shared memory */
lpDosTask
->
img_ofs
=
START_OFFSET
;
...
...
@@ -199,7 +200,7 @@ int MZ_InitMemory( LPDOSTASK lpDosTask, NE_MODULE *pModule )
#endif
if
(
lpDosTask
->
img
==
(
LPVOID
)
-
1
)
{
ERR
(
module
,
"could not map shared memory, error=%s
\n
"
,
strerror
(
errno
));
return
0
;
return
FALSE
;
}
TRACE
(
module
,
"DOS VM86 image mapped at %08lx
\n
"
,(
DWORD
)
lpDosTask
->
img
);
pModule
->
dos_image
=
lpDosTask
->
img
;
...
...
@@ -210,11 +211,11 @@ int MZ_InitMemory( LPDOSTASK lpDosTask, NE_MODULE *pModule )
MZ_InitHandlers
(
lpDosTask
);
MZ_InitXMS
(
lpDosTask
);
MZ_InitDPMI
(
lpDosTask
);
return
lpDosTask
->
hModule
;
return
TRUE
;
}
static
int
MZ_LoadImage
(
HFILE16
hFile
,
LPCSTR
name
,
LPCSTR
cmdline
,
LPCSTR
env
,
LPDOSTASK
lpDosTask
,
NE_MODULE
*
pModule
)
static
BOOL
MZ_LoadImage
(
HFILE
hFile
,
OFSTRUCT
*
ofs
,
LPCSTR
cmdline
,
LPCSTR
env
,
LPDOSTASK
lpDosTask
,
NE_MODULE
*
pModule
)
{
IMAGE_DOS_HEADER
mz_header
;
DWORD
image_start
,
image_size
,
min_size
,
max_size
,
avail
;
...
...
@@ -223,14 +224,12 @@ static int MZ_LoadImage( HFILE16 hFile, LPCSTR name, LPCSTR cmdline,
SEGPTR
reloc
;
WORD
env_seg
;
if
((
_hread16
(
hFile
,
&
mz_header
,
sizeof
(
mz_header
))
!=
sizeof
(
mz_header
))
||
_llseek
(
hFile
,
0
,
FILE_BEGIN
);
if
((
_lread
(
hFile
,
&
mz_header
,
sizeof
(
mz_header
))
!=
sizeof
(
mz_header
))
||
(
mz_header
.
e_magic
!=
IMAGE_DOS_SIGNATURE
))
{
#if 0
return 11; /* invalid exe */
#endif
old_com
=
1
;
/* assume .COM file */
image_start
=
0
;
image_size
=
GetFileSize
(
FILE_GetHandle
(
hFile
)
,
NULL
);
image_size
=
GetFileSize
(
hFile
,
NULL
);
min_size
=
0x10000
;
max_size
=
0x100000
;
mz_header
.
e_crlc
=
0
;
mz_header
.
e_ss
=
0
;
mz_header
.
e_sp
=
0xFFFE
;
...
...
@@ -248,20 +247,22 @@ static int MZ_LoadImage( HFILE16 hFile, LPCSTR name, LPCSTR cmdline,
MZ_InitMemory
(
lpDosTask
,
pModule
);
/* allocate environment block */
env_seg
=
MZ_InitEnvironment
(
lpDosTask
,
env
,
n
ame
);
env_seg
=
MZ_InitEnvironment
(
lpDosTask
,
env
,
ofs
->
szPathN
ame
);
/* allocate memory for the executable */
TRACE
(
module
,
"Allocating DOS memory (min=%ld, max=%ld)
\n
"
,
min_size
,
max_size
);
avail
=
DOSMEM_Available
(
lpDosTask
->
hModule
);
if
(
avail
<
min_size
)
{
ERR
(
module
,
"insufficient DOS memory
\n
"
);
return
0
;
SetLastError
(
ERROR_NOT_ENOUGH_MEMORY
);
return
FALSE
;
}
if
(
avail
>
max_size
)
avail
=
max_size
;
psp_start
=
DOSMEM_GetBlock
(
lpDosTask
->
hModule
,
avail
,
&
lpDosTask
->
psp_seg
);
if
(
!
psp_start
)
{
ERR
(
module
,
"error allocating DOS memory
\n
"
);
return
0
;
SetLastError
(
ERROR_NOT_ENOUGH_MEMORY
);
return
FALSE
;
}
lpDosTask
->
load_seg
=
lpDosTask
->
psp_seg
+
(
old_com
?
0
:
PSP_SIZE
);
load_start
=
psp_start
+
(
PSP_SIZE
<<
4
);
...
...
@@ -269,18 +270,22 @@ static int MZ_LoadImage( HFILE16 hFile, LPCSTR name, LPCSTR cmdline,
/* load executable image */
TRACE
(
module
,
"loading DOS %s image, %08lx bytes
\n
"
,
old_com
?
"COM"
:
"EXE"
,
image_size
);
_llseek16
(
hFile
,
image_start
,
FILE_BEGIN
);
if
((
_hread16
(
hFile
,
load_start
,
image_size
))
!=
image_size
)
return
11
;
/* invalid exe */
_llseek
(
hFile
,
image_start
,
FILE_BEGIN
);
if
((
_lread
(
hFile
,
load_start
,
image_size
))
!=
image_size
)
{
SetLastError
(
ERROR_BAD_FORMAT
);
return
FALSE
;
}
if
(
mz_header
.
e_crlc
)
{
/* load relocation table */
TRACE
(
module
,
"loading DOS EXE relocation table, %d entries
\n
"
,
mz_header
.
e_crlc
);
/* FIXME: is this too slow without read buffering? */
_llseek
16
(
hFile
,
mz_header
.
e_lfarlc
,
FILE_BEGIN
);
_llseek
(
hFile
,
mz_header
.
e_lfarlc
,
FILE_BEGIN
);
for
(
x
=
0
;
x
<
mz_header
.
e_crlc
;
x
++
)
{
if
(
_lread16
(
hFile
,
&
reloc
,
sizeof
(
reloc
))
!=
sizeof
(
reloc
))
return
11
;
/* invalid exe */
if
(
_lread
(
hFile
,
&
reloc
,
sizeof
(
reloc
))
!=
sizeof
(
reloc
))
{
SetLastError
(
ERROR_BAD_FORMAT
);
return
FALSE
;
}
*
(
WORD
*
)
SEGPTR16
(
load_start
,
reloc
)
+=
lpDosTask
->
load_seg
;
}
}
...
...
@@ -291,8 +296,7 @@ static int MZ_LoadImage( HFILE16 hFile, LPCSTR name, LPCSTR cmdline,
lpDosTask
->
init_sp
=
mz_header
.
e_sp
;
TRACE
(
module
,
"entry point: %04x:%04x
\n
"
,
lpDosTask
->
init_cs
,
lpDosTask
->
init_ip
);
return
lpDosTask
->
hModule
;
return
TRUE
;
}
LPDOSTASK
MZ_AllocDPMITask
(
HMODULE16
hModule
)
...
...
@@ -335,17 +339,17 @@ static void MZ_InitTimer( LPDOSTASK lpDosTask, int ver )
}
}
int
MZ_InitTask
(
LPDOSTASK
lpDosTask
)
BOOL
MZ_InitTask
(
LPDOSTASK
lpDosTask
)
{
int
read_fd
[
2
],
write_fd
[
2
];
pid_t
child
;
char
*
fname
,
*
farg
,
arg
[
16
],
fproc
[
64
],
path
[
256
],
*
fpath
;
if
(
!
lpDosTask
)
return
0
;
if
(
!
lpDosTask
)
return
FALSE
;
/* create read pipe */
if
(
pipe
(
read_fd
)
<
0
)
return
0
;
if
(
pipe
(
read_fd
)
<
0
)
return
FALSE
;
if
(
pipe
(
write_fd
)
<
0
)
{
close
(
read_fd
[
0
]);
close
(
read_fd
[
1
]);
return
0
;
close
(
read_fd
[
0
]);
close
(
read_fd
[
1
]);
return
FALSE
;
}
lpDosTask
->
read_pipe
=
read_fd
[
0
];
lpDosTask
->
write_pipe
=
write_fd
[
1
];
...
...
@@ -361,7 +365,7 @@ int MZ_InitTask( LPDOSTASK lpDosTask )
TRACE
(
module
,
"Loading DOS VM support module (hmodule=%04x)
\n
"
,
lpDosTask
->
hModule
);
if
((
child
=
fork
())
<
0
)
{
close
(
write_fd
[
0
]);
close
(
write_fd
[
1
]);
close
(
read_fd
[
0
]);
close
(
read_fd
[
1
]);
return
0
;
close
(
read_fd
[
0
]);
close
(
read_fd
[
1
]);
return
FALSE
;
}
if
(
child
!=
0
)
{
/* parent process */
...
...
@@ -376,7 +380,7 @@ int MZ_InitTask( LPDOSTASK lpDosTask )
/* failure */
ERR
(
module
,
"dosmod has failed to initialize
\n
"
);
if
(
lpDosTask
->
mm_name
[
0
]
!=
0
)
unlink
(
lpDosTask
->
mm_name
);
return
0
;
return
FALSE
;
}
}
while
(
0
);
/* the child has now mmaped the temp file, it's now safe to unlink.
...
...
@@ -408,35 +412,31 @@ int MZ_InitTask( LPDOSTASK lpDosTask )
ERR
(
module
,
"Failed to spawn dosmod, error=%s
\n
"
,
strerror
(
errno
));
exit
(
1
);
}
return
lpDosTask
->
hModule
;
return
TRUE
;
}
HINSTANCE16
MZ_CreateProcess
(
LPCSTR
name
,
LPCSTR
cmdline
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
)
BOOL
MZ_CreateProcess
(
HFILE
hFile
,
OFSTRUCT
*
ofs
,
LPCSTR
cmdline
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
)
{
LPDOSTASK
lpDosTask
=
NULL
;
/* keep gcc from complaining */
HMODULE16
hModule
;
HINSTANCE16
hInstance
;
PDB
*
pdb
=
PROCESS_Current
();
TDB
*
pTask
=
(
TDB
*
)
GlobalLock16
(
GetCurrentTask
()
);
NE_MODULE
*
pModule
=
pTask
?
NE_GetPtr
(
pTask
->
hModule
)
:
NULL
;
HFILE16
hFile
;
OFSTRUCT
ofs
;
int
err
,
alloc
=
!
(
pModule
&&
pModule
->
dos_image
);
int
alloc
=
!
(
pModule
&&
pModule
->
dos_image
);
GlobalUnlock16
(
GetCurrentTask
()
);
if
(
alloc
&&
(
lpDosTask
=
calloc
(
1
,
sizeof
(
DOSTASK
)))
==
NULL
)
return
0
;
if
((
hFile
=
OpenFile16
(
name
,
&
ofs
,
OF_READ
))
==
HFILE_ERROR16
)
return
2
;
/* File not found */
if
(
alloc
&&
(
lpDosTask
=
calloc
(
1
,
sizeof
(
DOSTASK
)))
==
NULL
)
{
SetLastError
(
ERROR_NOT_ENOUGH_MEMORY
);
return
FALSE
;
}
if
((
!
env
)
&&
pdb
)
env
=
pdb
->
env_db
->
environ
;
if
(
alloc
)
{
if
((
hModule
=
MODULE_CreateDummyModule
(
&
ofs
,
NULL
))
<
32
)
return
hModule
;
if
((
hModule
=
MODULE_CreateDummyModule
(
ofs
,
NULL
))
<
32
)
{
SetLastError
(
hModule
);
return
FALSE
;
}
lpDosTask
->
hModule
=
hModule
;
pModule
=
(
NE_MODULE
*
)
GlobalLock16
(
hModule
);
...
...
@@ -444,32 +444,29 @@ HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, BOOL inhe
lpDosTask
->
img
=
NULL
;
lpDosTask
->
mm_name
[
0
]
=
0
;
lpDosTask
->
mm_fd
=-
1
;
}
else
lpDosTask
=
pModule
->
lpDosTask
;
err
=
MZ_LoadImage
(
hFile
,
name
,
cmdline
,
env
,
lpDosTask
,
pModule
);
_lclose16
(
hFile
);
if
(
alloc
)
{
pModule
->
dos_image
=
lpDosTask
->
img
;
if
(
err
<
32
)
{
if
(
!
MZ_LoadImage
(
hFile
,
ofs
,
cmdline
,
env
,
lpDosTask
,
pModule
))
{
if
(
alloc
)
{
if
(
lpDosTask
->
mm_name
[
0
]
!=
0
)
{
if
(
lpDosTask
->
img
!=
NULL
)
munmap
(
lpDosTask
->
img
,
0x110000
-
START_OFFSET
);
if
(
lpDosTask
->
mm_fd
>=
0
)
close
(
lpDosTask
->
mm_fd
);
unlink
(
lpDosTask
->
mm_name
);
}
else
if
(
lpDosTask
->
img
!=
NULL
)
VirtualFree
(
lpDosTask
->
img
,
0x110000
,
MEM_RELEASE
);
return
err
;
}
err
=
MZ_InitTask
(
lpDosTask
);
if
(
err
<
32
)
{
return
FALSE
;
}
if
(
alloc
)
{
pModule
->
dos_image
=
lpDosTask
->
img
;
if
(
!
MZ_InitTask
(
lpDosTask
))
{
MZ_KillModule
(
lpDosTask
);
/* FIXME: cleanup hModule */
return
err
;
SetLastError
(
ERROR_GEN_FAILURE
);
return
FALSE
;
}
hInstance
=
NE_CreateInstance
(
pModule
,
NULL
,
(
cmdline
==
NULL
));
PROCESS_Create
(
pModule
,
cmdline
,
env
,
hInstance
,
0
,
inherit
,
startup
,
info
);
return
hInstance
;
}
else
{
return
(
err
<
32
)
?
err
:
pTask
->
hInstance
;
if
(
!
PROCESS_Create
(
pModule
,
cmdline
,
env
,
0
,
0
,
inherit
,
startup
,
info
))
return
FALSE
;
}
return
TRUE
;
}
void
MZ_KillModule
(
LPDOSTASK
lpDosTask
)
...
...
@@ -494,11 +491,13 @@ void MZ_KillModule( LPDOSTASK lpDosTask )
#else
/* !MZ_SUPPORTED */
HINSTANCE16
MZ_CreateProcess
(
LPCSTR
name
,
LPCSTR
cmdline
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
)
BOOL
MZ_CreateProcess
(
HFILE
hFile
,
OFSTRUCT
*
ofs
,
LPCSTR
cmdline
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
)
{
WARN
(
module
,
"DOS executables not supported on this architecture
\n
"
);
return
(
HMODULE16
)
11
;
/* invalid exe */
SetLastError
(
ERROR_BAD_FORMAT
);
return
FALSE
;
}
#endif
loader/main.c
View file @
f6a93619
...
...
@@ -267,7 +267,6 @@ HINSTANCE MAIN_WinelibInit( int *argc, char *argv[] )
NE_MODULE
*
pModule
;
OFSTRUCT
ofs
;
HMODULE16
hModule
;
HINSTANCE16
hInstance
;
/* Create the initial process */
if
(
!
PROCESS_Init
())
return
0
;
...
...
@@ -292,9 +291,7 @@ HINSTANCE MAIN_WinelibInit( int *argc, char *argv[] )
pModule
->
flags
=
NE_FFLAGS_WIN32
;
pModule
->
module32
=
wm
->
module
;
hInstance
=
NE_CreateInstance
(
pModule
,
NULL
,
TRUE
);
PROCESS_Current
()
->
task
=
TASK_Create
(
THREAD_Current
(),
pModule
,
hInstance
,
0
,
FALSE
);
if
(
!
TASK_Create
(
THREAD_Current
(),
pModule
,
0
,
0
,
FALSE
))
return
0
;
TASK_StartTask
(
PROCESS_Current
()
->
task
);
/* Initialize GDI and USER */
...
...
loader/pe_image.c
View file @
f6a93619
...
...
@@ -43,6 +43,7 @@
#include <sys/mman.h>
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "callback.h"
#include "file.h"
#include "heap.h"
...
...
@@ -452,10 +453,9 @@ static void do_relocations( unsigned int load_addr, IMAGE_BASE_RELOCATION *r )
* BUT we have to map the whole image anyway, for Win32 programs sometimes
* want to access them. (HMODULE32 point to the start of it)
*/
HMODULE
PE_LoadImage
(
LPCSTR
nam
e
,
OFSTRUCT
*
ofs
,
LPCSTR
*
modName
)
HMODULE
PE_LoadImage
(
HFILE
hFil
e
,
OFSTRUCT
*
ofs
,
LPCSTR
*
modName
)
{
HMODULE
hModule
;
HFILE
hFile
;
HANDLE
mapping
;
IMAGE_NT_HEADERS
*
nt
;
...
...
@@ -464,20 +464,6 @@ HMODULE PE_LoadImage( LPCSTR name, OFSTRUCT *ofs, LPCSTR *modName )
BY_HANDLE_FILE_INFORMATION
bhfi
;
int
i
,
rawsize
,
lowest_va
,
lowest_fa
,
vma_size
,
file_size
=
0
;
DWORD
load_addr
,
aoep
,
reloc
=
0
;
char
dllname
[
256
],
*
p
;
/* Append .DLL to name if no extension present */
strcpy
(
dllname
,
name
);
if
((
p
=
strrchr
(
dllname
,
'\\'
)))
p
++
;
else
p
=
dllname
;
if
(
!
strchr
(
p
,
'.'
))
strcat
(
dllname
,
".DLL"
);
/* Open PE file */
hFile
=
OpenFile
(
dllname
,
ofs
,
OF_READ
|
OF_SHARE_DENY_WRITE
);
if
(
hFile
==
HFILE_ERROR
)
{
WARN
(
win32
,
"OpenFile error %ld
\n
"
,
GetLastError
()
);
return
2
;
}
/* Retrieve file size */
if
(
GetFileInformationByHandle
(
hFile
,
&
bhfi
)
)
...
...
@@ -486,7 +472,6 @@ HMODULE PE_LoadImage( LPCSTR name, OFSTRUCT *ofs, LPCSTR *modName )
/* Map the PE file somewhere */
mapping
=
CreateFileMappingA
(
hFile
,
NULL
,
PAGE_READONLY
|
SEC_COMMIT
,
0
,
0
,
NULL
);
CloseHandle
(
hFile
);
if
(
!
mapping
)
{
WARN
(
win32
,
"CreateFileMapping error %ld
\n
"
,
GetLastError
()
);
...
...
@@ -810,26 +795,38 @@ HMODULE PE_LoadLibraryExA (LPCSTR name,
HMODULE16
hModule16
;
NE_MODULE
*
pModule
;
WINE_MODREF
*
wm
;
BOOL
builtin
;
BOOL
builtin
=
TRUE
;
char
dllname
[
256
],
*
p
;
/* Check for already loaded module */
if
((
hModule32
=
MODULE_FindModule
(
name
)))
return
hModule32
;
/* try to load builtin, enabled modules first */
if
((
hModule32
=
BUILTIN32_LoadImage
(
name
,
&
ofs
,
FALSE
)))
builtin
=
TRUE
;
/* try to load the specified dll/exe */
else
if
((
hModule32
=
PE_LoadImage
(
name
,
&
ofs
,
&
modName
))
>=
32
)
builtin
=
FALSE
;
/* Now try the built-in even if disabled */
else
if
((
hModule32
=
BUILTIN32_LoadImage
(
name
,
&
ofs
,
TRUE
)))
/* Append .DLL to name if no extension present */
strcpy
(
dllname
,
name
);
if
(
!
(
p
=
strrchr
(
dllname
,
'.'
))
||
strchr
(
p
,
'/'
)
||
strchr
(
p
,
'\\'
))
strcat
(
dllname
,
".DLL"
);
/* Try to load builtin enabled modules first */
if
(
!
(
hModule32
=
BUILTIN32_LoadImage
(
name
,
&
ofs
,
FALSE
))
)
{
WARN
(
module
,
"Could not load external DLL '%s', using built-in module.
\n
"
,
name
);
builtin
=
TRUE
;
/* Load PE module */
hFile
=
OpenFile
(
dllname
,
&
ofs
,
OF_READ
|
OF_SHARE_DENY_WRITE
);
if
(
hFile
!=
HFILE_ERROR
)
if
(
(
hModule32
=
PE_LoadImage
(
hFile
,
&
ofs
,
&
modName
))
>=
32
)
builtin
=
FALSE
;
CloseHandle
(
hFile
);
}
else
return
0
;
/* Now try the built-in even if disabled */
if
(
builtin
)
if
(
(
hModule32
=
BUILTIN32_LoadImage
(
name
,
&
ofs
,
TRUE
))
)
WARN
(
module
,
"Could not load external DLL '%s', using built-in module.
\n
"
,
name
);
else
return
0
;
/* Create 16-bit dummy module */
if
((
hModule16
=
MODULE_CreateDummyModule
(
&
ofs
,
modName
))
<
32
)
return
hModule16
;
...
...
@@ -853,45 +850,52 @@ HMODULE PE_LoadLibraryExA (LPCSTR name,
}
/*****************************************************************************
* Load the PE main .EXE. All other loading is done by PE_LoadLibraryEx
32
A
* FIXME: this function should use PE_LoadLibraryEx
32
A, but currently can't
* Load the PE main .EXE. All other loading is done by PE_LoadLibraryExA
* FIXME: this function should use PE_LoadLibraryExA, but currently can't
* due to the PROCESS_Create stuff.
*/
HINSTANCE16
PE_CreateProcess
(
LPCSTR
name
,
LPCSTR
cmd_line
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
)
BOOL
PE_CreateProcess
(
HFILE
hFile
,
OFSTRUCT
*
ofs
,
LPCSTR
cmd_line
,
LPCSTR
env
,
BOOL
inherit
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
)
{
LPCSTR
modName
=
NULL
;
HMODULE16
hModule16
;
HMODULE
hModule32
;
HINSTANCE16
hInstance
;
NE_MODULE
*
pModule
;
OFSTRUCT
ofs
;
PDB
*
process
;
/* Load file */
if
((
hModule32
=
PE_LoadImage
(
name
,
&
ofs
,
&
modName
))
<
32
)
return
hModule32
;
if
(
(
hModule32
=
PE_LoadImage
(
hFile
,
ofs
,
&
modName
))
<
32
)
{
SetLastError
(
hModule32
);
return
FALSE
;
}
#if 0
if (PE_HEADER(hModule32)->FileHeader.Characteristics & IMAGE_FILE_DLL)
return 20; /* FIXME: not the right error code */
{
SetLastError( 20 ); /* FIXME: not the right error code */
return FALSE;
}
#endif
/* Create 16-bit dummy module */
if
((
hModule16
=
MODULE_CreateDummyModule
(
&
ofs
,
modName
))
<
32
)
return
hModule16
;
if
(
(
hModule16
=
MODULE_CreateDummyModule
(
ofs
,
modName
))
<
32
)
{
SetLastError
(
hModule16
);
return
FALSE
;
}
pModule
=
(
NE_MODULE
*
)
GlobalLock16
(
hModule16
);
pModule
->
flags
=
NE_FFLAGS_WIN32
;
pModule
->
module32
=
hModule32
;
/* Create new process */
hInstance
=
NE_CreateInstance
(
pModule
,
NULL
,
FALSE
);
process
=
PROCESS_Create
(
pModule
,
cmd_line
,
env
,
hInstance
,
0
,
inherit
,
startup
,
info
)
;
if
(
!
PROCESS_Create
(
pModule
,
cmd_line
,
env
,
0
,
0
,
inherit
,
startup
,
info
)
)
return
FALSE
;
/* Note: PE_CreateModule and the remaining process initialization will
be done in the context of the new process, in TASK_CallToStart */
return
hInstance
;
return
TRUE
;
}
/*********************************************************************
...
...
miscemu/main.c
View file @
f6a93619
...
...
@@ -119,7 +119,6 @@ void MAIN_EmulatorRun( void )
int
main
(
int
argc
,
char
*
argv
[]
)
{
NE_MODULE
*
pModule
;
HINSTANCE16
hInstance
;
extern
char
*
DEBUG_argv0
;
__winelib
=
0
;
/* First of all, clear the Winelib flag */
...
...
@@ -166,8 +165,7 @@ int main( int argc, char *argv[] )
/* Create initial task */
if
(
!
(
pModule
=
NE_GetPtr
(
GetModuleHandle16
(
"KERNEL32"
)
))
)
return
1
;
hInstance
=
NE_CreateInstance
(
pModule
,
NULL
,
TRUE
);
PROCESS_Current
()
->
task
=
TASK_Create
(
THREAD_Current
(),
pModule
,
hInstance
,
0
,
FALSE
);
if
(
!
TASK_Create
(
THREAD_Current
(),
pModule
,
0
,
0
,
FALSE
)
)
return
1
;
/* Initialize CALL32 routines */
/* This needs to be done just before switching stacks */
...
...
msdos/dpmi.c
View file @
f6a93619
...
...
@@ -14,7 +14,8 @@
#include "miscemu.h"
#include "msdos.h"
#include "task.h"
#include "thread.h"
#include "thread.h"
/* for !MZ_SUPPORTED */
#include "stackframe.h"
/* for !MZ_SUPPORTED */
#include "toolhelp.h"
#include "selectors.h"
#include "process.h"
...
...
@@ -293,7 +294,7 @@ callrmproc_again:
if
(
!
(
CurrRMCB
||
pModule
->
lpDosTask
))
{
FIXME
(
int31
,
"DPMI real-mode call using DOS VM task system, not fully tested!
\n
"
);
TRACE
(
int31
,
"creating VM86 task
\n
"
);
if
(
MZ_InitTask
(
MZ_AllocDPMITask
(
pModule
->
self
)
)
<
32
)
{
if
(
!
MZ_InitTask
(
MZ_AllocDPMITask
(
pModule
->
self
)
)
)
{
ERR
(
int31
,
"could not setup VM86 task
\n
"
);
return
1
;
}
...
...
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