Sebastian Lackner : kernel32: Process OutputDebugString events like regular exceptions.
Alexandre Julliard
julliard at winehq.org
Fri Jun 20 16:39:43 CDT 2014
Module: wine
Branch: master
Commit: 15fa6111af44eebf313fe058e849f602db494e99
URL: http://source.winehq.org/git/wine.git/?a=commit;h=15fa6111af44eebf313fe058e849f602db494e99
Author: Sebastian Lackner <sebastian at fds-team.de>
Date: Thu Jun 19 21:18:31 2014 +0200
kernel32: Process OutputDebugString events like regular exceptions.
---
dlls/kernel32/debugger.c | 34 +++++++++++++---------------------
1 file changed, 13 insertions(+), 21 deletions(-)
diff --git a/dlls/kernel32/debugger.c b/dlls/kernel32/debugger.c
index 34ef30a..738b6f0 100644
--- a/dlls/kernel32/debugger.c
+++ b/dlls/kernel32/debugger.c
@@ -77,6 +77,14 @@ BOOL WINAPI WaitForDebugEvent(
switch(data.code)
{
case EXCEPTION_DEBUG_EVENT:
+ if (data.exception.exc_code == DBG_PRINTEXCEPTION_C && data.exception.nb_params >= 2)
+ {
+ event->dwDebugEventCode = OUTPUT_DEBUG_STRING_EVENT;
+ event->u.DebugString.lpDebugStringData = wine_server_get_ptr( data.exception.params[1] );
+ event->u.DebugString.fUnicode = FALSE;
+ event->u.DebugString.nDebugStringLength = data.exception.params[0];
+ break;
+ }
event->u.Exception.dwFirstChance = data.exception.first;
event->u.Exception.ExceptionRecord.ExceptionCode = data.exception.exc_code;
event->u.Exception.ExceptionRecord.ExceptionFlags = data.exception.flags;
@@ -120,11 +128,6 @@ BOOL WINAPI WaitForDebugEvent(
case UNLOAD_DLL_DEBUG_EVENT:
event->u.UnloadDll.lpBaseOfDll = wine_server_get_ptr( data.unload_dll.base );
break;
- case OUTPUT_DEBUG_STRING_EVENT:
- event->u.DebugString.lpDebugStringData = wine_server_get_ptr( data.output_string.string );
- event->u.DebugString.fUnicode = FALSE;
- event->u.DebugString.nDebugStringLength = data.output_string.length;
- break;
case RIP_EVENT:
event->u.RipInfo.dwError = data.rip_info.error;
event->u.RipInfo.dwType = data.rip_info.type;
@@ -251,10 +254,12 @@ void WINAPI OutputDebugStringA( LPCSTR str )
{
static HANDLE DBWinMutex = NULL;
static BOOL mutex_inited = FALSE;
+ BOOL caught_by_dbg = TRUE;
if (!str) str = "";
+ WARN("%s\n", debugstr_a(str));
- /* raise fake exception to make copy protections happy */
+ /* raise exception, WaitForDebugEvent() will generate a corresponding debug event */
__TRY
{
ULONG_PTR args[2];
@@ -264,25 +269,12 @@ void WINAPI OutputDebugStringA( LPCSTR str )
}
__EXCEPT(debug_exception_handler)
{
+ caught_by_dbg = FALSE;
}
__ENDTRY
-
- /* send string to attached debugger */
- /* FIXME should only send to debugger if exception is not caught by user-mode application */
-
- SERVER_START_REQ( output_debug_string )
- {
- req->string = wine_server_client_ptr( str );
- req->length = strlen(str) + 1;
- wine_server_call( req );
- }
- SERVER_END_REQ;
-
- WARN("%s\n", debugstr_a(str));
+ if (caught_by_dbg) return;
/* send string to a system-wide monitor */
- /* FIXME should only send to monitor if no debuggers are attached */
-
if (!mutex_inited)
{
/* first call to OutputDebugString, initialize mutex handle */
More information about the wine-cvs
mailing list