Alexandre Julliard : ntdll: Add helper functions for getting and setting thread context through the server.
Alexandre Julliard
julliard at winehq.org
Tue Jul 18 13:58:54 CDT 2017
Module: wine
Branch: master
Commit: 1e48417567ce976b805b38dd8d1eff6a02e773e9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e48417567ce976b805b38dd8d1eff6a02e773e9
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jul 18 11:07:48 2017 +0200
ntdll: Add helper functions for getting and setting thread context through the server.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/thread.c | 180 +++++++++++++++++++++++++++++-----------------------
1 file changed, 101 insertions(+), 79 deletions(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 830dd3a..4e1a060 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -769,13 +769,61 @@ NTSTATUS WINAPI NtQueueApcThread( HANDLE handle, PNTAPCFUNC func, ULONG_PTR arg1
/***********************************************************************
+ * set_thread_context
+ */
+static NTSTATUS set_thread_context( HANDLE handle, const CONTEXT *context, BOOL *self )
+{
+ NTSTATUS ret;
+ DWORD dummy, i;
+ context_t server_context;
+
+ context_to_server( &server_context, context );
+
+ SERVER_START_REQ( set_thread_context )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ req->suspend = 1;
+ wine_server_add_data( req, &server_context, sizeof(server_context) );
+ ret = wine_server_call( req );
+ *self = reply->self;
+ }
+ SERVER_END_REQ;
+
+ if (ret == STATUS_PENDING)
+ {
+ for (i = 0; i < 100; i++)
+ {
+ SERVER_START_REQ( set_thread_context )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ req->suspend = 0;
+ wine_server_add_data( req, &server_context, sizeof(server_context) );
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ if (ret == STATUS_PENDING)
+ {
+ LARGE_INTEGER timeout;
+ timeout.QuadPart = -10000;
+ NtDelayExecution( FALSE, &timeout );
+ }
+ else break;
+ }
+ NtResumeThread( handle, &dummy );
+ if (ret == STATUS_PENDING) ret = STATUS_ACCESS_DENIED;
+ }
+
+ return ret;
+}
+
+
+/***********************************************************************
* NtSetContextThread (NTDLL.@)
* ZwSetContextThread (NTDLL.@)
*/
NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
{
NTSTATUS ret;
- DWORD dummy, i;
BOOL self;
#ifdef __i386__
@@ -796,44 +844,7 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
if (!self)
{
- context_t server_context;
-
- context_to_server( &server_context, context );
-
- SERVER_START_REQ( set_thread_context )
- {
- req->handle = wine_server_obj_handle( handle );
- req->suspend = 1;
- wine_server_add_data( req, &server_context, sizeof(server_context) );
- ret = wine_server_call( req );
- self = reply->self;
- }
- SERVER_END_REQ;
-
- if (ret == STATUS_PENDING)
- {
- for (i = 0; i < 100; i++)
- {
- SERVER_START_REQ( set_thread_context )
- {
- req->handle = wine_server_obj_handle( handle );
- req->suspend = 0;
- wine_server_add_data( req, &server_context, sizeof(server_context) );
- ret = wine_server_call( req );
- }
- SERVER_END_REQ;
- if (ret == STATUS_PENDING)
- {
- LARGE_INTEGER timeout;
- timeout.QuadPart = -10000;
- NtDelayExecution( FALSE, &timeout );
- }
- else break;
- }
- NtResumeThread( handle, &dummy );
- if (ret == STATUS_PENDING) ret = STATUS_ACCESS_DENIED;
- }
-
+ ret = set_thread_context( handle, context, &self );
if (ret) return ret;
}
@@ -866,13 +877,62 @@ static inline unsigned int get_server_context_flags( DWORD flags )
}
/***********************************************************************
+ * get_thread_context
+ */
+static NTSTATUS get_thread_context( HANDLE handle, CONTEXT *context, BOOL *self )
+{
+ NTSTATUS ret;
+ DWORD dummy, i;
+ unsigned int server_flags = get_server_context_flags( context->ContextFlags );
+ context_t server_context;
+
+ SERVER_START_REQ( get_thread_context )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ req->flags = server_flags;
+ req->suspend = 1;
+ wine_server_set_reply( req, &server_context, sizeof(server_context) );
+ ret = wine_server_call( req );
+ *self = reply->self;
+ }
+ SERVER_END_REQ;
+
+ if (ret == STATUS_PENDING)
+ {
+ for (i = 0; i < 100; i++)
+ {
+ SERVER_START_REQ( get_thread_context )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ req->flags = server_flags;
+ req->suspend = 0;
+ wine_server_set_reply( req, &server_context, sizeof(server_context) );
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ if (ret == STATUS_PENDING)
+ {
+ LARGE_INTEGER timeout;
+ timeout.QuadPart = -10000;
+ NtDelayExecution( FALSE, &timeout );
+ }
+ else break;
+ }
+ NtResumeThread( handle, &dummy );
+ if (ret == STATUS_PENDING) ret = STATUS_ACCESS_DENIED;
+ }
+ if (!ret) ret = context_from_server( context, &server_context );
+ return ret;
+}
+
+
+/***********************************************************************
* NtGetContextThread (NTDLL.@)
* ZwGetContextThread (NTDLL.@)
*/
NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
{
NTSTATUS ret;
- DWORD dummy, i;
DWORD needed_flags = context->ContextFlags;
BOOL self = (handle == GetCurrentThread());
@@ -885,45 +945,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
if (!self)
{
- unsigned int server_flags = get_server_context_flags( context->ContextFlags );
- context_t server_context;
-
- SERVER_START_REQ( get_thread_context )
- {
- req->handle = wine_server_obj_handle( handle );
- req->flags = server_flags;
- req->suspend = 1;
- wine_server_set_reply( req, &server_context, sizeof(server_context) );
- ret = wine_server_call( req );
- self = reply->self;
- }
- SERVER_END_REQ;
-
- if (ret == STATUS_PENDING)
- {
- for (i = 0; i < 100; i++)
- {
- SERVER_START_REQ( get_thread_context )
- {
- req->handle = wine_server_obj_handle( handle );
- req->flags = server_flags;
- req->suspend = 0;
- wine_server_set_reply( req, &server_context, sizeof(server_context) );
- ret = wine_server_call( req );
- }
- SERVER_END_REQ;
- if (ret == STATUS_PENDING)
- {
- LARGE_INTEGER timeout;
- timeout.QuadPart = -10000;
- NtDelayExecution( FALSE, &timeout );
- }
- else break;
- }
- NtResumeThread( handle, &dummy );
- if (ret == STATUS_PENDING) ret = STATUS_ACCESS_DENIED;
- }
- if (!ret) ret = context_from_server( context, &server_context );
+ ret = get_thread_context( handle, context, &self );
if (ret) return ret;
needed_flags &= ~context->ContextFlags;
}
More information about the wine-cvs
mailing list