From f9e8538d240666f9a63beb92ffc15f02752c3a06 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Wed, 15 Apr 2009 11:57:48 +0000 Subject: [PATCH] - Implement ThreadPriorityBoost case in NtQueryInformationThread - Add ThreadDescriptorTableEntry case - Add check of parametres Approved by Aleksey. svn path=/trunk/; revision=40525 --- reactos/ntoskrnl/ps/query.c | 59 ++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/reactos/ntoskrnl/ps/query.c b/reactos/ntoskrnl/ps/query.c index 4baac972148..cd470ad623c 100644 --- a/reactos/ntoskrnl/ps/query.c +++ b/reactos/ntoskrnl/ps/query.c @@ -1306,17 +1306,27 @@ NtQueryInformationThread(IN HANDLE ThreadHandle, KIRQL OldIrql; PAGED_CODE(); - /* Verify Information Class validity */ -#if 0 - Status = DefaultQueryInfoBufferCheck(ThreadInformationClass, - PsThreadInfoClass, - RTL_NUMBER_OF(PsThreadInfoClass), - ThreadInformation, - ThreadInformationLength, - ReturnLength, - PreviousMode); - if (!NT_SUCCESS(Status)) return Status; -#endif + if (PreviousMode != KernelMode) + { + _SEH2_TRY + { + ProbeForWrite(ThreadInformation, + ThreadInformationLength, + sizeof(ULONG)); + + if (ReturnLength) + { + ProbeForWriteUlong(ReturnLength); + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + if (!NT_SUCCESS(Status)) return Status; + } /* Check what class this is */ Access = THREAD_QUERY_INFORMATION; @@ -1499,6 +1509,33 @@ NtQueryInformationThread(IN HANDLE ThreadHandle, KeLowerIrql(OldIrql); break; + case ThreadDescriptorTableEntry: + DPRINT1("NtQueryInformationThread(): case ThreadDescriptorTableEntry not implemented!\n"); + Status = STATUS_NOT_IMPLEMENTED; + break; + + case ThreadPriorityBoost: + + /* Set the return length*/ + Length = sizeof(ULONG); + + if (ThreadInformationLength != Length) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + _SEH2_TRY + { + *(PULONG)ThreadInformation = Thread->Tcb.DisableBoost ? 1 : 0; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + break; + /* Anything else */ default: