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
8ff37b8f
Commit
8ff37b8f
authored
Jun 06, 2001
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Set low-order bit of module handle for LOAD_LIBRARY_AS_DATAFILE.
Cleaned up a few HMODULE/HMODULE16 mismatches.
parent
a3b562f7
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
71 additions
and
48 deletions
+71
-48
module.h
include/module.h
+2
-2
module.c
loader/module.c
+34
-24
pe_resource.c
loader/pe_resource.c
+28
-9
process.c
scheduler/process.c
+7
-13
No files found.
include/module.h
View file @
8ff37b8f
...
...
@@ -171,7 +171,7 @@ extern void MODULE_DllThreadDetach( LPVOID lpReserved );
extern
WINE_MODREF
*
MODULE_LoadLibraryExA
(
LPCSTR
libname
,
HFILE
hfile
,
DWORD
flags
);
extern
BOOL
MODULE_FreeLibrary
(
WINE_MODREF
*
wm
);
extern
WINE_MODREF
*
MODULE_FindModule
(
LPCSTR
path
);
extern
HMODULE
MODULE_CreateDummyModule
(
LPCSTR
filename
,
HMODULE
module32
);
extern
HMODULE
16
MODULE_CreateDummyModule
(
LPCSTR
filename
,
HMODULE
module32
);
extern
FARPROC16
WINAPI
WIN32_GetProcAddress16
(
HMODULE
hmodule
,
LPCSTR
name
);
extern
SEGPTR
WINAPI
HasGPHandler16
(
SEGPTR
address
);
extern
void
MODULE_WalkModref
(
DWORD
id
);
...
...
@@ -255,7 +255,7 @@ extern int BUILTIN32_dlclose( void *handle );
#define USIG_PROCESS_LOADED 0x0600
/* scheduler/process.c */
extern
void
PROCESS_CallUserSignalProc
(
UINT
uCode
,
HMODULE
hModule
);
extern
void
PROCESS_CallUserSignalProc
(
UINT
uCode
,
HMODULE
16
hModule
);
extern
BOOL
PROCESS_Create
(
HANDLE
hFile
,
LPCSTR
filename
,
LPSTR
cmd_line
,
LPCSTR
env
,
LPSECURITY_ATTRIBUTES
psa
,
LPSECURITY_ATTRIBUTES
tsa
,
BOOL
inherit
,
DWORD
flags
,
...
...
loader/module.c
View file @
8ff37b8f
...
...
@@ -334,9 +334,9 @@ BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule )
*
* Create a dummy NE module for Win32 or Winelib.
*/
HMODULE
MODULE_CreateDummyModule
(
LPCSTR
filename
,
HMODULE
module32
)
HMODULE
16
MODULE_CreateDummyModule
(
LPCSTR
filename
,
HMODULE
module32
)
{
HMODULE
hModule
;
HMODULE
16
hModule
;
NE_MODULE
*
pModule
;
SEGTABLEENTRY
*
pSegment
;
char
*
pStr
,
*
s
;
...
...
@@ -366,7 +366,7 @@ HMODULE MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 )
8
;
hModule
=
GlobalAlloc16
(
GMEM_MOVEABLE
|
GMEM_ZEROINIT
,
size
);
if
(
!
hModule
)
return
(
HMODULE
)
11
;
/* invalid exe */
if
(
!
hModule
)
return
(
HMODULE
16
)
11
;
/* invalid exe */
FarSetOwner16
(
hModule
,
hModule
);
pModule
=
(
NE_MODULE
*
)
GlobalLock16
(
hModule
);
...
...
@@ -819,7 +819,7 @@ HINSTANCE16 WINAPI WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow )
{
DWORD
count
;
ReleaseThunkLock
(
&
count
);
ret
=
WinExec
(
lpCmdLine
,
nCmdShow
);
ret
=
LOWORD
(
WinExec
(
lpCmdLine
,
nCmdShow
)
);
RestoreThunkLock
(
count
);
}
return
ret
;
...
...
@@ -850,15 +850,15 @@ HINSTANCE WINAPI WinExec( LPCSTR lpCmdLine, UINT nCmdShow )
if
(
Callout
.
WaitForInputIdle
&&
Callout
.
WaitForInputIdle
(
info
.
hProcess
,
30000
)
==
0xFFFFFFFF
)
WARN
(
"WaitForInputIdle failed: Error %ld
\n
"
,
GetLastError
()
);
hInstance
=
33
;
hInstance
=
(
HINSTANCE
)
33
;
/* Close off the handles */
CloseHandle
(
info
.
hThread
);
CloseHandle
(
info
.
hProcess
);
}
else
if
((
hInstance
=
GetLastError
())
>=
32
)
else
if
((
hInstance
=
(
HINSTANCE
)
GetLastError
())
>=
(
HINSTANCE
)
32
)
{
FIXME
(
"Strange error set by CreateProcess: %d
\n
"
,
hInstance
);
hInstance
=
11
;
hInstance
=
(
HINSTANCE
)
11
;
}
HeapFree
(
GetProcessHeap
(),
0
,
cmdline
);
return
hInstance
;
...
...
@@ -877,15 +877,15 @@ HINSTANCE WINAPI LoadModule( LPCSTR name, LPVOID paramBlock )
char
filename
[
MAX_PATH
];
BYTE
len
;
if
(
!
name
)
return
ERROR_FILE_NOT_FOUND
;
if
(
!
name
)
return
(
HINSTANCE
)
ERROR_FILE_NOT_FOUND
;
if
(
!
SearchPathA
(
NULL
,
name
,
".exe"
,
sizeof
(
filename
),
filename
,
NULL
)
&&
!
SearchPathA
(
NULL
,
name
,
NULL
,
sizeof
(
filename
),
filename
,
NULL
))
return
GetLastError
();
return
(
HINSTANCE
)
GetLastError
();
len
=
(
BYTE
)
params
->
lpCmdLine
[
0
];
if
(
!
(
cmdline
=
HeapAlloc
(
GetProcessHeap
(),
0
,
strlen
(
filename
)
+
len
+
2
)))
return
ERROR_NOT_ENOUGH_MEMORY
;
return
(
HINSTANCE
)
ERROR_NOT_ENOUGH_MEMORY
;
strcpy
(
cmdline
,
filename
);
p
=
cmdline
+
strlen
(
cmdline
);
...
...
@@ -908,15 +908,15 @@ HINSTANCE WINAPI LoadModule( LPCSTR name, LPVOID paramBlock )
if
(
Callout
.
WaitForInputIdle
&&
Callout
.
WaitForInputIdle
(
info
.
hProcess
,
30000
)
==
0xFFFFFFFF
)
WARN
(
"WaitForInputIdle failed: Error %ld
\n
"
,
GetLastError
()
);
hInstance
=
33
;
hInstance
=
(
HINSTANCE
)
33
;
/* Close off the handles */
CloseHandle
(
info
.
hThread
);
CloseHandle
(
info
.
hProcess
);
}
else
if
((
hInstance
=
GetLastError
())
>=
32
)
else
if
((
hInstance
=
(
HINSTANCE
)
GetLastError
())
>=
(
HINSTANCE
)
32
)
{
FIXME
(
"Strange error set by CreateProcess: %d
\n
"
,
hInstance
);
hInstance
=
11
;
hInstance
=
(
HINSTANCE
)
11
;
}
HeapFree
(
GetProcessHeap
(),
0
,
cmdline
);
...
...
@@ -1268,7 +1268,7 @@ HMODULE WINAPI LoadLibraryExA(LPCSTR libname, HANDLE hfile, DWORD flags)
hmod
=
PE_LoadImage
(
hFile
,
filename
,
flags
);
CloseHandle
(
hFile
);
}
if
(
hmod
)
return
hmod
;
if
(
hmod
)
return
(
HMODULE
)((
ULONG_PTR
)
hmod
+
1
)
;
}
flags
|=
DONT_RESOLVE_DLL_REFERENCES
;
/* Just in case */
/* Fallback to normal behaviour */
...
...
@@ -1537,14 +1537,24 @@ BOOL WINAPI FreeLibrary(HINSTANCE hLibModule)
BOOL
retv
=
FALSE
;
WINE_MODREF
*
wm
;
if
(
!
hLibModule
)
{
SetLastError
(
ERROR_INVALID_HANDLE
);
return
FALSE
;
}
if
((
ULONG_PTR
)
hLibModule
&
1
)
{
/* this is a LOAD_LIBRARY_AS_DATAFILE module */
char
*
ptr
=
(
char
*
)
hLibModule
-
1
;
UnmapViewOfFile
(
ptr
);
return
TRUE
;
}
RtlAcquirePebLock
();
free_lib_count
++
;
wm
=
MODULE32_LookupHMODULE
(
hLibModule
);
if
(
!
wm
||
!
hLibModule
)
SetLastError
(
ERROR_INVALID_HANDLE
);
else
retv
=
MODULE_FreeLibrary
(
wm
);
if
((
wm
=
MODULE32_LookupHMODULE
(
hLibModule
)))
retv
=
MODULE_FreeLibrary
(
wm
);
free_lib_count
--
;
RtlReleasePebLock
();
...
...
@@ -1627,9 +1637,9 @@ VOID WINAPI FreeLibraryAndExitThread(HINSTANCE hLibModule, DWORD dwExitCode)
*
* FIXME: rough guesswork, don't know what "Private" means
*/
HINSTANCE
WINAPI
PrivateLoadLibrary
(
LPCSTR
libname
)
HINSTANCE
16
WINAPI
PrivateLoadLibrary
(
LPCSTR
libname
)
{
return
(
HINSTANCE
)
LoadLibrary16
(
libname
);
return
LoadLibrary16
(
libname
);
}
...
...
@@ -1639,9 +1649,9 @@ HINSTANCE WINAPI PrivateLoadLibrary(LPCSTR libname)
*
* FIXME: rough guesswork, don't know what "Private" means
*/
void
WINAPI
PrivateFreeLibrary
(
HINSTANCE
handle
)
void
WINAPI
PrivateFreeLibrary
(
HINSTANCE
16
handle
)
{
FreeLibrary16
((
HINSTANCE16
)
handle
);
FreeLibrary16
(
handle
);
}
...
...
@@ -1660,7 +1670,7 @@ FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hModule, LPCSTR name )
WARN
(
"hModule is Win32 handle (%08x)
\n
"
,
hModule
);
return
(
FARPROC16
)
0
;
}
return
GetProcAddress16
(
hModule
,
name
);
return
GetProcAddress16
(
LOWORD
(
hModule
)
,
name
);
}
/***********************************************************************
...
...
loader/pe_resource.c
View file @
8ff37b8f
...
...
@@ -26,6 +26,27 @@
DEFAULT_DEBUG_CHANNEL
(
resource
);
/**********************************************************************
* get_module_base
*
* Get the base address of a module
*/
static
const
void
*
get_module_base
(
HMODULE
hmod
)
{
if
(
!
hmod
)
hmod
=
GetModuleHandleA
(
NULL
);
else
if
(
!
HIWORD
(
hmod
))
{
FIXME
(
"Enumeration of 16-bit resources is not supported
\n
"
);
SetLastError
(
ERROR_INVALID_HANDLE
);
return
NULL
;
}
/* clear low order bit in case of LOAD_LIBRARY_AS_DATAFILE module */
return
(
void
*
)((
ULONG_PTR
)
hmod
&
~
1
);
}
/**********************************************************************
* get_resdir
*
...
...
@@ -35,17 +56,14 @@ static const IMAGE_RESOURCE_DIRECTORY* get_resdir( HMODULE hmod )
{
const
IMAGE_DATA_DIRECTORY
*
dir
;
const
IMAGE_RESOURCE_DIRECTORY
*
ret
=
NULL
;
const
void
*
base
=
get_module_base
(
hmod
);
if
(
!
hmod
)
hmod
=
GetModuleHandleA
(
NULL
);
else
if
(
!
HIWORD
(
hmod
))
if
(
base
)
{
FIXME
(
"Enumeration of 16-bit resources is not supported
\n
"
)
;
SetLastError
(
ERROR_INVALID_HANDLE
);
return
NULL
;
dir
=
&
PE_HEADER
(
base
)
->
OptionalHeader
.
DataDirectory
[
IMAGE_DIRECTORY_ENTRY_RESOURCE
]
;
if
(
dir
->
Size
&&
dir
->
VirtualAddress
)
ret
=
(
IMAGE_RESOURCE_DIRECTORY
*
)((
char
*
)
base
+
dir
->
VirtualAddress
)
;
}
dir
=
&
PE_HEADER
(
hmod
)
->
OptionalHeader
.
DataDirectory
[
IMAGE_DIRECTORY_ENTRY_RESOURCE
];
if
(
dir
->
Size
&&
dir
->
VirtualAddress
)
ret
=
(
IMAGE_RESOURCE_DIRECTORY
*
)((
char
*
)
hmod
+
dir
->
VirtualAddress
);
return
ret
;
}
...
...
@@ -254,8 +272,9 @@ HRSRC PE_FindResourceW( HMODULE hmod, LPCWSTR name, LPCWSTR type )
*/
HGLOBAL
PE_LoadResource
(
HMODULE
hmod
,
HRSRC
hRsrc
)
{
const
void
*
base
=
get_module_base
(
hmod
);
if
(
!
hRsrc
)
return
0
;
return
(
HANDLE
)(
hmod
+
((
PIMAGE_RESOURCE_DATA_ENTRY
)
hRsrc
)
->
OffsetToData
);
return
(
HANDLE
)(
(
char
*
)
base
+
((
PIMAGE_RESOURCE_DATA_ENTRY
)
hRsrc
)
->
OffsetToData
);
}
...
...
scheduler/process.c
View file @
8ff37b8f
...
...
@@ -180,12 +180,14 @@ extern BOOL MAIN_MainInit(void);
* USIG_FLAGS_FAULT
* The signal is being sent due to a fault.
*/
void
PROCESS_CallUserSignalProc
(
UINT
uCode
,
HMODULE
hModule
)
void
PROCESS_CallUserSignalProc
(
UINT
uCode
,
HMODULE
16
hModule
)
{
DWORD
flags
=
current_process
.
flags
;
DWORD
startup_flags
=
current_startupinfo
.
dwFlags
;
DWORD
dwFlags
=
0
;
if
(
!
Callout
.
UserSignalProc
)
return
;
/* Determine dwFlags */
if
(
!
(
flags
&
PDB32_WIN16_PROC
)
)
dwFlags
|=
USIG_FLAGS_WIN32
;
...
...
@@ -205,20 +207,12 @@ void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule )
dwFlags
|=
USIG_FLAGS_FEEDBACK
;
}
/* Convert module handle to 16-bit */
if
(
HIWORD
(
hModule
)
)
hModule
=
MapHModuleLS
(
hModule
);
/* Call USER signal proc */
if
(
Callout
.
UserSignalProc
)
{
if
(
uCode
==
USIG_THREAD_INIT
||
uCode
==
USIG_THREAD_EXIT
)
Callout
.
UserSignalProc
(
uCode
,
GetCurrentThreadId
(),
dwFlags
,
hModule
);
else
Callout
.
UserSignalProc
(
uCode
,
GetCurrentProcessId
(),
dwFlags
,
hModule
);
}
if
(
uCode
==
USIG_THREAD_INIT
||
uCode
==
USIG_THREAD_EXIT
)
Callout
.
UserSignalProc
(
uCode
,
GetCurrentThreadId
(),
dwFlags
,
hModule
);
else
Callout
.
UserSignalProc
(
uCode
,
GetCurrentProcessId
(),
dwFlags
,
hModule
);
}
...
...
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