X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fps%2Ftinfo.c;fp=ntoskrnl%2Fps%2Ftinfo.c;h=3c4e2b3d182957dde98fac986c7ceeb8cfa4fe99;hp=62675f6c76354c80206a38415fee37747d5f2fe6;hb=7c0cf90e3b750f1f0dc83b2eec9e5c68a512c30f;hpb=ee8b63255465d8c28be3e7bd11628015708fc1ab diff --git a/ntoskrnl/ps/tinfo.c b/ntoskrnl/ps/tinfo.c index 62675f6..3c4e2b3 100644 --- a/ntoskrnl/ps/tinfo.c +++ b/ntoskrnl/ps/tinfo.c @@ -7,12 +7,15 @@ * PROGRAMMER: David Welch (welch@mcmail.com) * UPDATE HISTORY: * Created 22/05/98 + * Updated 09/08/2003 by Skywing (skywing@valhallalegends.com) + * to suppport thread-eventpairs. */ /* INCLUDES *****************************************************************/ #include #include +#include #include #include @@ -106,8 +109,38 @@ NtSetInformationThread(HANDLE ThreadHandle, break; case ThreadEventPair: - Status = STATUS_NOT_IMPLEMENTED; - break; + { + PKEVENT_PAIR EventPair; + + if (ThreadInformationLength != sizeof(HANDLE)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + if (ExGetPreviousMode() == UserMode) /* FIXME: Validate this for all infoclasses and system services */ + { + DPRINT("NtSetInformationThread:ThreadEventPair: Checking user pointer %08x...\n", ThreadInformation); + ProbeForRead(ThreadInformation, sizeof(HANDLE), sizeof(HANDLE)); /* FIXME: This entire function should be + * wrapped in an SEH frame... return (NTSTATUS)GetExceptionCode() on exception */ + } + + Status = ObReferenceObjectByHandle(*(PHANDLE)ThreadInformation, + STANDARD_RIGHTS_ALL, + ExEventPairObjectType, + ExGetPreviousMode(), + (PVOID*)&EventPair, + NULL); + + if (!NT_SUCCESS(Status)) + { + break; + } + + ExpSwapThreadEventPair(Thread, EventPair); /* Note that the extra reference is kept intentionally */ + Status = STATUS_SUCCESS; + break; + } case ThreadQuerySetWin32StartAddress: if (ThreadInformationLength != sizeof(ULONG)) @@ -329,12 +362,18 @@ VOID KeSetPreviousMode(ULONG Mode) PsGetCurrentThread()->Tcb.PreviousMode = Mode; } +/* + * @implemented + */ ULONG STDCALL KeGetPreviousMode (VOID) { return (ULONG)PsGetCurrentThread()->Tcb.PreviousMode; } +/* + * @implemented + */ ULONG STDCALL ExGetPreviousMode (VOID) {