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
0106f85e
Commit
0106f85e
authored
Dec 08, 1999
by
Ulrich Weigand
Committed by
Alexandre Julliard
Dec 08, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Delay sending debug events until process initialization is complete.
parent
3393730f
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
72 additions
and
28 deletions
+72
-28
module.h
include/module.h
+2
-0
module.c
loader/module.c
+34
-9
process.c
scheduler/process.c
+36
-19
No files found.
include/module.h
View file @
0106f85e
...
...
@@ -157,6 +157,7 @@ typedef struct _wine_modref
#define WINE_MODREF_PROCESS_ATTACHED 0x00000004
#define WINE_MODREF_LOAD_AS_DATAFILE 0x00000010
#define WINE_MODREF_DONT_RESOLVE_REFS 0x00000020
#define WINE_MODREF_DEBUG_EVENT_SENT 0x00000040
#define WINE_MODREF_MARKER 0x80000000
...
...
@@ -181,6 +182,7 @@ extern BOOL MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved );
extern
void
MODULE_DllProcessDetach
(
BOOL
bForceDetach
,
LPVOID
lpReserved
);
extern
void
MODULE_DllThreadAttach
(
LPVOID
lpReserved
);
extern
void
MODULE_DllThreadDetach
(
LPVOID
lpReserved
);
extern
void
MODULE_SendLoadDLLEvents
(
void
);
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
);
...
...
loader/module.c
View file @
0106f85e
...
...
@@ -327,6 +327,29 @@ BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule )
return
retval
;
}
/*************************************************************************
* MODULE_SendLoadDLLEvents
*
* Sends DEBUG_DLL_LOAD events for all outstanding modules.
*
* NOTE: Assumes that the process critical section is held!
*
*/
void
MODULE_SendLoadDLLEvents
(
void
)
{
WINE_MODREF
*
wm
;
for
(
wm
=
PROCESS_Current
()
->
modref_list
;
wm
;
wm
=
wm
->
next
)
{
if
(
wm
->
type
!=
MODULE32_PE
)
continue
;
if
(
wm
==
PROCESS_Current
()
->
exe_modref
)
continue
;
if
(
wm
->
flags
&
WINE_MODREF_DEBUG_EVENT_SENT
)
continue
;
DEBUG_SendLoadDLLEvent
(
-
1
/*FIXME*/
,
wm
->
module
,
&
wm
->
modname
);
wm
->
flags
|=
WINE_MODREF_DEBUG_EVENT_SENT
;
}
}
/***********************************************************************
* MODULE_CreateDummyModule
...
...
@@ -1321,13 +1344,18 @@ HMODULE WINAPI LoadLibraryExA(LPCSTR libname, HANDLE hfile, DWORD flags)
EnterCriticalSection
(
&
PROCESS_Current
()
->
crit_section
);
wm
=
MODULE_LoadLibraryExA
(
libname
,
hfile
,
flags
);
if
(
wm
&&
!
MODULE_DllProcessAttach
(
wm
,
NULL
))
if
(
wm
)
{
WARN_
(
module
)(
"Attach failed for module '%s',
\n
"
,
libname
);
MODULE_FreeLibrary
(
wm
);
SetLastError
(
ERROR_DLL_INIT_FAILED
);
wm
=
NULL
;
if
(
PROCESS_Current
()
->
flags
&
PDB32_DEBUGGED
)
MODULE_SendLoadDLLEvents
();
if
(
!
MODULE_DllProcessAttach
(
wm
,
NULL
)
)
{
WARN_
(
module
)(
"Attach failed for module '%s',
\n
"
,
libname
);
MODULE_FreeLibrary
(
wm
);
SetLastError
(
ERROR_DLL_INIT_FAILED
);
wm
=
NULL
;
}
}
LeaveCriticalSection
(
&
PROCESS_Current
()
->
crit_section
);
...
...
@@ -1411,9 +1439,6 @@ WINE_MODREF *MODULE_LoadLibraryExA( LPCSTR libname, HFILE hfile, DWORD flags )
LeaveCriticalSection
(
&
PROCESS_Current
()
->
crit_section
);
if
(
PROCESS_Current
()
->
flags
&
PDB32_DEBUGGED
)
DEBUG_SendLoadDLLEvent
(
-
1
/*FIXME*/
,
pwm
->
module
,
&
pwm
->
modname
);
return
pwm
;
}
...
...
scheduler/process.c
View file @
0106f85e
...
...
@@ -409,10 +409,33 @@ void PROCESS_Start(void)
if
(
!
TASK_Create
(
pModule
,
cmdShow
))
goto
error
;
/* Perform Win16 specific process initialization */
if
(
type
==
PROC_WIN16
)
/* Load all process modules */
switch
(
type
)
{
case
PROC_WIN16
:
if
(
!
NE_InitProcess
(
pModule
)
)
goto
error
;
break
;
case
PROC_WIN32
:
/* Create 32-bit MODREF */
if
(
!
PE_CreateModule
(
pModule
->
module32
,
filename
,
0
,
FALSE
)
)
goto
error
;
/* Increment EXE refcount */
assert
(
pdb
->
exe_modref
);
pdb
->
exe_modref
->
refCount
++
;
/* Retrieve entry point address */
entry
=
(
LPTHREAD_START_ROUTINE
)
RVA_PTR
(
pModule
->
module32
,
OptionalHeader
.
AddressOfEntryPoint
);
break
;
case
PROC_DOS
:
/* FIXME: move DOS startup code here */
break
;
}
/* Note: The USIG_PROCESS_CREATE signal is supposed to be sent in the
* context of the parent process. Actually, the USER signal proc
...
...
@@ -426,39 +449,33 @@ void PROCESS_Start(void)
PROCESS_CallUserSignalProc
(
USIG_PROCESS_CREATE
,
0
,
0
);
PROCESS_CallUserSignalProc
(
USIG_THREAD_INIT
,
GetCurrentThreadId
(),
0
);
PROCESS_CallUserSignalProc
(
USIG_PROCESS_INIT
,
0
,
0
);
PROCESS_CallUserSignalProc
(
USIG_PROCESS_LOADED
,
0
,
0
);
/* Signal the parent process to continue */
server_call
(
REQ_INIT_PROCESS_DONE
);
/*
Perform Win32 specific process initialization
*/
if
(
type
==
PROC_WIN32
)
/*
Send all required start-up debugger events
*/
if
(
type
==
PROC_WIN32
&&
(
pdb
->
flags
&
PDB32_DEBUGGED
)
)
{
/* Send the debug event to the debugger */
entry
=
(
LPTHREAD_START_ROUTINE
)
RVA_PTR
(
pModule
->
module32
,
OptionalHeader
.
AddressOfEntryPoint
);
if
(
pdb
->
flags
&
PDB32_DEBUGGED
)
DEBUG_SendCreateProcessEvent
(
-
1
/*FIXME*/
,
pModule
->
module32
,
entry
);
/* Create 32-bit MODREF */
if
(
!
PE_CreateModule
(
pModule
->
module32
,
filename
,
0
,
FALSE
))
goto
error
;
EnterCriticalSection
(
&
pdb
->
crit_section
);
/* Increment EXE refcount */
assert
(
pdb
->
exe_modref
);
pdb
->
exe_modref
->
refCount
++
;
DEBUG_SendCreateProcessEvent
(
-
1
/*FIXME*/
,
pModule
->
module32
,
entry
);
MODULE_SendLoadDLLEvents
();
/* Initialize thread-local storage */
PE_InitTls
();
LeaveCriticalSection
(
&
pdb
->
crit_section
);
}
PROCESS_CallUserSignalProc
(
USIG_PROCESS_LOADED
,
0
,
0
);
/* FIXME: correct location? */
if
(
(
pdb
->
flags
&
PDB32_CONSOLE_PROC
)
||
(
pdb
->
flags
&
PDB32_DOS_PROC
)
)
AllocConsole
();
/* Perform Win32 specific process initialization */
if
(
type
==
PROC_WIN32
)
{
EnterCriticalSection
(
&
pdb
->
crit_section
);
PE_InitTls
();
MODULE_DllProcessAttach
(
pdb
->
exe_modref
,
(
LPVOID
)
1
);
LeaveCriticalSection
(
&
pdb
->
crit_section
);
}
...
...
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