Module: wine Branch: master Commit: 95bd82eee5dd822e404c623ed08eb2d4156657b4 URL: https://source.winehq.org/git/wine.git/?a=commit;h=95bd82eee5dd822e404c623ed...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Apr 23 16:23:14 2019 +0200
ntoskrnl.exe: Return error codes compatible with recent Windows versions in PsLookupThreadByThreadId.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 9 +++++++-- dlls/ntoskrnl.exe/tests/driver.c | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 7f3ca05..f266dce 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -2558,13 +2558,18 @@ PRKTHREAD WINAPI KeGetCurrentThread(void) */ NTSTATUS WINAPI PsLookupThreadByThreadId( HANDLE threadid, PETHREAD *thread ) { + OBJECT_ATTRIBUTES attr; + CLIENT_ID cid; NTSTATUS status; HANDLE handle;
TRACE( "(%p %p)\n", threadid, thread );
- if (!(handle = OpenThread( THREAD_QUERY_INFORMATION, FALSE, HandleToUlong(threadid) ))) - return STATUS_INVALID_PARAMETER; + cid.UniqueProcess = 0; + cid.UniqueThread = threadid; + InitializeObjectAttributes( &attr, NULL, 0, NULL, NULL ); + status = NtOpenThread( &handle, THREAD_QUERY_INFORMATION, &attr, &cid ); + if (status) return status;
status = ObReferenceObjectByHandle( handle, THREAD_ALL_ACCESS, PsThreadType, KernelMode, (void**)thread, NULL );
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index d7083f7..5f65f66 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -170,6 +170,11 @@ static void winetest_end_todo(void) todo_level >>= 1; }
+static int broken(int condition) +{ + return !running_under_wine && condition; +} + #define ok(condition, ...) ok_(__FILE__, __LINE__, condition, __VA_ARGS__) #define todo_if(is_todo) for (winetest_start_todo(is_todo); \ winetest_loop_todo(); \ @@ -1179,7 +1184,8 @@ static void test_lookup_thread(void) if (thread) ObDereferenceObject(thread);
status = PsLookupThreadByThreadId(NULL, &thread); - ok(status == STATUS_INVALID_PARAMETER, "PsLookupThreadByThreadId returned %#x\n", status); + ok(status == STATUS_INVALID_CID || broken(status == STATUS_INVALID_PARAMETER) /* winxp */, + "PsLookupThreadByThreadId returned %#x\n", status); }
static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)