From 6a9cca1ef833d5c39b770e4e8c869f581b671f93 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 18 Feb 2014 17:57:47 +0000 Subject: [PATCH] [NTOSKRNL] Implement TokenOrigin case in NtSetInformationToken svn path=/trunk/; revision=62246 --- reactos/ntoskrnl/se/token.c | 46 +++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 8f7449b9260..692cf301947 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -2042,13 +2042,44 @@ NtSetInformationToken(IN HANDLE TokenHandle, break; } - - case TokenOrigin: { - DPRINT1("Unhandled TokenInformationClass: 0x%lx\n", - TokenInformationClass); - Status = STATUS_NOT_IMPLEMENTED; + TOKEN_ORIGIN TokenOrigin; + + _SEH2_TRY + { + /* Copy the token origin */ + TokenOrigin = *(PTOKEN_ORIGIN)TokenInformation; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + goto Cleanup; + } + _SEH2_END; + + /* Check for TCB privilege */ + if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode)) + { + Status = STATUS_PRIVILEGE_NOT_HELD; + break; + } + + /* Lock the token */ + SepAcquireTokenLockExclusive(Token); + + /* Check if there is no token origin set yet */ + if ((Token->OriginatingLogonSession.LowPart == 0) && + (Token->OriginatingLogonSession.HighPart == 0)) + { + /* Set the token origin */ + Token->OriginatingLogonSession = + TokenOrigin.OriginatingLogonSession; + } + + /* Unlock the token */ + SepReleaseTokenLock(Token); + break; } @@ -2064,6 +2095,11 @@ Cleanup: ObDereferenceObject(Token); } + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetInformationToken failed with Status 0x%lx\n", Status); + } + return Status; }