NtAdjustPrivilegesToken: Probe and capture parameters before use.
[reactos.git] / reactos / ntoskrnl / se / token.c
index 44481d6..a7c6d5e 100644 (file)
@@ -25,16 +25,18 @@ ERESOURCE SepTokenLock;
 TOKEN_SOURCE SeSystemTokenSource = {"*SYSTEM*", {0}};
 LUID SeSystemAuthenticationId = SYSTEM_LUID;
 
-static GENERIC_MAPPING SepTokenMapping = {TOKEN_READ,
+static GENERIC_MAPPING SepTokenMapping = {
+    TOKEN_READ,
     TOKEN_WRITE,
     TOKEN_EXECUTE,
-TOKEN_ALL_ACCESS};
+    TOKEN_ALL_ACCESS
+};
 
 static const INFORMATION_CLASS_INFO SeTokenInformationClass[] = {
-    
+
     /* Class 0 not used, blame M$! */
     ICI_SQ_SAME( 0, 0, 0),
-    
+
     /* TokenUser */
     ICI_SQ_SAME( sizeof(TOKEN_USER),                   sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
     /* TokenGroups */
@@ -79,11 +81,11 @@ SepCompareTokens(IN PTOKEN FirstToken,
                  OUT PBOOLEAN Equal)
 {
     BOOLEAN Restricted, IsEqual = FALSE;
-    
+
     ASSERT(FirstToken != SecondToken);
-    
+
     /* FIXME: Check if every SID that is present in either token is also present in the other one */
-    
+
     Restricted = SeTokenIsRestricted(FirstToken);
     if (Restricted == SeTokenIsRestricted(SecondToken))
     {
@@ -91,10 +93,10 @@ SepCompareTokens(IN PTOKEN FirstToken,
         {
             /* FIXME: Check if every SID that is restricted in either token is also restricted in the other one */
         }
-        
+
         /* FIXME: Check if every privilege that is present in either token is also present in the other one */
     }
-    
+
     *Equal = IsEqual;
     return STATUS_SUCCESS;
 }
@@ -108,10 +110,11 @@ SepFreeProxyData(PVOID ProxyData)
 
 NTSTATUS
 NTAPI
-SepCopyProxyData(PVOID* Dest, PVOID Src)
+SepCopyProxyData(PVOID* Dest,
+                 PVOID Src)
 {
     UNIMPLEMENTED;
-    return(STATUS_NOT_IMPLEMENTED);
+    return STATUS_NOT_IMPLEMENTED;
 }
 
 NTSTATUS
@@ -122,24 +125,24 @@ SeExchangePrimaryToken(PEPROCESS Process,
 {
     PTOKEN OldToken;
     PTOKEN NewToken = (PTOKEN)NewTokenP;
-    
+
     PAGED_CODE();
-    
+
     if (NewToken->TokenType != TokenPrimary) return(STATUS_BAD_TOKEN_TYPE);
     if (NewToken->TokenInUse) return(STATUS_TOKEN_ALREADY_IN_USE);
-    
+
     /* Mark new token in use */
     NewToken->TokenInUse = 1;
-    
+
     /* Reference the New Token */
     ObReferenceObject(NewToken);
-    
+
     /* Replace the old with the new */
     OldToken = ObFastReplaceObject(&Process->Token, NewToken);
-    
+
     /* Mark the Old Token as free */
     OldToken->TokenInUse = 0;
-    
+
     *OldTokenP = (PACCESS_TOKEN)OldToken;
     return STATUS_SUCCESS;
 }
@@ -149,10 +152,10 @@ NTAPI
 SeDeassignPrimaryToken(PEPROCESS Process)
 {
     PTOKEN OldToken;
-    
+
     /* Remove the Token */
     OldToken = ObFastReplaceObject(&Process->Token, NULL);
-    
+
     /* Mark the Old Token as free */
     OldToken->TokenInUse = 0;
 }
@@ -163,14 +166,14 @@ RtlLengthSidAndAttributes(ULONG Count,
 {
     ULONG i;
     ULONG uLength;
-    
+
     PAGED_CODE();
-    
+
     uLength = Count * sizeof(SID_AND_ATTRIBUTES);
     for (i = 0; i < Count; i++)
         uLength += RtlLengthSid(Src[i].Sid);
-    
-    return(uLength);
+
+    return uLength;
 }
 
 
@@ -181,14 +184,14 @@ SepFindPrimaryGroupAndDefaultOwner(PTOKEN Token,
                                    PSID DefaultOwner)
 {
     ULONG i;
-    
+
     Token->PrimaryGroup = 0;
-    
+
     if (DefaultOwner)
     {
         Token->DefaultOwnerIndex = Token->UserAndGroupCount;
     }
-    
+
     /* Validate and set the primary group and user pointers */
     for (i = 0; i < Token->UserAndGroupCount; i++)
     {
@@ -197,24 +200,24 @@ SepFindPrimaryGroupAndDefaultOwner(PTOKEN Token,
         {
             Token->DefaultOwnerIndex = i;
         }
-        
+
         if (RtlEqualSid(Token->UserAndGroups[i].Sid, PrimaryGroup))
         {
             Token->PrimaryGroup = Token->UserAndGroups[i].Sid;
         }
     }
-    
+
     if (Token->DefaultOwnerIndex == Token->UserAndGroupCount)
     {
         return(STATUS_INVALID_OWNER);
     }
-    
+
     if (Token->PrimaryGroup == 0)
     {
         return(STATUS_INVALID_PRIMARY_GROUP);
     }
-    
-    return(STATUS_SUCCESS);
+
+    return STATUS_SUCCESS;
 }
 
 
@@ -233,9 +236,9 @@ SepDuplicateToken(PTOKEN Token,
     PVOID EndMem;
     PTOKEN AccessToken;
     NTSTATUS Status;
-    
+
     PAGED_CODE();
-    
+
     Status = ObCreateObject(PreviousMode,
                             SepTokenObjectType,
                             ObjectAttributes,
@@ -248,7 +251,7 @@ SepDuplicateToken(PTOKEN Token,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ObCreateObject() failed (Status %lx)\n", Status);
-        return(Status);
+        return Status;
     }
 
     /* Zero out the buffer */
@@ -258,22 +261,22 @@ SepDuplicateToken(PTOKEN Token,
     if (!NT_SUCCESS(Status))
     {
         ObDereferenceObject(AccessToken);
-        return(Status);
+        return Status;
     }
-    
+
     Status = ZwAllocateLocallyUniqueId(&AccessToken->ModifiedId);
     if (!NT_SUCCESS(Status))
     {
         ObDereferenceObject(AccessToken);
-        return(Status);
+        return Status;
     }
-    
+
     AccessToken->TokenLock = &SepTokenLock;
-    
+
     AccessToken->TokenType  = TokenType;
     AccessToken->ImpersonationLevel = Level;
     RtlCopyLuid(&AccessToken->AuthenticationId, &Token->AuthenticationId);
-    
+
     AccessToken->TokenSource.SourceIdentifier.LowPart = Token->TokenSource.SourceIdentifier.LowPart;
     AccessToken->TokenSource.SourceIdentifier.HighPart = Token->TokenSource.SourceIdentifier.HighPart;
     memcpy(AccessToken->TokenSource.SourceName,
@@ -282,18 +285,18 @@ SepDuplicateToken(PTOKEN Token,
     AccessToken->ExpirationTime.QuadPart = Token->ExpirationTime.QuadPart;
     AccessToken->UserAndGroupCount = Token->UserAndGroupCount;
     AccessToken->DefaultOwnerIndex = Token->DefaultOwnerIndex;
-    
+
     uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount;
     for (i = 0; i < Token->UserAndGroupCount; i++)
         uLength += RtlLengthSid(Token->UserAndGroups[i].Sid);
-    
+
     AccessToken->UserAndGroups =
     (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
                                                uLength,
                                                'uKOT');
-    
+
     EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount];
-    
+
     Status = RtlCopySidAndAttributesArray(AccessToken->UserAndGroupCount,
                                           Token->UserAndGroups,
                                           uLength,
@@ -308,17 +311,17 @@ SepDuplicateToken(PTOKEN Token,
                                                     Token->PrimaryGroup,
                                                     0);
     }
-    
+
     if (NT_SUCCESS(Status))
     {
         AccessToken->PrivilegeCount = Token->PrivilegeCount;
-        
+
         uLength = AccessToken->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES);
         AccessToken->Privileges =
         (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
                                                     uLength,
                                                     'pKOT');
-        
+
         for (i = 0; i < AccessToken->PrivilegeCount; i++)
         {
             RtlCopyLuid(&AccessToken->Privileges[i].Luid,
@@ -326,8 +329,8 @@ SepDuplicateToken(PTOKEN Token,
             AccessToken->Privileges[i].Attributes =
             Token->Privileges[i].Attributes;
         }
-        
-        if ( Token->DefaultDacl )
+
+        if (Token->DefaultDacl)
         {
             AccessToken->DefaultDacl =
             (PACL) ExAllocatePoolWithTag(PagedPool,
@@ -338,14 +341,14 @@ SepDuplicateToken(PTOKEN Token,
                    Token->DefaultDacl->AclSize);
         }
     }
-    
-    if ( NT_SUCCESS(Status) )
+
+    if (NT_SUCCESS(Status))
     {
         *NewAccessToken = AccessToken;
         return(STATUS_SUCCESS);
     }
-    
-    return(Status);
+
+    return Status;
 }
 
 NTSTATUS
@@ -358,7 +361,7 @@ SeSubProcessToken(IN PTOKEN ParentToken,
     PTOKEN NewToken;
     OBJECT_ATTRIBUTES ObjectAttributes;
     NTSTATUS Status;
-    
+
     /* Initialize the attributes and duplicate it */
     InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
     Status = SepDuplicateToken(ParentToken,
@@ -382,12 +385,12 @@ SeSubProcessToken(IN PTOKEN ParentToken,
             /* Set the session ID */
             NewToken->SessionId = SessionId;
             NewToken->TokenInUse = InUse;
-            
+
             /* Return the token */
             *Token = NewToken;
         }
     }
-    
+
     /* Return status */
     return Status;
 }
@@ -399,25 +402,25 @@ SeIsTokenChild(IN PTOKEN Token,
 {
     PTOKEN ProcessToken;
     LUID ProcessLuid, CallerLuid;
-    
+
     /* Assume failure */
     *IsChild = FALSE;
-    
+
     /* Reference the process token */
     ProcessToken = PsReferencePrimaryToken(PsGetCurrentProcess());
-    
+
     /* Get the ID */
     ProcessLuid = ProcessToken->TokenId;
-    
+
     /* Dereference the token */
     ObFastDereferenceObject(&PsGetCurrentProcess()->Token, ProcessToken);
-    
+
     /* Get our LUID */
     CallerLuid = Token->TokenId;
-    
+
     /* Compare the LUIDs */
     if (RtlEqualLuid(&CallerLuid, &ProcessLuid)) *IsChild = TRUE;
-    
+
     /* Return success */
     return STATUS_SUCCESS;
 }
@@ -431,9 +434,9 @@ SeCopyClientToken(IN PACCESS_TOKEN Token,
 {
     NTSTATUS Status;
     OBJECT_ATTRIBUTES ObjectAttributes;
-    
+
     PAGED_CODE();
-    
+
     InitializeObjectAttributes(&ObjectAttributes,
                                NULL,
                                0,
@@ -446,21 +449,22 @@ SeCopyClientToken(IN PACCESS_TOKEN Token,
                                Level,
                                PreviousMode,
                                (PTOKEN*)NewToken);
-    
-    return(Status);
+
+    return Status;
 }
 
-VOID NTAPI
+VOID
+NTAPI
 SepDeleteToken(PVOID ObjectBody)
 {
     PTOKEN AccessToken = (PTOKEN)ObjectBody;
-    
+
     if (AccessToken->UserAndGroups)
         ExFreePool(AccessToken->UserAndGroups);
-    
+
     if (AccessToken->Privileges)
         ExFreePool(AccessToken->Privileges);
-    
+
     if (AccessToken->DefaultDacl)
         ExFreePool(AccessToken->DefaultDacl);
 }
@@ -473,12 +477,12 @@ SepInitializeTokenImplementation(VOID)
 {
     UNICODE_STRING Name;
     OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
-    
+
     ExInitializeResource(&SepTokenLock);
-    
+
     DPRINT("Creating Token Object Type\n");
-    
-    /*  Initialize the Token type  */
+
+    /* Initialize the Token type */
     RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
     RtlInitUnicodeString(&Name, L"Token");
     ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
@@ -499,14 +503,14 @@ SeAssignPrimaryToken(IN PEPROCESS Process,
                      IN PTOKEN Token)
 {
     PAGED_CODE();
-    
+
     /* Sanity checks */
     ASSERT(Token->TokenType == TokenPrimary);
     ASSERT(!Token->TokenInUse);
-    
+
     /* Clean any previous token */
     if (Process->Token.Object) SeDeassignPrimaryToken(Process);
-    
+
     /* Set the new token */
     ObReferenceObject(Token);
     Token->TokenInUse = TRUE;
@@ -517,25 +521,25 @@ SeAssignPrimaryToken(IN PEPROCESS Process,
 NTSTATUS
 NTAPI
 SepCreateToken(OUT PHANDLE TokenHandle,
-              IN KPROCESSOR_MODE PreviousMode,
-              IN ACCESS_MASK DesiredAccess,
-              IN POBJECT_ATTRIBUTES ObjectAttributes,
-              IN TOKEN_TYPE TokenType,
-              IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
-              IN PLUID AuthenticationId,
-              IN PLARGE_INTEGER ExpirationTime,
-              IN PSID_AND_ATTRIBUTES User,
-              IN ULONG GroupCount,
-              IN PSID_AND_ATTRIBUTES Groups,
-              IN ULONG GroupLength,
-              IN ULONG PrivilegeCount,
-              IN PLUID_AND_ATTRIBUTES Privileges,
-              IN PSID Owner,
-              IN PSID PrimaryGroup,
-              IN PACL DefaultDacl,
-              IN PTOKEN_SOURCE TokenSource,
-              IN BOOLEAN SystemToken)
-{                  
+               IN KPROCESSOR_MODE PreviousMode,
+               IN ACCESS_MASK DesiredAccess,
+               IN POBJECT_ATTRIBUTES ObjectAttributes,
+               IN TOKEN_TYPE TokenType,
+               IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
+               IN PLUID AuthenticationId,
+               IN PLARGE_INTEGER ExpirationTime,
+               IN PSID_AND_ATTRIBUTES User,
+               IN ULONG GroupCount,
+               IN PSID_AND_ATTRIBUTES Groups,
+               IN ULONG GroupLength,
+               IN ULONG PrivilegeCount,
+               IN PLUID_AND_ATTRIBUTES Privileges,
+               IN PSID Owner,
+               IN PSID PrimaryGroup,
+               IN PACL DefaultDacl,
+               IN PTOKEN_SOURCE TokenSource,
+               IN BOOLEAN SystemToken)
+{
     PTOKEN AccessToken;
     LUID TokenId;
     LUID ModifiedId;
@@ -544,7 +548,7 @@ SepCreateToken(OUT PHANDLE TokenHandle,
     ULONG i;
     NTSTATUS Status;
     ULONG TokenFlags = 0;
-    
+
     /* Loop all groups */
     for (i = 0; i < GroupCount; i++)
     {
@@ -554,7 +558,7 @@ SepCreateToken(OUT PHANDLE TokenHandle,
             /* Force them to be enabled */
             Groups[i].Attributes |= (SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT);
         }
-        
+
         /* Check of the group is an admin group */
         if (RtlEqualSid(SeAliasAdminsSid, Groups[i].Sid))
         {
@@ -562,7 +566,7 @@ SepCreateToken(OUT PHANDLE TokenHandle,
             TokenFlags |= TOKEN_HAS_ADMIN_GROUP;
         }
     }
-    
+
     /* Loop all privileges */
     for (i = 0; i < PrivilegeCount; i++)
     {
@@ -577,12 +581,12 @@ SepCreateToken(OUT PHANDLE TokenHandle,
 
     Status = ZwAllocateLocallyUniqueId(&TokenId);
     if (!NT_SUCCESS(Status))
-        return(Status);
-    
+        return Status;
+
     Status = ZwAllocateLocallyUniqueId(&ModifiedId);
     if (!NT_SUCCESS(Status))
-        return(Status);
-    
+        return Status;
+
     Status = ObCreateObject(PreviousMode,
                             SepTokenObjectType,
                             ObjectAttributes,
@@ -595,50 +599,50 @@ SepCreateToken(OUT PHANDLE TokenHandle,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ObCreateObject() failed (Status %lx)\n");
-        return(Status);
+        return Status;
     }
 
     /* Zero out the buffer */
     RtlZeroMemory(AccessToken, sizeof(TOKEN));
-    
+
     AccessToken->TokenLock = &SepTokenLock;
-    
+
     RtlCopyLuid(&AccessToken->TokenSource.SourceIdentifier,
                 &TokenSource->SourceIdentifier);
     memcpy(AccessToken->TokenSource.SourceName,
            TokenSource->SourceName,
            sizeof(TokenSource->SourceName));
-    
+
     RtlCopyLuid(&AccessToken->TokenId, &TokenId);
     RtlCopyLuid(&AccessToken->AuthenticationId, AuthenticationId);
     AccessToken->ExpirationTime = *ExpirationTime;
     RtlCopyLuid(&AccessToken->ModifiedId, &ModifiedId);
-    
+
     AccessToken->UserAndGroupCount = GroupCount + 1;
     AccessToken->PrivilegeCount = PrivilegeCount;
-    
+
     AccessToken->TokenFlags = TokenFlags;
     AccessToken->TokenType = TokenType;
     AccessToken->ImpersonationLevel = ImpersonationLevel;
-    
+
     /*
      * Normally we would just point these members into the variable information
      * area; however, our ObCreateObject() call can't allocate a variable information
      * area, so we allocate them seperately and provide a destroy function.
      */
-    
+
     uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount;
     uLength += RtlLengthSid(User);
     for (i = 0; i < GroupCount; i++)
         uLength += RtlLengthSid(Groups[i].Sid);
-    
+
     AccessToken->UserAndGroups =
     (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
                                                uLength,
                                                'uKOT');
-    
+
     EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount];
-    
+
     Status = RtlCopySidAndAttributesArray(1,
                                           User,
                                           uLength,
@@ -656,7 +660,7 @@ SepCreateToken(OUT PHANDLE TokenHandle,
                                               &EndMem,
                                               &uLength);
     }
-    
+
     if (NT_SUCCESS(Status))
     {
         Status = SepFindPrimaryGroupAndDefaultOwner(
@@ -664,7 +668,7 @@ SepCreateToken(OUT PHANDLE TokenHandle,
                                                     PrimaryGroup,
                                                     Owner);
     }
-    
+
     if (NT_SUCCESS(Status))
     {
         uLength = PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES);
@@ -672,7 +676,7 @@ SepCreateToken(OUT PHANDLE TokenHandle,
         (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
                                                     uLength,
                                                     'pKOT');
-        
+
         if (PreviousMode != KernelMode)
         {
             _SEH2_TRY
@@ -694,7 +698,7 @@ SepCreateToken(OUT PHANDLE TokenHandle,
                           PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES));
         }
     }
-    
+
     if (NT_SUCCESS(Status))
     {
         AccessToken->DefaultDacl =
@@ -705,16 +709,15 @@ SepCreateToken(OUT PHANDLE TokenHandle,
                DefaultDacl,
                DefaultDacl->AclSize);
     }
-    
+
     if (!SystemToken)
     {
-        
-        Status = ObInsertObject ((PVOID)AccessToken,
-                                 NULL,
-                                 DesiredAccess,
-                                 0,
-                                 NULL,
-                                 TokenHandle);
+        Status = ObInsertObject((PVOID)AccessToken,
+                                NULL,
+                                DesiredAccess,
+                                0,
+                                NULL,
+                                TokenHandle);
         if (!NT_SUCCESS(Status))
         {
             DPRINT1("ObInsertObject() failed (Status %lx)\n", Status);
@@ -745,24 +748,24 @@ SepCreateSystemProcessToken(VOID)
     ULONG i;
     PTOKEN Token;
     NTSTATUS Status;
-    
+
     /* Don't ever expire */
     Expiration.QuadPart = -1;
-    
+
     /* All groups mandatory and enabled */
     GroupAttributes = SE_GROUP_ENABLED | SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT;
     OwnerAttributes = SE_GROUP_ENABLED | SE_GROUP_OWNER | SE_GROUP_ENABLED_BY_DEFAULT;
-    
+
     /* User is system */
     UserSid.Sid = SeLocalSystemSid;
     UserSid.Attributes = 0;
-    
+
     /* Primary group is local system */
     PrimaryGroup = SeLocalSystemSid;
-    
+
     /* Owner is admins */
     Owner = SeAliasAdminsSid;
-    
+
     /* Groups are admins, world, and authenticated users */
     Groups[0].Sid = SeAliasAdminsSid;
     Groups[0].Attributes = OwnerAttributes;
@@ -780,69 +783,69 @@ SepCreateSystemProcessToken(VOID)
     i = 0;
     Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeTcbPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeCreateTokenPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeTakeOwnershipPrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeCreatePagefilePrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeLockMemoryPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeAssignPrimaryTokenPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeIncreaseQuotaPrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeIncreaseBasePriorityPrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeCreatePermanentPrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeDebugPrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeAuditPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeSecurityPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeSystemEnvironmentPrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeChangeNotifyPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeBackupPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeRestorePrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeShutdownPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeLoadDriverPrivilege;
-    
-    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
     Privileges[i++].Luid = SeProfileSingleProcessPrivilege;
-    
+
     Privileges[i].Attributes = 0;
     Privileges[i++].Luid = SeSystemtimePrivilege;
     ASSERT(i == 20);
-    
+
     /* Setup the object attributes */
     InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
     ASSERT(SeSystemDefaultDacl != NULL);
-    
+
     /* Create the token */
     Status = SepCreateToken((PHANDLE)&Token,
                             KernelMode,
@@ -864,13 +867,13 @@ SepCreateSystemProcessToken(VOID)
                             &SeSystemTokenSource,
                             TRUE);
     ASSERT(Status == STATUS_SUCCESS);
-    
+
     /* Return the token */
     return Token;
 }
 
 /* PUBLIC FUNCTIONS ***********************************************************/
+
 /*
  * @unimplemented
  */
@@ -915,14 +918,15 @@ SeQuerySessionIdToken(IN PACCESS_TOKEN Token,
 /*
  * @implemented
  */
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
 SeQueryAuthenticationIdToken(IN PACCESS_TOKEN Token,
                              OUT PLUID LogonId)
 {
     PAGED_CODE();
-    
+
     *LogonId = ((PTOKEN)Token)->AuthenticationId;
-    
+
     return STATUS_SUCCESS;
 }
 
@@ -935,7 +939,7 @@ NTAPI
 SeTokenImpersonationLevel(IN PACCESS_TOKEN Token)
 {
     PAGED_CODE();
-    
+
     return ((PTOKEN)Token)->ImpersonationLevel;
 }
 
@@ -947,7 +951,7 @@ TOKEN_TYPE NTAPI
 SeTokenType(IN PACCESS_TOKEN Token)
 {
     PAGED_CODE();
-    
+
     return ((PTOKEN)Token)->TokenType;
 }
 
@@ -960,6 +964,7 @@ NTAPI
 SeTokenIsAdmin(IN PACCESS_TOKEN Token)
 {
     PAGED_CODE();
+
     return (((PTOKEN)Token)->TokenFlags & TOKEN_WRITE_RESTRICTED) != 0;
 }
 
@@ -971,6 +976,7 @@ NTAPI
 SeTokenIsRestricted(IN PACCESS_TOKEN Token)
 {
     PAGED_CODE();
+
     return (((PTOKEN)Token)->TokenFlags & TOKEN_IS_RESTRICTED) != 0;
 }
 
@@ -982,6 +988,7 @@ NTAPI
 SeTokenIsWriteRestricted(IN PACCESS_TOKEN Token)
 {
     PAGED_CODE();
+
     return (((PTOKEN)Token)->TokenFlags & TOKEN_HAS_RESTORE_PRIVILEGE) != 0;
 }
 
@@ -1006,11 +1013,11 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
     ULONG RequiredLength;
     KPROCESSOR_MODE PreviousMode;
     NTSTATUS Status = STATUS_SUCCESS;
-    
+
     PAGED_CODE();
-    
+
     PreviousMode = ExGetPreviousMode();
-    
+
     /* Check buffers and class validity */
     Status = DefaultQueryInfoBufferCheck(TokenInformationClass,
                                          SeTokenInformationClass,
@@ -1020,13 +1027,12 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                                          ReturnLength,
                                          NULL,
                                          PreviousMode);
-    
-    if(!NT_SUCCESS(Status))
+    if (!NT_SUCCESS(Status))
     {
         DPRINT("NtQueryInformationToken() failed, Status: 0x%x\n", Status);
         return Status;
     }
-    
+
     Status = ObReferenceObjectByHandle(TokenHandle,
                                        (TokenInformationClass == TokenSource) ? TOKEN_QUERY_SOURCE : TOKEN_QUERY,
                                        SepTokenObjectType,
@@ -1040,14 +1046,14 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
             case TokenUser:
             {
                 PTOKEN_USER tu = (PTOKEN_USER)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenUser)\n");
                 RequiredLength = sizeof(TOKEN_USER) +
                 RtlLengthSid(Token->UserAndGroups[0].Sid);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         Status = RtlCopySidAndAttributesArray(1,
                                                               &Token->UserAndGroups[0],
@@ -1061,8 +1067,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1072,27 +1078,27 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenGroups:
             {
                 PTOKEN_GROUPS tg = (PTOKEN_GROUPS)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenGroups)\n");
                 RequiredLength = sizeof(tg->GroupCount) +
                 RtlLengthSidAndAttributes(Token->UserAndGroupCount - 1, &Token->UserAndGroups[1]);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         ULONG SidLen = RequiredLength - sizeof(tg->GroupCount) -
                         ((Token->UserAndGroupCount - 1) * sizeof(SID_AND_ATTRIBUTES));
                         PSID_AND_ATTRIBUTES Sid = (PSID_AND_ATTRIBUTES)((ULONG_PTR)TokenInformation + sizeof(tg->GroupCount) +
                                                                         ((Token->UserAndGroupCount - 1) * sizeof(SID_AND_ATTRIBUTES)));
-                        
+
                         tg->GroupCount = Token->UserAndGroupCount - 1;
                         Status = RtlCopySidAndAttributesArray(Token->UserAndGroupCount - 1,
                                                               &Token->UserAndGroups[1],
@@ -1106,8 +1112,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1117,21 +1123,21 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenPrivileges:
             {
                 PTOKEN_PRIVILEGES tp = (PTOKEN_PRIVILEGES)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenPrivileges)\n");
                 RequiredLength = sizeof(tp->PrivilegeCount) +
                 (Token->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES));
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         tp->PrivilegeCount = Token->PrivilegeCount;
                         RtlCopyLuidAndAttributesArray(Token->PrivilegeCount,
@@ -1142,8 +1148,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1153,22 +1159,22 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenOwner:
             {
                 ULONG SidLen;
                 PTOKEN_OWNER to = (PTOKEN_OWNER)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenOwner)\n");
                 SidLen = RtlLengthSid(Token->UserAndGroups[Token->DefaultOwnerIndex].Sid);
                 RequiredLength = sizeof(TOKEN_OWNER) + SidLen;
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         to->Owner = (PSID)(to + 1);
                         Status = RtlCopySid(SidLen,
@@ -1179,8 +1185,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1190,22 +1196,22 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenPrimaryGroup:
             {
                 ULONG SidLen;
                 PTOKEN_PRIMARY_GROUP tpg = (PTOKEN_PRIMARY_GROUP)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenPrimaryGroup)\n");
                 SidLen = RtlLengthSid(Token->PrimaryGroup);
                 RequiredLength = sizeof(TOKEN_PRIMARY_GROUP) + SidLen;
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         tpg->PrimaryGroup = (PSID)(tpg + 1);
                         Status = RtlCopySid(SidLen,
@@ -1216,8 +1222,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1227,27 +1233,27 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenDefaultDacl:
             {
                 PTOKEN_DEFAULT_DACL tdd = (PTOKEN_DEFAULT_DACL)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenDefaultDacl)\n");
                 RequiredLength = sizeof(TOKEN_DEFAULT_DACL);
-                
-                if(Token->DefaultDacl != NULL)
+
+                if (Token->DefaultDacl != NULL)
                 {
                     RequiredLength += Token->DefaultDacl->AclSize;
                 }
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
-                        if(Token->DefaultDacl != NULL)
+                        if (Token->DefaultDacl != NULL)
                         {
                             tdd->DefaultDacl = (PACL)(tdd + 1);
                             RtlCopyMemory(tdd->DefaultDacl,
@@ -1263,8 +1269,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1274,20 +1280,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenSource:
             {
                 PTOKEN_SOURCE ts = (PTOKEN_SOURCE)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenSource)\n");
                 RequiredLength = sizeof(TOKEN_SOURCE);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         *ts = Token->TokenSource;
                     }
@@ -1295,8 +1301,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1306,20 +1312,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenType:
             {
                 PTOKEN_TYPE tt = (PTOKEN_TYPE)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenType)\n");
                 RequiredLength = sizeof(TOKEN_TYPE);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         *tt = Token->TokenType;
                     }
@@ -1327,8 +1333,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1338,20 +1344,28 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenImpersonationLevel:
             {
                 PSECURITY_IMPERSONATION_LEVEL sil = (PSECURITY_IMPERSONATION_LEVEL)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenImpersonationLevel)\n");
+
+                /* Fail if the token is not an impersonation token */
+                if (Token->TokenType != TokenImpersonation)
+                {
+                    Status = STATUS_INVALID_INFO_CLASS;
+                    break;
+                }
+
                 RequiredLength = sizeof(SECURITY_IMPERSONATION_LEVEL);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         *sil = Token->ImpersonationLevel;
                     }
@@ -1359,8 +1373,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1370,20 +1384,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenStatistics:
             {
                 PTOKEN_STATISTICS ts = (PTOKEN_STATISTICS)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenStatistics)\n");
                 RequiredLength = sizeof(TOKEN_STATISTICS);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         ts->TokenId = Token->TokenId;
                         ts->AuthenticationId = Token->AuthenticationId;
@@ -1400,8 +1414,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1411,20 +1425,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenOrigin:
             {
                 PTOKEN_ORIGIN to = (PTOKEN_ORIGIN)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenOrigin)\n");
                 RequiredLength = sizeof(TOKEN_ORIGIN);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         RtlCopyLuid(&to->OriginatingLogonSession,
                                     &Token->AuthenticationId);
@@ -1433,8 +1447,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1444,32 +1458,32 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenGroupsAndPrivileges:
                 DPRINT1("NtQueryInformationToken(TokenGroupsAndPrivileges) not implemented\n");
                 Status = STATUS_NOT_IMPLEMENTED;
                 break;
-                
+
             case TokenRestrictedSids:
             {
                 PTOKEN_GROUPS tg = (PTOKEN_GROUPS)TokenInformation;
-                
+
                 DPRINT("NtQueryInformationToken(TokenRestrictedSids)\n");
                 RequiredLength = sizeof(tg->GroupCount) +
                 RtlLengthSidAndAttributes(Token->RestrictedSidCount, Token->RestrictedSids);
-                
+
                 _SEH2_TRY
                 {
-                    if(TokenInformationLength >= RequiredLength)
+                    if (TokenInformationLength >= RequiredLength)
                     {
                         ULONG SidLen = RequiredLength - sizeof(tg->GroupCount) -
                         (Token->RestrictedSidCount * sizeof(SID_AND_ATTRIBUTES));
                         PSID_AND_ATTRIBUTES Sid = (PSID_AND_ATTRIBUTES)((ULONG_PTR)TokenInformation + sizeof(tg->GroupCount) +
                                                                         (Token->RestrictedSidCount * sizeof(SID_AND_ATTRIBUTES)));
-                        
+
                         tg->GroupCount = Token->RestrictedSidCount;
                         Status = RtlCopySidAndAttributesArray(Token->RestrictedSidCount,
                                                               Token->RestrictedSids,
@@ -1483,8 +1497,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     {
                         Status = STATUS_BUFFER_TOO_SMALL;
                     }
-                    
-                    if(ReturnLength != NULL)
+
+                    if (ReturnLength != NULL)
                     {
                         *ReturnLength = RequiredLength;
                     }
@@ -1494,32 +1508,32 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     Status = _SEH2_GetExceptionCode();
                 }
                 _SEH2_END;
-                
+
                 break;
             }
-                
+
             case TokenSandBoxInert:
                 DPRINT1("NtQueryInformationToken(TokenSandboxInert) not implemented\n");
                 Status = STATUS_NOT_IMPLEMENTED;
                 break;
-                
+
             case TokenSessionId:
             {
                 ULONG SessionId = 0;
-                
+
                 DPRINT("NtQueryInformationToken(TokenSessionId)\n");
-                
+
                 Status = SeQuerySessionIdToken(Token,
                                                &SessionId);
-                
-                if(NT_SUCCESS(Status))
+
+                if (NT_SUCCESS(Status))
                 {
                     _SEH2_TRY
                     {
                         /* buffer size was already verified, no need to check here again */
                         *(PULONG)TokenInformation = SessionId;
-                        
-                        if(ReturnLength != NULL)
+
+                        if (ReturnLength != NULL)
                         {
                             *ReturnLength = sizeof(ULONG);
                         }
@@ -1530,20 +1544,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
                     }
                     _SEH2_END;
                 }
-                
+
                 break;
             }
-                
+
             default:
                 DPRINT1("NtQueryInformationToken(%d) invalid information class\n", TokenInformationClass);
                 Status = STATUS_INVALID_INFO_CLASS;
                 break;
         }
-        
+
         ObDereferenceObject(Token);
     }
-    
-    return(Status);
+
+    return Status;
 }
 
 
@@ -1563,30 +1577,29 @@ NtSetInformationToken(IN HANDLE TokenHandle,
     KPROCESSOR_MODE PreviousMode;
     ULONG NeededAccess = TOKEN_ADJUST_DEFAULT;
     NTSTATUS Status;
-    
+
     PAGED_CODE();
-    
+
     PreviousMode = ExGetPreviousMode();
-    
+
     Status = DefaultSetInfoBufferCheck(TokenInformationClass,
                                        SeTokenInformationClass,
                                        sizeof(SeTokenInformationClass) / sizeof(SeTokenInformationClass[0]),
                                        TokenInformation,
                                        TokenInformationLength,
                                        PreviousMode);
-    
-    if(!NT_SUCCESS(Status))
+    if (!NT_SUCCESS(Status))
     {
         /* Invalid buffers */
         DPRINT("NtSetInformationToken() failed, Status: 0x%x\n", Status);
         return Status;
     }
-    
-    if(TokenInformationClass == TokenSessionId)
+
+    if (TokenInformationClass == TokenSessionId)
     {
         NeededAccess |= TOKEN_ADJUST_SESSIONID;
     }
-    
+
     Status = ObReferenceObjectByHandle(TokenHandle,
                                        NeededAccess,
                                        SepTokenObjectType,
@@ -1599,11 +1612,11 @@ NtSetInformationToken(IN HANDLE TokenHandle,
         {
             case TokenOwner:
             {
-                if(TokenInformationLength >= sizeof(TOKEN_OWNER))
+                if (TokenInformationLength >= sizeof(TOKEN_OWNER))
                 {
                     PTOKEN_OWNER to = (PTOKEN_OWNER)TokenInformation;
                     PSID InputSid = NULL, CapturedSid;
-                    
+
                     _SEH2_TRY
                     {
                         InputSid = to->Owner;
@@ -1613,13 +1626,13 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                         _SEH2_YIELD(return _SEH2_GetExceptionCode());
                     }
                     _SEH2_END;
-                    
+
                     Status = SepCaptureSid(InputSid,
                                            PreviousMode,
                                            PagedPool,
                                            FALSE,
                                            &CapturedSid);
-                    if(NT_SUCCESS(Status))
+                    if (NT_SUCCESS(Status))
                     {
                         RtlCopySid(RtlLengthSid(CapturedSid),
                                    Token->UserAndGroups[Token->DefaultOwnerIndex].Sid,
@@ -1635,14 +1648,14 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                 }
                 break;
             }
-                
+
             case TokenPrimaryGroup:
             {
-                if(TokenInformationLength >= sizeof(TOKEN_PRIMARY_GROUP))
+                if (TokenInformationLength >= sizeof(TOKEN_PRIMARY_GROUP))
                 {
                     PTOKEN_PRIMARY_GROUP tpg = (PTOKEN_PRIMARY_GROUP)TokenInformation;
                     PSID InputSid = NULL, CapturedSid;
-                    
+
                     _SEH2_TRY
                     {
                         InputSid = tpg->PrimaryGroup;
@@ -1652,13 +1665,13 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                         _SEH2_YIELD(return _SEH2_GetExceptionCode());
                     }
                     _SEH2_END;
-                    
+
                     Status = SepCaptureSid(InputSid,
                                            PreviousMode,
                                            PagedPool,
                                            FALSE,
                                            &CapturedSid);
-                    if(NT_SUCCESS(Status))
+                    if (NT_SUCCESS(Status))
                     {
                         RtlCopySid(RtlLengthSid(CapturedSid),
                                    Token->PrimaryGroup,
@@ -1674,14 +1687,14 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                 }
                 break;
             }
-                
+
             case TokenDefaultDacl:
             {
-                if(TokenInformationLength >= sizeof(TOKEN_DEFAULT_DACL))
+                if (TokenInformationLength >= sizeof(TOKEN_DEFAULT_DACL))
                 {
                     PTOKEN_DEFAULT_DACL tdd = (PTOKEN_DEFAULT_DACL)TokenInformation;
                     PACL InputAcl = NULL;
-                    
+
                     _SEH2_TRY
                     {
                         InputAcl = tdd->DefaultDacl;
@@ -1692,32 +1705,32 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                     }
                     _SEH2_END;
 
-                    if(InputAcl != NULL)
+                    if (InputAcl != NULL)
                     {
                         PACL CapturedAcl;
 
-                        /* capture and copy the dacl */
+                        /* Capture and copy the dacl */
                         Status = SepCaptureAcl(InputAcl,
                                                PreviousMode,
                                                PagedPool,
                                                TRUE,
                                                &CapturedAcl);
-                        if(NT_SUCCESS(Status))
+                        if (NT_SUCCESS(Status))
                         {
-                            /* free the previous dacl if present */
+                            /* Free the previous dacl if present */
                             if(Token->DefaultDacl != NULL)
                             {
                                 ExFreePool(Token->DefaultDacl);
                             }
 
-                            /* set the new dacl */
+                            /* Set the new dacl */
                             Token->DefaultDacl = CapturedAcl;
                         }
                     }
                     else
                     {
-                        /* clear and free the default dacl if present */
-                        if(Token->DefaultDacl != NULL)
+                        /* Clear and free the default dacl if present */
+                        if (Token->DefaultDacl != NULL)
                         {
                             ExFreePool(Token->DefaultDacl);
                             Token->DefaultDacl = NULL;
@@ -1730,14 +1743,14 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                 }
                 break;
             }
-                
+
             case TokenSessionId:
             {
                 ULONG SessionId = 0;
-                
+
                 _SEH2_TRY
                 {
-                    /* buffer size was already verified, no need to check here again */
+                    /* Buffer size was already verified, no need to check here again */
                     SessionId = *(PULONG)TokenInformation;
                 }
                 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
@@ -1745,9 +1758,9 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                     _SEH2_YIELD(return _SEH2_GetExceptionCode());
                 }
                 _SEH2_END;
-                
-                if(!SeSinglePrivilegeCheck(SeTcbPrivilege,
-                                           PreviousMode))
+
+                if (!SeSinglePrivilegeCheck(SeTcbPrivilege,
+                                            PreviousMode))
                 {
                     Status = STATUS_PRIVILEGE_NOT_HELD;
                     break;
@@ -1756,18 +1769,18 @@ NtSetInformationToken(IN HANDLE TokenHandle,
                 Token->SessionId = SessionId;
                 break;
             }
-                
+
             default:
             {
                 Status = STATUS_NOT_IMPLEMENTED;
                 break;
             }
         }
-        
+
         ObDereferenceObject(Token);
     }
-    
-    return(Status);
+
+    return Status;
 }
 
 
@@ -1793,12 +1806,17 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle,
     PTOKEN NewToken;
     PSECURITY_QUALITY_OF_SERVICE CapturedSecurityQualityOfService;
     BOOLEAN QoSPresent;
+    OBJECT_HANDLE_INFORMATION HandleInformation;
     NTSTATUS Status;
-    
+
     PAGED_CODE();
-    
+
+    if (TokenType != TokenImpersonation &&
+        TokenType != TokenPrimary)
+        return STATUS_INVALID_PARAMETER;
+
     PreviousMode = KeGetPreviousMode();
-    
+
     if (PreviousMode != KernelMode)
     {
         _SEH2_TRY
@@ -1812,66 +1830,103 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle,
         }
         _SEH2_END;
     }
-    
+
     Status = SepCaptureSecurityQualityOfService(ObjectAttributes,
                                                 PreviousMode,
                                                 PagedPool,
                                                 FALSE,
                                                 &CapturedSecurityQualityOfService,
                                                 &QoSPresent);
-    if(!NT_SUCCESS(Status))
+    if (!NT_SUCCESS(Status))
     {
         DPRINT1("NtDuplicateToken() failed to capture QoS! Status: 0x%x\n", Status);
         return Status;
     }
-    
+
     Status = ObReferenceObjectByHandle(ExistingTokenHandle,
                                        TOKEN_DUPLICATE,
                                        SepTokenObjectType,
                                        PreviousMode,
                                        (PVOID*)&Token,
-                                       NULL);
-    if (NT_SUCCESS(Status))
+                                       &HandleInformation);
+    if (!NT_SUCCESS(Status))
+    {
+        SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService,
+                                           PreviousMode,
+                                           FALSE);
+        return Status;
+    }
+
+    /*
+     * Fail, if the original token is an impersonation token and the caller
+     * tries to raise the impersonation level of the new token above the
+     * impersonation level of the original token.
+     */
+    if (Token->TokenType == TokenImpersonation)
+    {
+        if (QoSPresent &&
+            CapturedSecurityQualityOfService->ImpersonationLevel >Token->ImpersonationLevel)
+        {
+            ObDereferenceObject(Token);
+            SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService,
+                                               PreviousMode,
+                                               FALSE);
+            return STATUS_BAD_IMPERSONATION_LEVEL;
+        }
+    }
+
+    /*
+     * Fail, if a primary token is to be created from an impersonation token
+     * and and the impersonation level of the impersonation token is below SecurityImpersonation.
+     */
+    if (Token->TokenType == TokenImpersonation &&
+        TokenType == TokenPrimary &&
+        Token->ImpersonationLevel < SecurityImpersonation)
     {
-        Status = SepDuplicateToken(Token,
-                                   ObjectAttributes,
-                                   EffectiveOnly,
-                                   TokenType,
-                                   (QoSPresent ? CapturedSecurityQualityOfService->ImpersonationLevel : SecurityAnonymous),
-                                   PreviousMode,
-                                   &NewToken);
-        
         ObDereferenceObject(Token);
-        
+        SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService,
+                                           PreviousMode,
+                                           FALSE);
+        return STATUS_BAD_IMPERSONATION_LEVEL;
+    }
+
+    Status = SepDuplicateToken(Token,
+                               ObjectAttributes,
+                               EffectiveOnly,
+                               TokenType,
+                               (QoSPresent ? CapturedSecurityQualityOfService->ImpersonationLevel : SecurityAnonymous),
+                               PreviousMode,
+                               &NewToken);
+
+    ObDereferenceObject(Token);
+
+    if (NT_SUCCESS(Status))
+    {
+        Status = ObInsertObject((PVOID)NewToken,
+                                NULL,
+                                (DesiredAccess ? DesiredAccess : HandleInformation.GrantedAccess),
+                                0,
+                                NULL,
+                                &hToken);
         if (NT_SUCCESS(Status))
         {
-            Status = ObInsertObject((PVOID)NewToken,
-                                    NULL,
-                                    DesiredAccess,
-                                    0,
-                                    NULL,
-                                    &hToken);
-            
-            if (NT_SUCCESS(Status))
+            _SEH2_TRY
             {
-                _SEH2_TRY
-                {
-                    *NewTokenHandle = hToken;
-                }
-                _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-                {
-                    Status = _SEH2_GetExceptionCode();
-                }
-                _SEH2_END;
+                *NewTokenHandle = hToken;
             }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                Status = _SEH2_GetExceptionCode();
+            }
+            _SEH2_END;
         }
     }
-    
-    /* free the captured structure */
+
+    /* Free the captured structure */
     SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService,
                                        PreviousMode,
                                        FALSE);
-    
+
     return Status;
 }
 
@@ -1891,18 +1946,20 @@ NtAdjustGroupsToken(IN HANDLE TokenHandle,
  * @implemented
  */
 NTSTATUS NTAPI
-NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
-                         IN BOOLEAN DisableAllPrivileges,
-                         IN PTOKEN_PRIVILEGES NewState,
-                         IN ULONG BufferLength,
-                         OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL,
-                         OUT PULONG ReturnLength OPTIONAL)
+NtAdjustPrivilegesToken(IN HANDLE TokenHandle,
+                        IN BOOLEAN DisableAllPrivileges,
+                        IN PTOKEN_PRIVILEGES NewState,
+                        IN ULONG BufferLength,
+                        OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL,
+                        OUT PULONG ReturnLength OPTIONAL)
 {
-    //  PLUID_AND_ATTRIBUTES Privileges;
+    PLUID_AND_ATTRIBUTES CapturedPrivileges = NULL;
     KPROCESSOR_MODE PreviousMode;
+    ULONG CapturedCount = 0;
+    ULONG CapturedLength = 0;
+    ULONG NewStateSize = 0;
     ULONG PrivilegeCount;
     PTOKEN Token;
-    //  ULONG Length;
     ULONG i;
     ULONG j;
     ULONG k;
@@ -1913,39 +1970,104 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
     ULONG c;
 #endif
     NTSTATUS Status;
-    
+
     PAGED_CODE();
-    
+
     DPRINT ("NtAdjustPrivilegesToken() called\n");
-    
-    //  PrivilegeCount = NewState->PrivilegeCount;
+
     PreviousMode = KeGetPreviousMode ();
-    //  SeCaptureLuidAndAttributesArray(NewState->Privileges,
-    //                                  PrivilegeCount,
-    //                                  PreviousMode,
-    //                                  NULL,
-    //                                  0,
-    //                                  NonPagedPool,
-    //                                  1,
-    //                                  &Privileges,
-    //                                  &Length);
-    
-    Status = ObReferenceObjectByHandle (TokenHandle,
-                                        TOKEN_ADJUST_PRIVILEGES | (PreviousState != NULL ? TOKEN_QUERY : 0),
-                                        SepTokenObjectType,
-                                        PreviousMode,
-                                        (PVOID*)&Token,
-                                        NULL);
+    if (PreviousMode != KernelMode)
+    {
+        _SEH2_TRY
+        {
+            /* Probe NewState */
+            if (DisableAllPrivileges == FALSE)
+            {
+                ProbeForRead(NewState,
+                             sizeof(TOKEN_PRIVILEGES),
+                             sizeof(ULONG));
+
+                CapturedCount = NewState->PrivilegeCount;
+                NewStateSize = (ULONG)sizeof(TOKEN_PRIVILEGES) +
+                               ((CapturedCount - ANYSIZE_ARRAY) * (ULONG)sizeof(LUID_AND_ATTRIBUTES));
+
+                ProbeForRead(NewState,
+                             NewStateSize,
+                             sizeof(ULONG));
+            }
+
+            /* Probe PreviousState and ReturnLength */
+            if (PreviousState != NULL)
+            {
+                ProbeForWrite(PreviousState,
+                              BufferLength,
+                              sizeof(ULONG));
+
+                ProbeForWrite(ReturnLength,
+                              sizeof(ULONG),
+                              sizeof(ULONG));
+            }
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            /* Return the exception code */
+            _SEH2_YIELD(return _SEH2_GetExceptionCode());
+        }
+        _SEH2_END;
+    }
+    else
+    {
+        if (DisableAllPrivileges == FALSE)
+            CapturedCount = NewState->PrivilegeCount;
+    }
+
+    if (DisableAllPrivileges == FALSE)
+    {
+        _SEH2_TRY
+        {
+            /* Capture the new state array of privileges */
+            Status = SeCaptureLuidAndAttributesArray(NewState->Privileges,
+                                                     CapturedCount,
+                                                     PreviousMode,
+                                                     NULL,
+                                                     0,
+                                                     PagedPool,
+                                                     TRUE,
+                                                     &CapturedPrivileges,
+                                                     &CapturedLength);
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            /* Return the exception code */
+            _SEH2_YIELD(return _SEH2_GetExceptionCode());
+        }
+        _SEH2_END;
+
+        if (!NT_SUCCESS(Status))
+            return Status;
+    }
+
+    /* Reference the token */
+    Status = ObReferenceObjectByHandle(TokenHandle,
+                                       TOKEN_ADJUST_PRIVILEGES | (PreviousState != NULL ? TOKEN_QUERY : 0),
+                                       SepTokenObjectType,
+                                       PreviousMode,
+                                       (PVOID*)&Token,
+                                       NULL);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1 ("Failed to reference token (Status %lx)\n", Status);
-        //      SeReleaseLuidAndAttributesArray(Privileges,
-        //                                      PreviousMode,
-        //                                      0);
+
+        /* Release the captured privileges */
+        if (CapturedPrivileges != NULL)
+            SeReleaseLuidAndAttributesArray(CapturedPrivileges,
+                                            PreviousMode,
+                                            TRUE);
+
         return Status;
     }
-    
-    
+
+
 #if 0
     SepAdjustPrivileges(Token,
                         0,
@@ -1957,13 +2079,13 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
                         &b,
                         &c);
 #endif
-    
+
     PrivilegeCount = (BufferLength - FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges)) /
     sizeof(LUID_AND_ATTRIBUTES);
-    
+
     if (PreviousState != NULL)
         PreviousState->PrivilegeCount = 0;
-    
+
     k = 0;
     if (DisableAllPrivileges == TRUE)
     {
@@ -1972,7 +2094,7 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
             if (Token->Privileges[i].Attributes != 0)
             {
                 DPRINT ("Attributes differ\n");
-                
+
                 /* Save current privilege */
                 if (PreviousState != NULL)
                 {
@@ -1984,18 +2106,21 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
                     }
                     else
                     {
-                        /* FIXME: Should revert all the changes, calculate how
+                        /*
+                         * FIXME: Should revert all the changes, calculate how
                          * much space would be needed, set ResultLength
                          * accordingly and fail.
                          */
                     }
+
                     k++;
                 }
-                
+
                 /* Update current privlege */
                 Token->Privileges[i].Attributes &= ~SE_PRIVILEGE_ENABLED;
             }
         }
+
         Status = STATUS_SUCCESS;
     }
     else
@@ -2003,21 +2128,21 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
         Count = 0;
         for (i = 0; i < Token->PrivilegeCount; i++)
         {
-            for (j = 0; j < NewState->PrivilegeCount; j++)
+            for (j = 0; j < CapturedCount; j++)
             {
-                if (Token->Privileges[i].Luid.LowPart == NewState->Privileges[j].Luid.LowPart &&
-                    Token->Privileges[i].Luid.HighPart == NewState->Privileges[j].Luid.HighPart)
+                if (Token->Privileges[i].Luid.LowPart == CapturedPrivileges[j].Luid.LowPart &&
+                    Token->Privileges[i].Luid.HighPart == CapturedPrivileges[j].Luid.HighPart)
                 {
                     DPRINT ("Found privilege\n");
-                    
+
                     if ((Token->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED) !=
-                        (NewState->Privileges[j].Attributes & SE_PRIVILEGE_ENABLED))
+                        (CapturedPrivileges[j].Attributes & SE_PRIVILEGE_ENABLED))
                     {
                         DPRINT ("Attributes differ\n");
                         DPRINT ("Current attributes %lx  desired attributes %lx\n",
                                 Token->Privileges[i].Attributes,
-                                NewState->Privileges[j].Attributes);
-                        
+                                CapturedPrivileges[j].Attributes);
+
                         /* Save current privilege */
                         if (PreviousState != NULL)
                         {
@@ -2029,42 +2154,49 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
                             }
                             else
                             {
-                                /* FIXME: Should revert all the changes, calculate how
+                                /*
+                                 * FIXME: Should revert all the changes, calculate how
                                  * much space would be needed, set ResultLength
                                  * accordingly and fail.
                                  */
                             }
+
                             k++;
                         }
-                        
+
                         /* Update current privlege */
                         Token->Privileges[i].Attributes &= ~SE_PRIVILEGE_ENABLED;
                         Token->Privileges[i].Attributes |=
-                        (NewState->Privileges[j].Attributes & SE_PRIVILEGE_ENABLED);
+                        (CapturedPrivileges[j].Attributes & SE_PRIVILEGE_ENABLED);
                         DPRINT ("New attributes %lx\n",
                                 Token->Privileges[i].Attributes);
                     }
+
                     Count++;
                 }
             }
         }
-        Status = Count < NewState->PrivilegeCount ? STATUS_NOT_ALL_ASSIGNED : STATUS_SUCCESS;
+
+        Status = Count < CapturedCount ? STATUS_NOT_ALL_ASSIGNED : STATUS_SUCCESS;
     }
-    
+
     if (ReturnLength != NULL)
     {
         *ReturnLength = sizeof(TOKEN_PRIVILEGES) +
         (sizeof(LUID_AND_ATTRIBUTES) * (k - 1));
     }
-    
+
+    /* Dereference the token */
     ObDereferenceObject (Token);
-    
-    //  SeReleaseLuidAndAttributesArray(Privileges,
-    //                                  PreviousMode,
-    //                                  0);
-    
+
+    /* Release the captured privileges */
+    if (CapturedPrivileges != NULL)
+        SeReleaseLuidAndAttributesArray(CapturedPrivileges,
+                                        PreviousMode,
+                                        TRUE);
+
     DPRINT ("NtAdjustPrivilegesToken() done\n");
-    
+
     return Status;
 }
 
@@ -2089,12 +2221,12 @@ NtCreateToken(OUT PHANDLE TokenHandle,
     ULONG nTokenPrivileges = 0;
     LARGE_INTEGER LocalExpirationTime = {{0, 0}};
     NTSTATUS Status;
-    
+
     PAGED_CODE();
-    
+
     PreviousMode = ExGetPreviousMode();
-    
-    if(PreviousMode != KernelMode)
+
+    if (PreviousMode != KernelMode)
     {
         _SEH2_TRY
         {
@@ -2138,7 +2270,7 @@ NtCreateToken(OUT PHANDLE TokenHandle,
         nTokenPrivileges = TokenPrivileges->PrivilegeCount;
         LocalExpirationTime = *ExpirationTime;
     }
-    
+
     Status = SepCreateToken(&hToken,
                             PreviousMode,
                             DesiredAccess,
@@ -2170,7 +2302,7 @@ NtCreateToken(OUT PHANDLE TokenHandle,
         }
         _SEH2_END;
     }
-    
+
     return Status;
 }
 
@@ -2196,11 +2328,11 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
     PACL Dacl = NULL;
     KPROCESSOR_MODE PreviousMode;
     NTSTATUS Status;
-    
+
     PAGED_CODE();
-    
+
     PreviousMode = ExGetPreviousMode();
-    
+
     if (PreviousMode != KernelMode)
     {
         _SEH2_TRY
@@ -2214,12 +2346,12 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
         }
         _SEH2_END;
     }
-    
+
     /*
      * At first open the thread token for information access and verify
      * that the token associated with thread is valid.
      */
-    
+
     Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_QUERY_INFORMATION,
                                        PsThreadType, PreviousMode, (PVOID*)&Thread,
                                        NULL);
@@ -2227,7 +2359,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
     {
         return Status;
     }
-    
+
     Token = PsReferenceImpersonationToken(Thread, &CopyOnOpen, &EffectiveOnly,
                                           &ImpersonationLevel);
     if (Token == NULL)
@@ -2235,23 +2367,23 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
         ObDereferenceObject(Thread);
         return STATUS_NO_TOKEN;
     }
-       
+
     if (ImpersonationLevel == SecurityAnonymous)
     {
         PsDereferenceImpersonationToken(Token);
         ObDereferenceObject(Thread);
         return STATUS_CANT_OPEN_ANONYMOUS;
     }
-    
+
     /*
      * Revert to self if OpenAsSelf is specified.
      */
-    
+
     if (OpenAsSelf)
     {
         PsDisableImpersonation(PsGetCurrentThread(), &ImpersonationState);
     }
-    
+
     if (CopyOnOpen)
     {
         Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_ALL_ACCESS,
@@ -2260,11 +2392,11 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
         if (NT_SUCCESS(Status))
         {
             PrimaryToken = PsReferencePrimaryToken(NewThread->ThreadsProcess);
-            
+
             Status = SepCreateImpersonationTokenDacl(Token, PrimaryToken, &Dacl);
 
             ObFastDereferenceObject(&NewThread->ThreadsProcess->Token, PrimaryToken);
-            
+
             if (NT_SUCCESS(Status))
             {
                 if (Dacl)
@@ -2274,10 +2406,10 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
                     RtlSetDaclSecurityDescriptor(&SecurityDescriptor, TRUE, Dacl,
                                                  FALSE);
                 }
-        
+
                 InitializeObjectAttributes(&ObjectAttributes, NULL, HandleAttributes,
                                            NULL, Dacl ? &SecurityDescriptor : NULL);
-            
+
 
                 Status = SepDuplicateToken(Token, &ObjectAttributes, EffectiveOnly,
                                            TokenImpersonation, ImpersonationLevel,
@@ -2297,26 +2429,26 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
                                        NULL, DesiredAccess, SepTokenObjectType,
                                        PreviousMode, &hToken);
     }
-    
+
     if (Dacl) ExFreePool(Dacl);
-    
+
     if (OpenAsSelf)
     {
         PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState);
     }
-    
+
     ObDereferenceObject(Token);
-    
+
     if (NT_SUCCESS(Status) && CopyOnOpen)
     {
         PsImpersonateClient(Thread, NewToken, FALSE, EffectiveOnly, ImpersonationLevel);
     }
-    
+
     if (NewToken) ObDereferenceObject(NewToken);
 
     if (CopyOnOpen && NewThread) ObDereferenceObject(NewThread);
 
-    if(NT_SUCCESS(Status))
+    if (NT_SUCCESS(Status))
     {
         _SEH2_TRY
         {
@@ -2328,7 +2460,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
         }
         _SEH2_END;
     }
-    
+
     return Status;
 }
 
@@ -2360,11 +2492,11 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
     PTOKEN FirstToken, SecondToken;
     BOOLEAN IsEqual;
     NTSTATUS Status;
-    
+
     PAGED_CODE();
-    
+
     PreviousMode = ExGetPreviousMode();
-    
+
     if (PreviousMode != KernelMode)
     {
         _SEH2_TRY
@@ -2378,7 +2510,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
         }
         _SEH2_END;
     }
-    
+
     Status = ObReferenceObjectByHandle(FirstTokenHandle,
                                        TOKEN_QUERY,
                                        SepTokenObjectType,
@@ -2387,7 +2519,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
                                        NULL);
     if (!NT_SUCCESS(Status))
         return Status;
-    
+
     Status = ObReferenceObjectByHandle(SecondTokenHandle,
                                        TOKEN_QUERY,
                                        SepTokenObjectType,
@@ -2399,7 +2531,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
         ObDereferenceObject(FirstToken);
         return Status;
     }
-    
+
     if (FirstToken != SecondToken)
     {
         Status = SepCompareTokens(FirstToken,
@@ -2408,10 +2540,10 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
     }
     else
         IsEqual = TRUE;
-    
+
     ObDereferenceObject(FirstToken);
     ObDereferenceObject(SecondToken);
-    
+
     if (NT_SUCCESS(Status))
     {
         _SEH2_TRY
@@ -2424,7 +2556,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
         }
         _SEH2_END;
     }
-    
+
     return Status;
 }