Generate CREATE_PROCESS/THREAD debug events internally in the server.
diff --git a/scheduler/client.c b/scheduler/client.c
index bd097f8..27d4d1b 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -453,6 +453,7 @@
*/
int CLIENT_InitThread(void)
{
+ struct get_thread_buffer_request *first_req;
struct init_thread_request *req;
TEB *teb = NtCurrentTeb();
int fd;
@@ -463,16 +464,17 @@
teb->buffer = mmap( 0, teb->buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
close( fd );
if (teb->buffer == (void*)-1) server_perror( "mmap" );
+ first_req = teb->buffer;
+ teb->process->server_pid = first_req->pid;
+ teb->tid = first_req->tid;
+ if (first_req->boot) boot_thread_id = teb->tid;
+ else if (boot_thread_id == teb->tid) boot_thread_id = 0;
- req = get_req_buffer();
+ req = teb->buffer;
req->unix_pid = getpid();
req->teb = teb;
- if (server_call( REQ_INIT_THREAD )) return -1;
- teb->process->server_pid = req->pid;
- teb->tid = req->tid;
- if (req->boot) boot_thread_id = req->tid;
- else if (boot_thread_id == req->tid) boot_thread_id = 0;
- return 0;
+ req->entry = teb->entry_point;
+ return server_call_noerr( REQ_INIT_THREAD );
}
/***********************************************************************
diff --git a/scheduler/debugger.c b/scheduler/debugger.c
index 8a09485..f8357d1 100644
--- a/scheduler/debugger.c
+++ b/scheduler/debugger.c
@@ -6,8 +6,8 @@
#include <string.h>
+#include "winerror.h"
#include "process.h"
-#include "thread.h"
#include "server.h"
#include "debugtools.h"
@@ -22,7 +22,6 @@
DWORD DEBUG_SendExceptionEvent( EXCEPTION_RECORD *rec, BOOL first_chance, CONTEXT *context )
{
int i;
- DWORD ret = 0;
struct send_debug_event_request *req = get_req_buffer();
req->event.code = EXCEPTION_DEBUG_EVENT;
@@ -35,58 +34,9 @@
req->event.info.exception.context = *context;
for (i = 0; i < req->event.info.exception.nb_params; i++)
req->event.info.exception.params[i] = rec->ExceptionInformation[i];
- if (!server_call( REQ_SEND_DEBUG_EVENT ))
- {
- ret = req->status;
+ if (!server_call_noerr( REQ_SEND_DEBUG_EVENT ))
*context = req->event.info.exception.context;
- }
- return ret;
-}
-
-
-/**********************************************************************
- * DEBUG_SendCreateProcessEvent
- *
- * Send an CREATE_PROCESS_DEBUG_EVENT event to the current process debugger.
- * Must be called from the context of the new process.
- */
-DWORD DEBUG_SendCreateProcessEvent( HFILE file, HMODULE module, void *entry )
-{
- DWORD ret = 0;
- struct send_debug_event_request *req = get_req_buffer();
-
- req->event.code = CREATE_PROCESS_DEBUG_EVENT;
- req->event.info.create_process.file = file;
- req->event.info.create_process.process = 0; /* will be filled by server */
- req->event.info.create_process.thread = 0; /* will be filled by server */
- req->event.info.create_process.base = (void *)module;
- req->event.info.create_process.dbg_offset = 0; /* FIXME */
- req->event.info.create_process.dbg_size = 0; /* FIXME */
- req->event.info.create_process.teb = NtCurrentTeb();
- req->event.info.create_process.start = entry;
- req->event.info.create_process.name = 0; /* FIXME */
- req->event.info.create_process.unicode = 0; /* FIXME */
- if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
- return ret;
-}
-
-/**********************************************************************
- * DEBUG_SendCreateThreadEvent
- *
- * Send an CREATE_THREAD_DEBUG_EVENT event to the current process debugger.
- * Must be called from the context of the new thread.
- */
-DWORD DEBUG_SendCreateThreadEvent( void *entry )
-{
- DWORD ret = 0;
- struct send_debug_event_request *req = get_req_buffer();
-
- req->event.code = CREATE_THREAD_DEBUG_EVENT;
- req->event.info.create_thread.handle = 0; /* will be filled by server */
- req->event.info.create_thread.teb = NtCurrentTeb();
- req->event.info.create_thread.start = entry;
- if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
- return ret;
+ return req->status;
}
@@ -97,7 +47,6 @@
*/
DWORD DEBUG_SendLoadDLLEvent( HFILE file, HMODULE module, LPSTR *name )
{
- DWORD ret = 0;
struct send_debug_event_request *req = get_req_buffer();
req->event.code = LOAD_DLL_DEBUG_EVENT;
@@ -107,8 +56,8 @@
req->event.info.load_dll.dbg_size = 0; /* FIXME */
req->event.info.load_dll.name = name;
req->event.info.load_dll.unicode = 0;
- if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
- return ret;
+ server_call_noerr( REQ_SEND_DEBUG_EVENT );
+ return req->status;
}
@@ -119,13 +68,12 @@
*/
DWORD DEBUG_SendUnloadDLLEvent( HMODULE module )
{
- DWORD ret = 0;
struct send_debug_event_request *req = get_req_buffer();
req->event.code = UNLOAD_DLL_DEBUG_EVENT;
req->event.info.unload_dll.base = (void *)module;
- if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
- return ret;
+ server_call_noerr( REQ_SEND_DEBUG_EVENT );
+ return req->status;
}
@@ -155,6 +103,9 @@
event->dwThreadId = (DWORD)req->tid;
switch(req->event.code)
{
+ case 0: /* timeout */
+ SetLastError( ERROR_SEM_TIMEOUT );
+ return FALSE;
case EXCEPTION_DEBUG_EVENT:
event->u.Exception.ExceptionRecord.ExceptionCode = req->event.info.exception.code;
event->u.Exception.ExceptionRecord.ExceptionFlags = req->event.info.exception.flags;
diff --git a/scheduler/process.c b/scheduler/process.c
index 56167a6..a1b68f7 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -26,7 +26,6 @@
#include "server.h"
#include "options.h"
#include "callback.h"
-#include "debugger.h"
#include "debugtools.h"
DEFAULT_DEBUG_CHANNEL(process)
@@ -371,6 +370,7 @@
*/
void PROCESS_Start(void)
{
+ struct init_process_done_request *req = get_req_buffer();
UINT cmdShow = SW_SHOWNORMAL;
LPTHREAD_START_ROUTINE entry = NULL;
PDB *pdb = PROCESS_Current();
@@ -452,16 +452,15 @@
PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0, 0 );
/* Signal the parent process to continue */
+ req->module = (void *)pModule->module32;
+ req->entry = entry;
server_call( REQ_INIT_PROCESS_DONE );
/* Send all required start-up debugger events */
if ( type == PROC_WIN32 && (pdb->flags & PDB32_DEBUGGED) )
{
EnterCriticalSection( &pdb->crit_section );
-
- DEBUG_SendCreateProcessEvent( -1 /*FIXME*/, pModule->module32, entry );
MODULE_SendLoadDLLEvents();
-
LeaveCriticalSection( &pdb->crit_section );
}
@@ -479,10 +478,6 @@
LeaveCriticalSection( &pdb->crit_section );
}
- /* If requested, add entry point breakpoint */
- if ( Options.debug || (pdb->flags & PDB32_DEBUGGED) )
- DEBUG_AddTaskEntryBreakpoint( pdb->task );
-
/* Call UserSignalProc ( USIG_PROCESS_RUNNING ... ) only for non-GUI win32 apps */
if ( type != PROC_WIN16 && (pdb->flags & PDB32_CONSOLE_PROC))
PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0, 0 );
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 17310be..9082cb8 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -276,9 +276,6 @@
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, (DWORD)NtCurrentTeb()->tid, 0 );
PE_InitTls();
MODULE_DllThreadAttach( NULL );
-
- if (NtCurrentTeb()->process->flags & PDB32_DEBUGGED) DEBUG_SendCreateThreadEvent( func );
-
ExitThread( func( NtCurrentTeb()->entry_arg ) );
}