[NTOSKRNL]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 18 Feb 2014 17:57:47 +0000 (17:57 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 18 Feb 2014 17:57:47 +0000 (17:57 +0000)
Implement TokenOrigin case in NtSetInformationToken

svn path=/trunk/; revision=62246

reactos/ntoskrnl/se/token.c

index 8f7449b..692cf30 100644 (file)
@@ -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;
 }