[3/5] ntdll: Implement ThreadQuerySetWin32StartAddress info class in NtSetInformationThread.

Sebastian Lackner sebastian at fds-team.de
Sun Jul 26 23:12:48 CDT 2015


This implements the pre-Vista version, where the entry point can be changed.

---
 dlls/ntdll/thread.c |   16 ++++++++++++++--
 server/protocol.def |    8 +++++---
 server/thread.c     |    2 ++
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index ef4029a..74d512a 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -1204,14 +1204,26 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class,
     case ThreadHideFromDebugger:
         /* pretend the call succeeded to satisfy some code protectors */
         return STATUS_SUCCESS;
-
+    case ThreadQuerySetWin32StartAddress:
+        {
+            const PRTL_THREAD_START_ROUTINE *entry = data;
+            if (length != sizeof(PRTL_THREAD_START_ROUTINE)) return STATUS_INVALID_PARAMETER;
+            SERVER_START_REQ( set_thread_info )
+            {
+                req->handle   = wine_server_obj_handle( handle );
+                req->mask     = SET_THREAD_INFO_ENTRYPOINT;
+                req->entry_point = wine_server_client_ptr( *entry );
+                status = wine_server_call( req );
+            }
+            SERVER_END_REQ;
+        }
+        return status;
     case ThreadBasicInformation:
     case ThreadTimes:
     case ThreadPriority:
     case ThreadDescriptorTableEntry:
     case ThreadEnableAlignmentFaultFixup:
     case ThreadEventPair_Reusable:
-    case ThreadQuerySetWin32StartAddress:
     case ThreadPerformanceCount:
     case ThreadAmILastThread:
     case ThreadIdealProcessor:
diff --git a/server/protocol.def b/server/protocol.def
index 0e1756c..a1ab2613 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -865,10 +865,12 @@ struct rawinput_device
     int          priority;     /* priority class */
     affinity_t   affinity;     /* affinity mask */
     obj_handle_t token;        /* impersonation token */
+    client_ptr_t entry_point;  /* thread entry point */
 @END
-#define SET_THREAD_INFO_PRIORITY 0x01
-#define SET_THREAD_INFO_AFFINITY 0x02
-#define SET_THREAD_INFO_TOKEN    0x04
+#define SET_THREAD_INFO_PRIORITY   0x01
+#define SET_THREAD_INFO_AFFINITY   0x02
+#define SET_THREAD_INFO_TOKEN      0x04
+#define SET_THREAD_INFO_ENTRYPOINT 0x08
 
 
 /* Retrieve information about a module */
diff --git a/server/thread.c b/server/thread.c
index afcb2dc..0311966 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -498,6 +498,8 @@ static void set_thread_info( struct thread *thread,
     }
     if (req->mask & SET_THREAD_INFO_TOKEN)
         security_set_thread_token( thread, req->token );
+    if (req->mask & SET_THREAD_INFO_ENTRYPOINT)
+        thread->entry_point = req->entry_point;
 }
 
 /* stop a thread (at the Unix level) */
-- 
2.4.5



More information about the wine-patches mailing list