Jacek Caban : ntoskrnl.exe: Implement IoGetCurrentProcess.

Alexandre Julliard julliard at winehq.org
Mon Apr 29 16:08:50 CDT 2019


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Apr 29 16:00:32 2019 +0200

ntoskrnl.exe: Implement IoGetCurrentProcess.

Based on patch by Derek Lesho.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=29460
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c         | 12 ++++++++++--
 dlls/ntoskrnl.exe/ntoskrnl_private.h |  1 +
 dlls/ntoskrnl.exe/tests/driver.c     |  7 ++++++-
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index b353839..53a1bcd 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2477,8 +2477,7 @@ POBJECT_TYPE PsProcessType = &process_type;
  */
 PEPROCESS WINAPI IoGetCurrentProcess(void)
 {
-    FIXME("() stub\n");
-    return NULL;
+    return KeGetCurrentThread()->process;
 }
 
 /***********************************************************************
@@ -2505,6 +2504,7 @@ static void *create_thread_object( HANDLE handle )
 {
     THREAD_BASIC_INFORMATION info;
     struct _KTHREAD *thread;
+    HANDLE process;
 
     if (!(thread = alloc_kernel_object( PsThreadType, handle, sizeof(*thread), 0 ))) return NULL;
 
@@ -2512,7 +2512,15 @@ static void *create_thread_object( HANDLE handle )
     thread->header.WaitListHead.Blink = INVALID_HANDLE_VALUE; /* mark as kernel object */
 
     if (!NtQueryInformationThread( handle, ThreadBasicInformation, &info, sizeof(info), NULL ))
+    {
         thread->id = info.ClientId;
+        if ((process = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, HandleToUlong(thread->id.UniqueProcess) )))
+        {
+            kernel_object_from_handle( process, PsProcessType, (void**)&thread->process );
+            NtClose( process );
+        }
+    }
+
 
     return thread;
 }
diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h
index 5f30961..e580522 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl_private.h
+++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h
@@ -35,6 +35,7 @@ struct _EPROCESS {
 struct _KTHREAD
 {
     DISPATCHER_HEADER header;
+    PEPROCESS process;
     CLIENT_ID id;
 };
 
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 030c955..8dbae9d 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -321,14 +321,19 @@ static NTSTATUS wait_single_handle(HANDLE handle, ULONGLONG timeout)
 
 static void test_currentprocess(void)
 {
+    DISPATCHER_HEADER *header;
     PEPROCESS current;
     PETHREAD thread;
     NTSTATUS ret;
 
     current = IoGetCurrentProcess();
-todo_wine
     ok(current != NULL, "Expected current process to be non-NULL\n");
 
+    header = (DISPATCHER_HEADER*)current;
+    ok(header->Type == 3, "header->Type != 3, = %u\n", header->Type);
+    ret = wait_single(current, 0);
+    ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
     thread = PsGetCurrentThread();
     ret = wait_single( thread, 0 );
     ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);




More information about the wine-cvs mailing list