Commit 1d2ba529 authored by Alexandre Julliard's avatar Alexandre Julliard

Added current context to the exception debug event sent to the server.

parent 17cf8101
...@@ -122,7 +122,7 @@ static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame, ...@@ -122,7 +122,7 @@ static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame,
static void EXC_DefaultHandling( EXCEPTION_RECORD *rec, CONTEXT *context ) static void EXC_DefaultHandling( EXCEPTION_RECORD *rec, CONTEXT *context )
{ {
if ((PROCESS_Current()->flags & PDB32_DEBUGGED) && if ((PROCESS_Current()->flags & PDB32_DEBUGGED) &&
(DEBUG_SendExceptionEvent( rec, FALSE ) == DBG_CONTINUE)) (DEBUG_SendExceptionEvent( rec, FALSE, context ) == DBG_CONTINUE))
return; /* continue execution */ return; /* continue execution */
if (debug_hook( rec, context, FALSE ) == DBG_CONTINUE) if (debug_hook( rec, context, FALSE ) == DBG_CONTINUE)
...@@ -152,7 +152,7 @@ void WINAPI EXC_RtlRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context ) ...@@ -152,7 +152,7 @@ void WINAPI EXC_RtlRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context )
TRACE( "code=%lx flags=%lx\n", rec->ExceptionCode, rec->ExceptionFlags ); TRACE( "code=%lx flags=%lx\n", rec->ExceptionCode, rec->ExceptionFlags );
if ((PROCESS_Current()->flags & PDB32_DEBUGGED) && if ((PROCESS_Current()->flags & PDB32_DEBUGGED) &&
(DEBUG_SendExceptionEvent( rec, TRUE ) == DBG_CONTINUE)) (DEBUG_SendExceptionEvent( rec, TRUE, context ) == DBG_CONTINUE))
return; /* continue execution */ return; /* continue execution */
if (debug_hook( rec, context, TRUE ) == DBG_CONTINUE) if (debug_hook( rec, context, TRUE ) == DBG_CONTINUE)
......
...@@ -166,7 +166,7 @@ extern void PROCESS_FreePDB( PDB *pdb ); ...@@ -166,7 +166,7 @@ extern void PROCESS_FreePDB( PDB *pdb );
extern void PROCESS_WalkProcess( void ); extern void PROCESS_WalkProcess( void );
/* scheduler/debugger.c */ /* scheduler/debugger.c */
extern DWORD DEBUG_SendExceptionEvent( EXCEPTION_RECORD *rec, BOOL first_chance ); extern DWORD DEBUG_SendExceptionEvent( EXCEPTION_RECORD *rec, BOOL first_chance, CONTEXT *ctx );
extern DWORD DEBUG_SendCreateProcessEvent( HFILE file, HMODULE module, void *entry ); extern DWORD DEBUG_SendCreateProcessEvent( HFILE file, HMODULE module, void *entry );
extern DWORD DEBUG_SendCreateThreadEvent( void *entry ); extern DWORD DEBUG_SendCreateThreadEvent( void *entry );
extern DWORD DEBUG_SendLoadDLLEvent( HFILE file, HMODULE module, LPSTR *name ); extern DWORD DEBUG_SendLoadDLLEvent( HFILE file, HMODULE module, LPSTR *name );
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include "windef.h" #include "winbase.h"
/* Request structures */ /* Request structures */
...@@ -734,6 +734,7 @@ struct debug_event_exception ...@@ -734,6 +734,7 @@ struct debug_event_exception
int nb_params; /* exceptions parameters */ int nb_params; /* exceptions parameters */
int params[15]; int params[15];
int first_chance; /* first chance to handle it? */ int first_chance; /* first chance to handle it? */
CONTEXT context; /* thread context */
}; };
struct debug_event_create_thread struct debug_event_create_thread
{ {
......
...@@ -34,19 +34,28 @@ static DWORD DEBUG_SendEvent( int code, void *data, int size ) ...@@ -34,19 +34,28 @@ static DWORD DEBUG_SendEvent( int code, void *data, int size )
* *
* Send an EXCEPTION_DEBUG_EVENT event to the current process debugger. * Send an EXCEPTION_DEBUG_EVENT event to the current process debugger.
*/ */
DWORD DEBUG_SendExceptionEvent( EXCEPTION_RECORD *rec, BOOL first_chance ) DWORD DEBUG_SendExceptionEvent( EXCEPTION_RECORD *rec, BOOL first_chance, CONTEXT *context )
{ {
struct debug_event_exception event;
int i; int i;
DWORD ret = 0;
event.code = rec->ExceptionCode; struct send_debug_event_request *req = get_req_buffer();
event.flags = rec->ExceptionFlags; struct debug_event_exception *event = (struct debug_event_exception *)(req + 1);
event.record = rec->ExceptionRecord;
event.addr = rec->ExceptionAddress; req->code = EXCEPTION_DEBUG_EVENT;
event.nb_params = rec->NumberParameters; event->code = rec->ExceptionCode;
for (i = 0; i < event.nb_params; i++) event.params[i] = rec->ExceptionInformation[i]; event->flags = rec->ExceptionFlags;
event.first_chance = first_chance; event->record = rec->ExceptionRecord;
return DEBUG_SendEvent( EXCEPTION_DEBUG_EVENT, &event, sizeof(event) ); event->addr = rec->ExceptionAddress;
event->nb_params = rec->NumberParameters;
for (i = 0; i < event->nb_params; i++) event->params[i] = rec->ExceptionInformation[i];
event->first_chance = first_chance;
event->context = *context;
if (!server_call( REQ_SEND_DEBUG_EVENT ))
{
ret = req->status;
*context = event->context;
}
return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment