Alexandre Julliard : server: Send the zero_bits parameter for remote NtCreateThreadEx() calls.
Alexandre Julliard
julliard at winehq.org
Fri May 7 15:42:03 CDT 2021
Module: wine
Branch: master
Commit: 6a296592aa0fefeed6b7dd505b20c22c2d3174d6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6a296592aa0fefeed6b7dd505b20c22c2d3174d6
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri May 7 16:01:45 2021 +0200
server: Send the zero_bits parameter for remote NtCreateThreadEx() calls.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/server.c | 3 ++-
dlls/ntdll/unix/thread.c | 15 ++++++++-------
include/wine/server_protocol.h | 3 ++-
include/winternl.h | 2 +-
server/protocol.def | 1 +
server/trace.c | 1 +
6 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index ff632b7c6c0..8400c2930bb 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -550,6 +550,7 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result, BOO
CLIENT_ID id;
HANDLE handle;
TEB *teb;
+ ULONG_PTR zero_bits = call->create_thread.zero_bits;
SIZE_T reserve = call->create_thread.reserve;
SIZE_T commit = call->create_thread.commit;
void *func = wine_server_get_ptr( call->create_thread.func );
@@ -570,7 +571,7 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result, BOO
attr->Attributes[1].ReturnLength = NULL;
result->create_thread.status = NtCreateThreadEx( &handle, THREAD_ALL_ACCESS, NULL,
NtCurrentProcess(), func, arg,
- call->create_thread.flags, 0,
+ call->create_thread.flags, zero_bits,
commit, reserve, attr );
result->create_thread.handle = wine_server_obj_handle( handle );
result->create_thread.pid = HandleToULong(id.UniqueProcess);
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index a2b9569a7b9..4e0d8321061 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -161,7 +161,7 @@ NTSTATUS WINAPI NtCreateThread( HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRI
*/
NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBUTES *attr,
HANDLE process, PRTL_THREAD_START_ROUTINE start, void *param,
- ULONG flags, SIZE_T zero_bits, SIZE_T stack_commit,
+ ULONG flags, ULONG_PTR zero_bits, SIZE_T stack_commit,
SIZE_T stack_reserve, PS_ATTRIBUTE_LIST *attr_list )
{
sigset_t sigset;
@@ -185,12 +185,13 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATT
memset( &call, 0, sizeof(call) );
- call.create_thread.type = APC_CREATE_THREAD;
- call.create_thread.flags = flags;
- call.create_thread.func = wine_server_client_ptr( start );
- call.create_thread.arg = wine_server_client_ptr( param );
- call.create_thread.reserve = stack_reserve;
- call.create_thread.commit = stack_commit;
+ call.create_thread.type = APC_CREATE_THREAD;
+ call.create_thread.flags = flags;
+ call.create_thread.func = wine_server_client_ptr( start );
+ call.create_thread.arg = wine_server_client_ptr( param );
+ call.create_thread.zero_bits = zero_bits;
+ call.create_thread.reserve = stack_reserve;
+ call.create_thread.commit = stack_commit;
status = server_queue_process_apc( process, &call, &result );
if (status != STATUS_SUCCESS) return status;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 8ae313e6581..f326d78bc3c 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -564,6 +564,7 @@ typedef union
unsigned int flags;
client_ptr_t func;
client_ptr_t arg;
+ mem_size_t zero_bits;
mem_size_t reserve;
mem_size_t commit;
} create_thread;
@@ -6232,7 +6233,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 697
+#define SERVER_PROTOCOL_VERSION 698
/* ### protocol_version end ### */
diff --git a/include/winternl.h b/include/winternl.h
index 4ccd68daa5f..48ad80c6037 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -3678,7 +3678,7 @@ NTSYSAPI NTSTATUS WINAPI NtCreateSection(HANDLE*,ACCESS_MASK,const OBJECT_ATTRI
NTSYSAPI NTSTATUS WINAPI NtCreateSemaphore(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*,LONG,LONG);
NTSYSAPI NTSTATUS WINAPI NtCreateSymbolicLinkObject(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PUNICODE_STRING);
NTSYSAPI NTSTATUS WINAPI NtCreateThread(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,HANDLE,PCLIENT_ID,PCONTEXT,PINITIAL_TEB,BOOLEAN);
-NTSYSAPI NTSTATUS WINAPI NtCreateThreadEx(HANDLE*,ACCESS_MASK,OBJECT_ATTRIBUTES*,HANDLE,PRTL_THREAD_START_ROUTINE,void*,ULONG,SIZE_T,SIZE_T,SIZE_T,PS_ATTRIBUTE_LIST*);
+NTSYSAPI NTSTATUS WINAPI NtCreateThreadEx(HANDLE*,ACCESS_MASK,OBJECT_ATTRIBUTES*,HANDLE,PRTL_THREAD_START_ROUTINE,void*,ULONG,ULONG_PTR,SIZE_T,SIZE_T,PS_ATTRIBUTE_LIST*);
NTSYSAPI NTSTATUS WINAPI NtCreateTimer(HANDLE*, ACCESS_MASK, const OBJECT_ATTRIBUTES*, TIMER_TYPE);
NTSYSAPI NTSTATUS WINAPI NtCreateToken(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,TOKEN_TYPE,PLUID,PLARGE_INTEGER,PTOKEN_USER,PTOKEN_GROUPS,PTOKEN_PRIVILEGES,PTOKEN_OWNER,PTOKEN_PRIMARY_GROUP,PTOKEN_DEFAULT_DACL,PTOKEN_SOURCE);
NTSYSAPI NTSTATUS WINAPI NtCreateUserProcess(HANDLE*,HANDLE*,ACCESS_MASK,ACCESS_MASK,OBJECT_ATTRIBUTES*,OBJECT_ATTRIBUTES*,ULONG,ULONG,RTL_USER_PROCESS_PARAMETERS*,PS_CREATE_INFO*,PS_ATTRIBUTE_LIST*);
diff --git a/server/protocol.def b/server/protocol.def
index 9361933d47c..abfd6d70240 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -580,6 +580,7 @@ typedef union
unsigned int flags; /* creation flags */
client_ptr_t func; /* void (__stdcall *func)(void*); start function */
client_ptr_t arg; /* argument for start function */
+ mem_size_t zero_bits; /* number of zero high bits for thread stack */
mem_size_t reserve; /* reserve size for thread stack */
mem_size_t commit; /* commit size for thread stack */
} create_thread;
diff --git a/server/trace.c b/server/trace.c
index 0fccf47d16a..6b8c1ad3342 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -216,6 +216,7 @@ static void dump_apc_call( const char *prefix, const apc_call_t *call )
case APC_CREATE_THREAD:
dump_uint64( "APC_CREATE_THREAD,func=", &call->create_thread.func );
dump_uint64( ",arg=", &call->create_thread.arg );
+ dump_uint64( ",zero_bits=", &call->create_thread.zero_bits );
dump_uint64( ",reserve=", &call->create_thread.reserve );
dump_uint64( ",commit=", &call->create_thread.commit );
fprintf( stderr, ",flags=%x", call->create_thread.flags );
More information about the wine-cvs
mailing list