Send USIG_PROCESS_CREATE signal.

Bugfix: GetProcessDword offset -8 should return parent process ID.
This commit is contained in:
Ulrich Weigand 1999-04-11 12:06:04 +00:00 committed by Alexandre Julliard
parent af50474298
commit 2e658768dc
5 changed files with 31 additions and 26 deletions

View file

@ -136,7 +136,7 @@ typedef struct _PDB
#define GPD_STARTF_SIZE (-20) #define GPD_STARTF_SIZE (-20)
#define GPD_STARTF_POSITION (-16) #define GPD_STARTF_POSITION (-16)
#define GPD_STARTF_FLAGS (-12) #define GPD_STARTF_FLAGS (-12)
#define GPD_PARENT_PDB (- 8) #define GPD_PARENT (- 8)
#define GPD_FLAGS (- 4) #define GPD_FLAGS (- 4)
#define GPD_USERDATA ( 0) #define GPD_USERDATA ( 0)
@ -154,7 +154,7 @@ extern PDB *PROCESS_Current(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 dwThreadOrProcessId, 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,
HINSTANCE16 hInstance, HINSTANCE16 hPrevInstance, HINSTANCE16 hInstance, HINSTANCE16 hPrevInstance,

View file

@ -1091,7 +1091,7 @@ static BOOL16 NE_FreeModule( HMODULE16 hModule, BOOL call_wep )
pTask->userhandler( hModule, USIG16_DLL_UNLOAD, 0, pTask->userhandler( hModule, USIG16_DLL_UNLOAD, 0,
pTask->hInstance, pTask->hQueue ); pTask->hInstance, pTask->hQueue );
PROCESS_CallUserSignalProc( USIG_DLL_UNLOAD_WIN16, hModule ); PROCESS_CallUserSignalProc( USIG_DLL_UNLOAD_WIN16, 0, hModule );
} }
else else
call_wep = FALSE; /* We are freeing a task -> no more WEPs */ call_wep = FALSE; /* We are freeing a task -> no more WEPs */

View file

@ -239,10 +239,10 @@ static void TASK_CallToStart(void)
memset(THREAD_STACK16( pTask->thdb ), '\0', sizeof(STACK16FRAME)); memset(THREAD_STACK16( pTask->thdb ), '\0', sizeof(STACK16FRAME));
/* Call USER signal proc */ /* Call USER signal proc */
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0 ); /* for initial thread */ PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0, 0 ); /* for initial thread */
PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0 ); PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0, 0 );
PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0 ); PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0, 0 );
PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0 ); PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0, 0 );
if (pModule->flags & NE_FFLAGS_WIN32) if (pModule->flags & NE_FFLAGS_WIN32)
{ {
@ -574,9 +574,9 @@ void TASK_KillTask( HTASK16 hTask )
pTask->userhandler( hTask, USIG16_TERMINATION, 0, pTask->userhandler( hTask, USIG16_TERMINATION, 0,
pTask->hInstance, pTask->hQueue ); pTask->hInstance, pTask->hQueue );
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, 0, 0 ); /* FIXME */
PROCESS_CallUserSignalProc( USIG_PROCESS_DESTROY, 0 ); PROCESS_CallUserSignalProc( USIG_PROCESS_DESTROY, 0, 0 );
if (nTaskCount <= 1) if (nTaskCount <= 1)
{ {

View file

@ -172,11 +172,11 @@ 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.
*/ */
void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule ) void PROCESS_CallUserSignalProc( UINT uCode, DWORD dwThreadOrProcessId, HMODULE hModule )
{ {
PDB *pdb = PROCESS_Current(); PDB *pdb = PROCESS_Current();
STARTUPINFOA *startup = pdb->env_db? pdb->env_db->startup_info : NULL; STARTUPINFOA *startup = pdb->env_db? pdb->env_db->startup_info : NULL;
DWORD dwFlags = 0, dwThreadOrProcessID; DWORD dwFlags = 0;
/* Determine dwFlags */ /* Determine dwFlags */
@ -201,10 +201,11 @@ void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule )
/* Get thread or process ID */ /* Get thread or process ID */
if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT ) if ( dwThreadOrProcessId == 0 )
dwThreadOrProcessID = GetCurrentThreadId(); if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT )
else dwThreadOrProcessId = GetCurrentThreadId();
dwThreadOrProcessID = GetCurrentProcessId(); else
dwThreadOrProcessId = GetCurrentProcessId();
/* Convert module handle to 16-bit */ /* Convert module handle to 16-bit */
@ -214,7 +215,7 @@ void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule )
/* Call USER signal proc */ /* Call USER signal proc */
if ( Callout.UserSignalProc ) if ( Callout.UserSignalProc )
Callout.UserSignalProc( uCode, dwThreadOrProcessID, dwFlags, hModule ); Callout.UserSignalProc( uCode, dwThreadOrProcessId, dwFlags, hModule );
} }
@ -450,7 +451,7 @@ void PROCESS_Start(void)
NE_MODULE *pModule = NE_GetPtr( pTask->hModule ); NE_MODULE *pModule = NE_GetPtr( pTask->hModule );
OFSTRUCT *ofs = (OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo); OFSTRUCT *ofs = (OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo);
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0 ); /* for initial thread */ PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0, 0 ); /* for initial thread */
#if 0 #if 0
/* Initialize the critical section */ /* Initialize the critical section */
@ -474,7 +475,7 @@ void PROCESS_Start(void)
#endif #endif
PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0 ); PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0, 0 );
/* Map system DLLs into this process (from initial process) */ /* Map system DLLs into this process (from initial process) */
/* FIXME: this is a hack */ /* FIXME: this is a hack */
@ -483,7 +484,7 @@ void PROCESS_Start(void)
/* Create 32-bit MODREF */ /* Create 32-bit MODREF */
if (!PE_CreateModule( pModule->module32, ofs, 0, FALSE )) goto error; if (!PE_CreateModule( pModule->module32, ofs, 0, FALSE )) goto error;
PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0 ); /* FIXME: correct location? */ PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0, 0 ); /* FIXME: correct location? */
/* Initialize thread-local storage */ /* Initialize thread-local storage */
@ -496,7 +497,7 @@ void PROCESS_Start(void)
MODULE_InitializeDLLs( 0, DLL_PROCESS_ATTACH, (LPVOID)1 ); MODULE_InitializeDLLs( 0, DLL_PROCESS_ATTACH, (LPVOID)1 );
PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0 ); PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0, 0 );
entry = (LPTHREAD_START_ROUTINE)RVA_PTR(pModule->module32, entry = (LPTHREAD_START_ROUTINE)RVA_PTR(pModule->module32,
OptionalHeader.AddressOfEntryPoint); OptionalHeader.AddressOfEntryPoint);
@ -587,6 +588,10 @@ PDB *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env,
if (!PROCESS_InheritEnvDB( pdb, cmd_line, env, inherit, startup )) goto error; if (!PROCESS_InheritEnvDB( pdb, cmd_line, env, inherit, startup )) goto error;
/* Call USER signal proc */
PROCESS_CallUserSignalProc( USIG_PROCESS_CREATE, info->dwProcessId, 0 );
/* Create the main thread */ /* Create the main thread */
if (pModule->module32) if (pModule->module32)
@ -730,8 +735,8 @@ DWORD WINAPI GetProcessDword( DWORD dwProcessID, INT offset )
case GPD_STARTF_FLAGS: case GPD_STARTF_FLAGS:
return process->env_db->startup_info->dwFlags; return process->env_db->startup_info->dwFlags;
case GPD_PARENT_PDB: case GPD_PARENT:
return (DWORD)process->parent; return (DWORD)process->parent->server_pid;
case GPD_FLAGS: case GPD_FLAGS:
return process->flags; return process->flags;
@ -770,7 +775,7 @@ void WINAPI SetProcessDword( DWORD dwProcessID, INT offset, DWORD value )
case GPD_STARTF_SIZE: case GPD_STARTF_SIZE:
case GPD_STARTF_POSITION: case GPD_STARTF_POSITION:
case GPD_STARTF_FLAGS: case GPD_STARTF_FLAGS:
case GPD_PARENT_PDB: case GPD_PARENT:
case GPD_FLAGS: case GPD_FLAGS:
ERR( win32, "Not allowed to modify offset %d\n", offset ); ERR( win32, "Not allowed to modify offset %d\n", offset );
break; break;

View file

@ -154,7 +154,7 @@ void THREAD_FreeTHDB( THDB *thdb )
{ {
THDB **pptr = &THREAD_First; THDB **pptr = &THREAD_First;
PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, 0 ); PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, 0, 0 );
CloseHandle( thdb->event ); CloseHandle( thdb->event );
while (*pptr && (*pptr != thdb)) pptr = &(*pptr)->next; while (*pptr && (*pptr != thdb)) pptr = &(*pptr)->next;
@ -279,7 +279,7 @@ static void THREAD_Start(void)
{ {
THDB *thdb = THREAD_Current(); THDB *thdb = THREAD_Current();
LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)thdb->entry_point; LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)thdb->entry_point;
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0 ); PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0, 0 );
PE_InitTls(); PE_InitTls();
MODULE_InitializeDLLs( 0, DLL_THREAD_ATTACH, NULL ); MODULE_InitializeDLLs( 0, DLL_THREAD_ATTACH, NULL );
ExitThread( func( thdb->entry_arg ) ); ExitThread( func( thdb->entry_arg ) );