Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
c09df806
Commit
c09df806
authored
Mar 05, 2010
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Always restore the context after an exception even if setting the debug registers fails.
parent
b1c0441f
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
39 additions
and
6 deletions
+39
-6
signal_i386.c
dlls/ntdll/signal_i386.c
+39
-6
No files found.
dlls/ntdll/signal_i386.c
View file @
c09df806
...
...
@@ -1188,6 +1188,35 @@ void set_cpu_context( const CONTEXT *context )
/***********************************************************************
* set_debug_registers
*/
static
void
set_debug_registers
(
const
CONTEXT
*
context
)
{
DWORD
flags
=
context
->
ContextFlags
&
~
CONTEXT_i386
;
context_t
server_context
;
if
(
!
(
flags
&
CONTEXT_DEBUG_REGISTERS
))
return
;
if
(
ntdll_get_thread_data
()
->
dr0
==
context
->
Dr0
&&
ntdll_get_thread_data
()
->
dr1
==
context
->
Dr1
&&
ntdll_get_thread_data
()
->
dr2
==
context
->
Dr2
&&
ntdll_get_thread_data
()
->
dr3
==
context
->
Dr3
&&
ntdll_get_thread_data
()
->
dr6
==
context
->
Dr6
&&
ntdll_get_thread_data
()
->
dr7
==
context
->
Dr7
)
return
;
context_to_server
(
&
server_context
,
context
);
SERVER_START_REQ
(
set_thread_context
)
{
req
->
handle
=
wine_server_obj_handle
(
GetCurrentThread
()
);
req
->
suspend
=
0
;
wine_server_add_data
(
req
,
&
server_context
,
sizeof
(
server_context
)
);
wine_server_call
(
req
);
}
SERVER_END_REQ
;
}
/***********************************************************************
* copy_context
*
* Copy a register context according to the flags.
...
...
@@ -1678,9 +1707,9 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context
break
;
}
status
=
NtRaiseException
(
rec
,
context
,
TRUE
);
if
(
status
)
raise_status
(
status
,
rec
);
raise_status
(
status
,
rec
);
done:
NtSetContextThread
(
GetCurrentThread
(),
context
);
set_cpu_context
(
context
);
}
...
...
@@ -1709,7 +1738,7 @@ static void WINAPI raise_trap_exception( EXCEPTION_RECORD *rec, CONTEXT *context
}
status
=
NtRaiseException
(
rec
,
context
,
TRUE
);
if
(
status
)
raise_status
(
status
,
rec
);
raise_status
(
status
,
rec
);
}
...
...
@@ -1723,7 +1752,7 @@ static void WINAPI raise_generic_exception( EXCEPTION_RECORD *rec, CONTEXT *cont
NTSTATUS
status
;
status
=
NtRaiseException
(
rec
,
context
,
TRUE
);
if
(
status
)
raise_status
(
status
,
rec
);
raise_status
(
status
,
rec
);
}
...
...
@@ -1755,7 +1784,7 @@ static void WINAPI raise_vm86_sti_exception( EXCEPTION_RECORD *rec, CONTEXT *con
NtRaiseException
(
rec
,
context
,
TRUE
);
}
done:
NtSetContextThread
(
GetCurrentThread
(),
context
);
set_cpu_context
(
context
);
}
...
...
@@ -2345,7 +2374,11 @@ DEFINE_REGS_ENTRYPOINT( RtlUnwind, 4 )
NTSTATUS
WINAPI
NtRaiseException
(
EXCEPTION_RECORD
*
rec
,
CONTEXT
*
context
,
BOOL
first_chance
)
{
NTSTATUS
status
=
raise_exception
(
rec
,
context
,
first_chance
);
if
(
status
==
STATUS_SUCCESS
)
NtSetContextThread
(
GetCurrentThread
(),
context
);
if
(
status
==
STATUS_SUCCESS
)
{
set_debug_registers
(
context
);
set_cpu_context
(
context
);
}
return
status
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment