mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-02 12:03:45 +00:00
Call 16-bit instead of 32-bit UserSignalProc entry point.
Don't load USER32.DLL unless requested by the program. Bugfix: Pass the correct thread ID to UserSignalProc.
This commit is contained in:
parent
cd841a4a86
commit
979000e038
5 changed files with 21 additions and 37 deletions
|
@ -41,6 +41,7 @@ extern LONG CALLBACK THUNK_CallTo16_long_ll (FARPROC16,LONG,LONG);
|
||||||
extern WORD CALLBACK THUNK_CallTo16_word_www (FARPROC16,WORD,WORD,WORD);
|
extern WORD CALLBACK THUNK_CallTo16_word_www (FARPROC16,WORD,WORD,WORD);
|
||||||
extern WORD CALLBACK THUNK_CallTo16_word_wwl (FARPROC16,WORD,WORD,LONG);
|
extern WORD CALLBACK THUNK_CallTo16_word_wwl (FARPROC16,WORD,WORD,LONG);
|
||||||
extern WORD CALLBACK THUNK_CallTo16_word_wlw (FARPROC16,WORD,LONG,WORD);
|
extern WORD CALLBACK THUNK_CallTo16_word_wlw (FARPROC16,WORD,LONG,WORD);
|
||||||
|
extern WORD CALLBACK THUNK_CallTo16_word_lllw (FARPROC16,LONG,LONG,LONG,WORD);
|
||||||
extern WORD CALLBACK THUNK_CallTo16_word_llwl (FARPROC16,LONG,LONG,WORD,LONG);
|
extern WORD CALLBACK THUNK_CallTo16_word_llwl (FARPROC16,LONG,LONG,WORD,LONG);
|
||||||
extern WORD CALLBACK THUNK_CallTo16_word_lwww (FARPROC16,LONG,WORD,WORD,WORD);
|
extern WORD CALLBACK THUNK_CallTo16_word_lwww (FARPROC16,LONG,WORD,WORD,WORD);
|
||||||
extern WORD CALLBACK THUNK_CallTo16_word_wlww (FARPROC16,WORD,LONG,WORD,WORD);
|
extern WORD CALLBACK THUNK_CallTo16_word_wlww (FARPROC16,WORD,LONG,WORD,WORD);
|
||||||
|
@ -374,7 +375,6 @@ void THUNK_InitCallout(void)
|
||||||
GETADDR( DispatchMessageW, "DispatchMessageW" );
|
GETADDR( DispatchMessageW, "DispatchMessageW" );
|
||||||
GETADDR( DispatchMessageA, "DispatchMessageA" );
|
GETADDR( DispatchMessageA, "DispatchMessageA" );
|
||||||
GETADDR( RedrawWindow, "RedrawWindow" );
|
GETADDR( RedrawWindow, "RedrawWindow" );
|
||||||
GETADDR( UserSignalProc, "UserSignalProc" );
|
|
||||||
|
|
||||||
#undef GETADDR
|
#undef GETADDR
|
||||||
}
|
}
|
||||||
|
@ -399,6 +399,7 @@ void THUNK_InitCallout(void)
|
||||||
GETADDR( InitThreadInput16, "InitThreadInput", word_ww );
|
GETADDR( InitThreadInput16, "InitThreadInput", word_ww );
|
||||||
GETADDR( UserYield16, "UserYield", word_ );
|
GETADDR( UserYield16, "UserYield", word_ );
|
||||||
GETADDR( DestroyIcon32, "DestroyIcon32", word_ww );
|
GETADDR( DestroyIcon32, "DestroyIcon32", word_ww );
|
||||||
|
GETADDR( UserSignalProc, "SignalProc32", word_lllw );
|
||||||
|
|
||||||
#undef GETADDR
|
#undef GETADDR
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,7 +156,7 @@ extern BOOL PROCESS_Init( void );
|
||||||
extern BOOL PROCESS_IsCurrent( HANDLE handle );
|
extern BOOL PROCESS_IsCurrent( HANDLE handle );
|
||||||
extern PDB *PROCESS_Initial(void);
|
extern PDB *PROCESS_Initial(void);
|
||||||
extern PDB *PROCESS_IdToPDB( DWORD id );
|
extern PDB *PROCESS_IdToPDB( DWORD id );
|
||||||
extern void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule );
|
extern void PROCESS_CallUserSignalProc( UINT uCode, DWORD dwThreadId, HMODULE hModule );
|
||||||
extern PDB *PROCESS_Create( struct _NE_MODULE *pModule,
|
extern PDB *PROCESS_Create( struct _NE_MODULE *pModule,
|
||||||
LPCSTR cmd_line, LPCSTR env,
|
LPCSTR cmd_line, LPCSTR env,
|
||||||
LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa,
|
LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa,
|
||||||
|
|
|
@ -462,9 +462,9 @@ void TASK_KillTask( HTASK16 hTask )
|
||||||
/* Perform USER cleanup */
|
/* Perform USER cleanup */
|
||||||
|
|
||||||
TASK_CallTaskSignalProc( USIG16_TERMINATION, hTask );
|
TASK_CallTaskSignalProc( USIG16_TERMINATION, hTask );
|
||||||
PROCESS_CallUserSignalProc( USIG_PROCESS_EXIT, 0 );
|
PROCESS_CallUserSignalProc( USIG_PROCESS_EXIT, 0, 0 );
|
||||||
PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, 0 ); /* FIXME */
|
PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, GetCurrentThreadId(), 0 );
|
||||||
PROCESS_CallUserSignalProc( USIG_PROCESS_DESTROY, 0 );
|
PROCESS_CallUserSignalProc( USIG_PROCESS_DESTROY, 0, 0 );
|
||||||
|
|
||||||
if (nTaskCount <= 1)
|
if (nTaskCount <= 1)
|
||||||
{
|
{
|
||||||
|
@ -716,6 +716,7 @@ void WINAPI InitTask16( CONTEXT86 *context )
|
||||||
|
|
||||||
/* Initialize implicitly loaded DLLs */
|
/* Initialize implicitly loaded DLLs */
|
||||||
NE_InitializeDLLs( pTask->hModule );
|
NE_InitializeDLLs( pTask->hModule );
|
||||||
|
NE_DllProcessAttach( pTask->hModule );
|
||||||
|
|
||||||
/* Registers on return are:
|
/* Registers on return are:
|
||||||
* ax 1 if OK, 0 on error
|
* ax 1 if OK, 0 on error
|
||||||
|
|
|
@ -185,9 +185,10 @@ PDB *PROCESS_IdToPDB( DWORD id )
|
||||||
* USIG_FLAGS_FAULT
|
* USIG_FLAGS_FAULT
|
||||||
* The signal is being sent due to a fault.
|
* The signal is being sent due to a fault.
|
||||||
*/
|
*/
|
||||||
static void PROCESS_CallUserSignalProcHelper( UINT uCode, DWORD dwThreadOrProcessId,
|
void PROCESS_CallUserSignalProc( UINT uCode, DWORD dwThreadId, HMODULE hModule )
|
||||||
HMODULE hModule, DWORD flags, DWORD startup_flags )
|
|
||||||
{
|
{
|
||||||
|
DWORD flags = PROCESS_Current()->flags;
|
||||||
|
DWORD startup_flags = PROCESS_Current()->env_db->startup_info->dwFlags;
|
||||||
DWORD dwFlags = 0;
|
DWORD dwFlags = 0;
|
||||||
|
|
||||||
/* Determine dwFlags */
|
/* Determine dwFlags */
|
||||||
|
@ -217,26 +218,12 @@ static void PROCESS_CallUserSignalProcHelper( UINT uCode, DWORD dwThreadOrProces
|
||||||
/* Call USER signal proc */
|
/* Call USER signal proc */
|
||||||
|
|
||||||
if ( Callout.UserSignalProc )
|
if ( Callout.UserSignalProc )
|
||||||
Callout.UserSignalProc( uCode, dwThreadOrProcessId, dwFlags, hModule );
|
if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT )
|
||||||
|
Callout.UserSignalProc( uCode, dwThreadId, dwFlags, hModule );
|
||||||
|
else
|
||||||
|
Callout.UserSignalProc( uCode, GetCurrentProcessId(), dwFlags, hModule );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call USER signal proc for the current thread/process */
|
|
||||||
void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule )
|
|
||||||
{
|
|
||||||
DWORD dwThreadOrProcessId;
|
|
||||||
|
|
||||||
/* Get thread or process ID */
|
|
||||||
if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT )
|
|
||||||
dwThreadOrProcessId = GetCurrentThreadId();
|
|
||||||
else
|
|
||||||
dwThreadOrProcessId = GetCurrentProcessId();
|
|
||||||
|
|
||||||
PROCESS_CallUserSignalProcHelper( uCode, dwThreadOrProcessId, hModule,
|
|
||||||
PROCESS_Current()->flags,
|
|
||||||
PROCESS_Current()->env_db->startup_info->dwFlags );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* PROCESS_CreateEnvDB
|
* PROCESS_CreateEnvDB
|
||||||
*
|
*
|
||||||
|
@ -436,14 +423,9 @@ void PROCESS_Start(void)
|
||||||
* in the case of a 16-bit process. Thus, we send the signal here.
|
* in the case of a 16-bit process. Thus, we send the signal here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Load USER32.DLL before calling UserSignalProc (relay debugging!) */
|
PROCESS_CallUserSignalProc( USIG_PROCESS_CREATE, 0, 0 );
|
||||||
LoadLibraryA( "USER32.DLL" );
|
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, GetCurrentThreadId(), 0 );
|
||||||
|
PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0, 0 );
|
||||||
PROCESS_CallUserSignalProc( USIG_PROCESS_CREATE, 0 );
|
|
||||||
|
|
||||||
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0 ); /* for initial thread */
|
|
||||||
|
|
||||||
PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0 );
|
|
||||||
|
|
||||||
/* Signal the parent process to continue */
|
/* Signal the parent process to continue */
|
||||||
server_call( REQ_INIT_PROCESS_DONE );
|
server_call( REQ_INIT_PROCESS_DONE );
|
||||||
|
@ -468,7 +450,7 @@ void PROCESS_Start(void)
|
||||||
PE_InitTls();
|
PE_InitTls();
|
||||||
}
|
}
|
||||||
|
|
||||||
PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0 ); /* FIXME: correct location? */
|
PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0, 0 ); /* FIXME: correct location? */
|
||||||
|
|
||||||
if ( (pdb->flags & PDB32_CONSOLE_PROC) || (pdb->flags & PDB32_DOS_PROC) )
|
if ( (pdb->flags & PDB32_CONSOLE_PROC) || (pdb->flags & PDB32_DOS_PROC) )
|
||||||
AllocConsole();
|
AllocConsole();
|
||||||
|
@ -485,7 +467,7 @@ void PROCESS_Start(void)
|
||||||
TASK_AddTaskEntryBreakpoint( pdb->task );
|
TASK_AddTaskEntryBreakpoint( pdb->task );
|
||||||
|
|
||||||
/* Now call the entry point */
|
/* Now call the entry point */
|
||||||
PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0 );
|
PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0, 0 );
|
||||||
|
|
||||||
switch ( type )
|
switch ( type )
|
||||||
{
|
{
|
||||||
|
|
|
@ -150,7 +150,7 @@ void CALLBACK THREAD_FreeTEB( ULONG_PTR arg )
|
||||||
TRACE("(%p) called\n", teb );
|
TRACE("(%p) called\n", teb );
|
||||||
SERVICE_Delete( teb->cleanup );
|
SERVICE_Delete( teb->cleanup );
|
||||||
|
|
||||||
PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, 0 );
|
PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, (DWORD)teb->tid, 0 );
|
||||||
|
|
||||||
CloseHandle( teb->event );
|
CloseHandle( teb->event );
|
||||||
while (*pptr && (*pptr != teb)) pptr = &(*pptr)->next;
|
while (*pptr && (*pptr != teb)) pptr = &(*pptr)->next;
|
||||||
|
@ -277,7 +277,7 @@ error:
|
||||||
static void THREAD_Start(void)
|
static void THREAD_Start(void)
|
||||||
{
|
{
|
||||||
LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)NtCurrentTeb()->entry_point;
|
LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)NtCurrentTeb()->entry_point;
|
||||||
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0 );
|
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, (DWORD)NtCurrentTeb()->tid, 0 );
|
||||||
PE_InitTls();
|
PE_InitTls();
|
||||||
MODULE_DllThreadAttach( NULL );
|
MODULE_DllThreadAttach( NULL );
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue