forked from Mirrors/wine-wine
Added current context to the exception debug event sent to the server.
parent
17cf81018f
commit
1d2ba529aa
|
@ -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 )
|
||||||
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 );
|
||||||
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 @@
|
||||||
|
|
||||||
#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
|
||||||
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 )
|
||||||
*
|
*
|
||||||
* 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;
|
||||||
|
struct send_debug_event_request *req = get_req_buffer();
|
||||||
|
struct debug_event_exception *event = (struct debug_event_exception *)(req + 1);
|
||||||
|
|
||||||
event.code = rec->ExceptionCode;
|
req->code = EXCEPTION_DEBUG_EVENT;
|
||||||
event.flags = rec->ExceptionFlags;
|
event->code = rec->ExceptionCode;
|
||||||
event.record = rec->ExceptionRecord;
|
event->flags = rec->ExceptionFlags;
|
||||||
event.addr = rec->ExceptionAddress;
|
event->record = rec->ExceptionRecord;
|
||||||
event.nb_params = rec->NumberParameters;
|
event->addr = rec->ExceptionAddress;
|
||||||
for (i = 0; i < event.nb_params; i++) event.params[i] = rec->ExceptionInformation[i];
|
event->nb_params = rec->NumberParameters;
|
||||||
event.first_chance = first_chance;
|
for (i = 0; i < event->nb_params; i++) event->params[i] = rec->ExceptionInformation[i];
|
||||||
return DEBUG_SendEvent( EXCEPTION_DEBUG_EVENT, &event, sizeof(event) );
|
event->first_chance = first_chance;
|
||||||
|
event->context = *context;
|
||||||
|
if (!server_call( REQ_SEND_DEBUG_EVENT ))
|
||||||
|
{
|
||||||
|
ret = req->status;
|
||||||
|
*context = event->context;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue