Sebastian Lackner : ntdll: Implement ThreadQuerySetWin32StartAddress info class in NtQueryInformationThread.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 29 15:40:46 CDT 2015
Module: wine
Branch: master
Commit: 845164004b4b6f2e0c64a588fe858d5a26664980
URL: http://source.winehq.org/git/wine.git/?a=commit;h=845164004b4b6f2e0c64a588fe858d5a26664980
Author: Sebastian Lackner <sebastian at fds-team.de>
Date: Mon Jul 27 18:31:33 2015 +0200
ntdll: Implement ThreadQuerySetWin32StartAddress info class in NtQueryInformationThread.
---
dlls/ntdll/thread.c | 18 +++++++++++++++++-
include/wine/server_protocol.h | 5 +++--
server/protocol.def | 1 +
server/request.h | 11 ++++++-----
server/thread.c | 1 +
server/trace.c | 1 +
6 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 3e95fd4..0a8a7b9 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -1086,12 +1086,28 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class,
SERVER_END_REQ;
return status;
}
+ case ThreadQuerySetWin32StartAddress:
+ {
+ SERVER_START_REQ( get_thread_info )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ req->tid_in = 0;
+ status = wine_server_call( req );
+ if (status == STATUS_SUCCESS)
+ {
+ PRTL_THREAD_START_ROUTINE entry = wine_server_get_ptr( reply->entry_point );
+ if (data) memcpy( data, &entry, min( length, sizeof(entry) ) );
+ if (ret_len) *ret_len = min( length, sizeof(entry) );
+ }
+ }
+ SERVER_END_REQ;
+ return status;
+ }
case ThreadPriority:
case ThreadBasePriority:
case ThreadImpersonationToken:
case ThreadEnableAlignmentFaultFixup:
case ThreadEventPair_Reusable:
- case ThreadQuerySetWin32StartAddress:
case ThreadZeroTlsCell:
case ThreadPerformanceCount:
case ThreadIdealProcessor:
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 200b27a..36f6378 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -892,11 +892,12 @@ struct get_thread_info_reply
process_id_t pid;
thread_id_t tid;
client_ptr_t teb;
+ client_ptr_t entry_point;
affinity_t affinity;
int exit_code;
int priority;
int last;
- char __pad_44[4];
+ char __pad_52[4];
};
@@ -6113,6 +6114,6 @@ union generic_reply
struct terminate_job_reply terminate_job_reply;
};
-#define SERVER_PROTOCOL_VERSION 483
+#define SERVER_PROTOCOL_VERSION 484
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index 4279cb6..ffee0c0 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -841,6 +841,7 @@ struct rawinput_device
process_id_t pid; /* server process id */
thread_id_t tid; /* server thread id */
client_ptr_t teb; /* thread teb pointer */
+ client_ptr_t entry_point; /* thread entry point */
affinity_t affinity; /* thread affinity mask */
int exit_code; /* thread exit code */
int priority; /* thread priority level */
diff --git a/server/request.h b/server/request.h
index 2ba8b45..10e4c9b 100644
--- a/server/request.h
+++ b/server/request.h
@@ -768,11 +768,12 @@ C_ASSERT( sizeof(struct get_thread_info_request) == 24 );
C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, pid) == 8 );
C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, tid) == 12 );
C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, teb) == 16 );
-C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, affinity) == 24 );
-C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, exit_code) == 32 );
-C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, priority) == 36 );
-C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, last) == 40 );
-C_ASSERT( sizeof(struct get_thread_info_reply) == 48 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, entry_point) == 24 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, affinity) == 32 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, exit_code) == 40 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, priority) == 44 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_info_reply, last) == 48 );
+C_ASSERT( sizeof(struct get_thread_info_reply) == 56 );
C_ASSERT( FIELD_OFFSET(struct get_thread_times_request, handle) == 12 );
C_ASSERT( sizeof(struct get_thread_times_request) == 16 );
C_ASSERT( FIELD_OFFSET(struct get_thread_times_reply, creation_time) == 8 );
diff --git a/server/thread.c b/server/thread.c
index f020908..981bcc1 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1375,6 +1375,7 @@ DECL_HANDLER(get_thread_info)
reply->pid = get_process_id( thread->process );
reply->tid = get_thread_id( thread );
reply->teb = thread->teb;
+ reply->entry_point = thread->entry_point;
reply->exit_code = (thread->state == TERMINATED) ? thread->exit_code : STATUS_PENDING;
reply->priority = thread->priority;
reply->affinity = thread->affinity;
diff --git a/server/trace.c b/server/trace.c
index da4f5b8..3eb8583 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1300,6 +1300,7 @@ static void dump_get_thread_info_reply( const struct get_thread_info_reply *req
fprintf( stderr, " pid=%04x", req->pid );
fprintf( stderr, ", tid=%04x", req->tid );
dump_uint64( ", teb=", &req->teb );
+ dump_uint64( ", entry_point=", &req->entry_point );
dump_uint64( ", affinity=", &req->affinity );
fprintf( stderr, ", exit_code=%d", req->exit_code );
fprintf( stderr, ", priority=%d", req->priority );
More information about the wine-cvs
mailing list