Module: wine Branch: master Commit: 6ebc223955417f111de337a4de371a4b58f804ae URL: https://source.winehq.org/git/wine.git/?a=commit;h=6ebc223955417f111de337a4d...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);