[PATCH 1/5] ntoskrnl.exe: Support creating thread objects from server handle.
Derek Lesho
dereklesho52 at gmail.com
Thu Mar 28 15:47:20 CDT 2019
Signed-off-by: Derek Lesho <dereklesho52 at Gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 13 ++++++++
dlls/ntoskrnl.exe/ntoskrnl_private.h | 4 +++
server/thread.c | 46 ++++++++++++++++------------
server/thread.h | 1 +
4 files changed, 45 insertions(+), 19 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 77a610d7db..fd75cdc886 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2484,15 +2484,28 @@ PEPROCESS WINAPI IoGetCurrentProcess(void)
}
+static void *create_thread_object( HANDLE handle );
+
static const WCHAR thread_type_name[] = {'T','h','r','e','a','d',0};
static struct _OBJECT_TYPE thread_type =
{
thread_type_name,
+ create_thread_object
};
POBJECT_TYPE PsThreadType = &thread_type;
+static void *create_thread_object( HANDLE handle )
+{
+ PETHREAD thread;
+
+ if (!(thread = alloc_kernel_object( PsThreadType, handle, sizeof(*thread), 0 ))) return NULL;
+
+ thread->Header.WaitListHead.Blink = INVALID_HANDLE_VALUE;
+ return thread;
+}
+
/***********************************************************************
* KeGetCurrentThread / PsGetCurrentThread (NTOSKRNL.EXE.@)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h
index 82ee18e56a..700738adc3 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl_private.h
+++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h
@@ -40,6 +40,10 @@ extern POBJECT_TYPE PsThreadType;
extern POBJECT_TYPE SeTokenObjectType;
+struct _ETHREAD {
+ DISPATCHER_HEADER Header;
+};
+
#ifdef __i386__
#define DEFINE_FASTCALL1_WRAPPER(func) \
__ASM_STDCALL_FUNC( __fastcall_ ## func, 4, \
diff --git a/server/thread.c b/server/thread.c
index f5f98ebef1..b524c64452 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -134,28 +134,29 @@ static int thread_signaled( struct object *obj, struct wait_queue_entry *entry )
static unsigned int thread_map_access( struct object *obj, unsigned int access );
static void thread_poll_event( struct fd *fd, int event );
static void destroy_thread( struct object *obj );
+static struct list *thread_get_kernel_object_list( struct object *obj );
static const struct object_ops thread_ops =
{
- sizeof(struct thread), /* size */
- dump_thread, /* dump */
- thread_get_type, /* get_type */
- add_queue, /* add_queue */
- remove_queue, /* remove_queue */
- thread_signaled, /* signaled */
- no_satisfied, /* satisfied */
- no_signal, /* signal */
- no_get_fd, /* get_fd */
- thread_map_access, /* map_access */
- default_get_sd, /* get_sd */
- default_set_sd, /* set_sd */
- no_lookup_name, /* lookup_name */
- no_link_name, /* link_name */
- NULL, /* unlink_name */
- no_open_file, /* open_file */
- no_kernel_obj_list, /* get_kernel_obj_list */
- no_close_handle, /* close_handle */
- destroy_thread /* destroy */
+ sizeof(struct thread), /* size */
+ dump_thread, /* dump */
+ thread_get_type, /* get_type */
+ add_queue, /* add_queue */
+ remove_queue, /* remove_queue */
+ thread_signaled, /* signaled */
+ no_satisfied, /* satisfied */
+ no_signal, /* signal */
+ no_get_fd, /* get_fd */
+ thread_map_access, /* map_access */
+ default_get_sd, /* get_sd */
+ default_set_sd, /* set_sd */
+ no_lookup_name, /* lookup_name */
+ no_link_name, /* link_name */
+ NULL, /* unlink_name */
+ no_open_file, /* open_file */
+ thread_get_kernel_object_list, /* get_kernel_obj_list */
+ no_close_handle, /* close_handle */
+ destroy_thread /* destroy */
};
static const struct fd_ops thread_fd_ops =
@@ -206,6 +207,7 @@ static inline void init_thread_structure( struct thread *thread )
thread->creation_time = current_time;
thread->exit_time = 0;
+ list_init( &thread->kernel_object );
list_init( &thread->mutex_list );
list_init( &thread->system_apc );
list_init( &thread->user_apc );
@@ -391,6 +393,12 @@ static unsigned int thread_map_access( struct object *obj, unsigned int access )
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
+static struct list *thread_get_kernel_object_list( struct object *obj )
+{
+ struct thread *thread = (struct thread *)obj;
+ return &thread->kernel_object;
+}
+
static void dump_thread_apc( struct object *obj, int verbose )
{
struct thread_apc *apc = (struct thread_apc *)obj;
diff --git a/server/thread.h b/server/thread.h
index e4332df4ab..758bbf7c8c 100644
--- a/server/thread.h
+++ b/server/thread.h
@@ -49,6 +49,7 @@ struct inflight_fd
struct thread
{
struct object obj; /* object header */
+ struct list kernel_object; /* list of kernel object pointers */
struct list entry; /* entry in system-wide thread list */
struct list proc_entry; /* entry in per-process thread list */
struct process *process;
--
2.20.1
More information about the wine-devel
mailing list