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=62246&r1=62245&r2=62246&view=diff
==============================================================================
--- 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;


Reply via email to