Jacek Caban : ntoskrnl.exe: Return error codes compatible with recent Windows versions in PsLookupThreadByThreadId.
Module: wine Branch: master Commit: 95bd82eee5dd822e404c623ed08eb2d4156657b4 URL: https://source.winehq.org/git/wine.git/?a=commit;h=95bd82eee5dd822e404c623ed... Author: Jacek Caban <jacek(a)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(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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)
participants (1)
-
Alexandre Julliard