Alexandre Julliard : ntdll: Implement RtlCreateUserThread() on top of NtCreateThreadEx().
Alexandre Julliard
julliard at winehq.org
Fri Jun 5 14:16:51 CDT 2020
Module: wine
Branch: master
Commit: 39e7f25e0918d23e5b9ef5fc5049948b6f56525e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=39e7f25e0918d23e5b9ef5fc5049948b6f56525e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Jun 5 15:09:27 2020 +0200
ntdll: Implement RtlCreateUserThread() on top of NtCreateThreadEx().
Based on a patch by Andrew Wesie.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/thread.c | 43 ++++++++++++++++++++++++++++++++-----------
include/winternl.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 11 deletions(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 91a6a90d26..f2fa9a8b75 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -326,16 +326,33 @@ static void WINAPI call_thread_entry_point( LPTHREAD_START_ROUTINE entry, void *
* NtCreateThreadEx (NTDLL.@)
*/
NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle_ptr, ACCESS_MASK access, OBJECT_ATTRIBUTES *attr,
- HANDLE process, LPTHREAD_START_ROUTINE start, void *param,
- ULONG flags, ULONG zero_bits, ULONG stack_commit,
- ULONG stack_reserve, void *attribute_list )
+ HANDLE process, PRTL_THREAD_START_ROUTINE start, void *param,
+ ULONG flags, SIZE_T zero_bits, SIZE_T stack_commit,
+ SIZE_T stack_reserve, PS_ATTRIBUTE_LIST *attr_list )
{
- FIXME( "%p, %x, %p, %p, %p, %p, %x, %x, %x, %x, %p semi-stub!\n", handle_ptr, access, attr,
- process, start, param, flags, zero_bits, stack_commit, stack_reserve, attribute_list );
+ NTSTATUS status;
+ CLIENT_ID client_id;
- return RtlCreateUserThread( process, NULL, flags & THREAD_CREATE_FLAGS_CREATE_SUSPENDED,
- NULL, stack_reserve, stack_commit, (PRTL_THREAD_START_ROUTINE)start,
- param, handle_ptr, NULL );
+ if (!access) access = THREAD_ALL_ACCESS;
+
+ status = unix_funcs->create_thread( handle_ptr, access, attr, process,
+ start, param, call_thread_entry_point, flags,
+ stack_commit, stack_reserve, &client_id );
+ if (!status && attr_list)
+ {
+ SIZE_T i, count = (attr_list->TotalLength - sizeof(attr_list->TotalLength)) / sizeof(PS_ATTRIBUTE);
+ for (i = 0; i < count; i++)
+ {
+ if (attr_list->Attributes[i].Attribute == PS_ATTRIBUTE_CLIENT_ID)
+ {
+ SIZE_T size = min( attr_list->Attributes[i].Size, sizeof(client_id) );
+ memcpy( attr_list->Attributes[i].ValuePtr, &client_id, size );
+ if (attr_list->Attributes[i].ReturnLength) *attr_list->Attributes[i].ReturnLength = size;
+ }
+ else FIXME( "Unsupported attribute %08lx\n", attr_list->Attributes[i].Attribute );
+ }
+ }
+ return status;
}
@@ -353,12 +370,16 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, SECURITY_DESCRIPTOR *descr,
NTSTATUS status;
CLIENT_ID client_id;
OBJECT_ATTRIBUTES attr;
+ PS_ATTRIBUTE_LIST attr_list = { sizeof(attr_list) };
+
+ attr_list.Attributes[0].Attribute = PS_ATTRIBUTE_CLIENT_ID;
+ attr_list.Attributes[0].Size = sizeof(client_id);
+ attr_list.Attributes[0].ValuePtr = &client_id;
InitializeObjectAttributes( &attr, NULL, 0, NULL, descr );
- status = unix_funcs->create_thread( &handle, THREAD_ALL_ACCESS, &attr, process,
- start, param, call_thread_entry_point, flags,
- stack_commit, stack_reserve, &client_id );
+ status = NtCreateThreadEx( &handle, THREAD_ALL_ACCESS, &attr, process, start, param,
+ flags, 0, stack_commit, stack_reserve, &attr_list );
if (!status)
{
if (id) *id = client_id;
diff --git a/include/winternl.h b/include/winternl.h
index f362790dbc..2342835911 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -2453,6 +2453,55 @@ typedef LONG (CALLBACK *PRTL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS);
typedef void (CALLBACK *PTP_IO_CALLBACK)(PTP_CALLBACK_INSTANCE,void*,void*,IO_STATUS_BLOCK*,PTP_IO);
+#define PS_ATTRIBUTE_THREAD 0x00010000
+#define PS_ATTRIBUTE_INPUT 0x00020000
+#define PS_ATTRIBUTE_UNKNOWN 0x00040000
+
+typedef enum _PS_ATTRIBUTE_NUM
+{
+ PsAttributeParentProcess,
+ PsAttributeDebugPort,
+ PsAttributeToken,
+ PsAttributeClientId,
+ PsAttributeTebAddress,
+ PsAttributeImageName,
+ PsAttributeImageInfo,
+ PsAttributeMemoryReserve,
+ PsAttributePriorityClass,
+ PsAttributeErrorMode,
+ PsAttributeStdHandleInfo,
+ PsAttributeHandleList,
+ PsAttributeGroupAffinity,
+ PsAttributePreferredNode,
+ PsAttributeIdealProcessor,
+ PsAttributeUmsThread,
+ PsAttributeMitigationOptions,
+ PsAttributeProtectionLevel,
+ PsAttributeSecureProcess,
+ PsAttributeJobList,
+ PsAttributeMax
+} PS_ATTRIBUTE_NUM;
+
+#define PS_ATTRIBUTE_CLIENT_ID (PsAttributeClientId | PS_ATTRIBUTE_THREAD)
+
+typedef struct _PS_ATTRIBUTE
+{
+ ULONG_PTR Attribute;
+ SIZE_T Size;
+ union
+ {
+ ULONG_PTR Value;
+ void *ValuePtr;
+ };
+ SIZE_T *ReturnLength;
+} PS_ATTRIBUTE;
+
+typedef struct _PS_ATTRIBUTE_LIST
+{
+ SIZE_T TotalLength;
+ PS_ATTRIBUTE Attributes[1];
+} PS_ATTRIBUTE_LIST, *PPS_ATTRIBUTE_LIST;
+
/***********************************************************************
* Function declarations
*/
More information about the wine-cvs
mailing list