Jacek Caban : server: Allow creating thread kernel objects.

Alexandre Julliard julliard at winehq.org
Mon Apr 8 15:12:01 CDT 2019


Module: wine
Branch: master
Commit: 4c0e81728f6db575d9cbd8feb8a5374f1adec9bb
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4c0e81728f6db575d9cbd8feb8a5374f1adec9bb

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Apr  8 14:03:38 2019 +0200

server: Allow creating thread kernel objects.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/tests/driver.c |  1 -
 server/thread.c                  | 10 +++++++++-
 server/thread.h                  |  1 +
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 4a564ef..50a1b99 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -822,7 +822,6 @@ static void test_ob_reference(const WCHAR *test_path)
 
     status = ObReferenceObjectByHandle(thread_handle, SYNCHRONIZE, *pPsThreadType, KernelMode, &obj2, NULL);
     ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
-    todo_wine
     ok(obj1 == obj2, "obj1 != obj2\n");
 
     ObDereferenceObject(obj1);
diff --git a/server/thread.c b/server/thread.c
index f5f98eb..b1d324f 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -133,6 +133,7 @@ static struct object_type *thread_get_type( struct object *obj );
 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 struct list *thread_get_kernel_obj_list( struct object *obj );
 static void destroy_thread( struct object *obj );
 
 static const struct object_ops thread_ops =
@@ -153,7 +154,7 @@ static const struct object_ops thread_ops =
     no_link_name,               /* link_name */
     NULL,                       /* unlink_name */
     no_open_file,               /* open_file */
-    no_kernel_obj_list,         /* get_kernel_obj_list */
+    thread_get_kernel_obj_list, /* get_kernel_obj_list */
     no_close_handle,            /* close_handle */
     destroy_thread              /* destroy */
 };
@@ -209,6 +210,7 @@ static inline void init_thread_structure( struct thread *thread )
     list_init( &thread->mutex_list );
     list_init( &thread->system_apc );
     list_init( &thread->user_apc );
+    list_init( &thread->kernel_object );
 
     for (i = 0; i < MAX_INFLIGHT_FDS; i++)
         thread->inflight[i].server = thread->inflight[i].client = -1;
@@ -304,6 +306,12 @@ static void thread_poll_event( struct fd *fd, int event )
     release_object( thread );
 }
 
+static struct list *thread_get_kernel_obj_list( struct object *obj )
+{
+    struct thread *thread = (struct thread *)obj;
+    return &thread->kernel_object;
+}
+
 /* cleanup everything that is no longer needed by a dead thread */
 /* used by destroy_thread and kill_thread */
 static void cleanup_thread( struct thread *thread )
diff --git a/server/thread.h b/server/thread.h
index e4332df..bafc08e 100644
--- a/server/thread.h
+++ b/server/thread.h
@@ -89,6 +89,7 @@ struct thread
     timeout_t              creation_time; /* Thread creation time */
     timeout_t              exit_time;     /* Thread exit time */
     struct token          *token;         /* security token associated with this thread */
+    struct list            kernel_object; /* list of kernel object pointers */
 };
 
 struct thread_snapshot




More information about the wine-cvs mailing list