Author: tkreuzer Date: Tue Feb 18 17:57:47 2014 New Revision: 62246
URL: http://svn.reactos.org/svn/reactos?rev=62246&view=rev Log: [NTOSKRNL] Implement TokenOrigin case in NtSetInformationToken
Modified: trunk/reactos/ntoskrnl/se/token.c
Modified: trunk/reactos/ntoskrnl/se/token.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/token.c?rev=622... ============================================================================== --- trunk/reactos/ntoskrnl/se/token.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/se/token.c [iso-8859-1] Tue Feb 18 17:57:47 2014 @@ -2042,13 +2042,44 @@ 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; }
@@ -2062,6 +2093,11 @@ } Cleanup: ObDereferenceObject(Token); + } + + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetInformationToken failed with Status 0x%lx\n", Status); }
return Status;