Set thread start address to 0 on events generated by
DebugActiveProcess.
Return a correct address in the simulated exception event.
diff --git a/server/debugger.c b/server/debugger.c
index d704b5f..ccfbd50 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -94,7 +94,7 @@
static int fill_create_thread_event( struct debug_event *event, void *arg )
{
struct process *debugger = event->debugger->process;
- struct thread *thread = arg;
+ struct thread *thread = event->sender;
int handle;
/* documented: THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME */
@@ -102,15 +102,15 @@
return 0;
event->data.info.create_thread.handle = handle;
event->data.info.create_thread.teb = thread->teb;
- event->data.info.create_thread.start = thread->entry;
+ event->data.info.create_thread.start = arg;
return 1;
}
static int fill_create_process_event( struct debug_event *event, void *arg )
{
struct process *debugger = event->debugger->process;
- struct process *process = arg;
- struct thread *thread = process->thread_list;
+ struct thread *thread = event->sender;
+ struct process *process = thread->process;
int handle;
/* documented: PROCESS_VM_READ | PROCESS_VM_WRITE */
@@ -138,7 +138,7 @@
event->data.info.create_process.file = handle;
event->data.info.create_process.teb = thread->teb;
event->data.info.create_process.base = process->exe.base;
- event->data.info.create_process.start = thread->entry;
+ event->data.info.create_process.start = arg;
event->data.info.create_process.dbg_offset = process->exe.dbg_offset;
event->data.info.create_process.dbg_size = process->exe.dbg_size;
event->data.info.create_process.name = 0;
@@ -472,15 +472,15 @@
}
/* generate all startup events of a given process */
-void generate_startup_debug_events( struct process *process )
+void generate_startup_debug_events( struct process *process, void *entry )
{
struct process_dll *dll;
struct thread *thread = process->thread_list;
/* generate creation events */
- generate_debug_event( thread, CREATE_PROCESS_DEBUG_EVENT, process );
+ generate_debug_event( thread, CREATE_PROCESS_DEBUG_EVENT, entry );
while ((thread = thread->proc_next))
- generate_debug_event( thread, CREATE_THREAD_DEBUG_EVENT, thread );
+ generate_debug_event( thread, CREATE_THREAD_DEBUG_EVENT, NULL );
/* generate dll events (in loading order, i.e. reverse list order) */
for (dll = &process->exe; dll->next; dll = dll->next);
@@ -559,13 +559,13 @@
if (debugger_attach( process, current ))
{
- generate_startup_debug_events( process );
+ generate_startup_debug_events( process, NULL );
resume_process( process );
data.record.ExceptionCode = EXCEPTION_BREAKPOINT;
data.record.ExceptionFlags = EXCEPTION_CONTINUABLE;
data.record.ExceptionRecord = NULL;
- data.record.ExceptionAddress = process->thread_list->entry; /* FIXME */
+ data.record.ExceptionAddress = get_thread_ip( process->thread_list );
data.record.NumberParameters = 0;
data.first = 1;
if ((event = queue_debug_event( process->thread_list, EXCEPTION_DEBUG_EVENT, &data )))