NtDuplicateToken() must create and return a handle to the duplicated token.

svn path=/trunk/; revision=10104
This commit is contained in:
Eric Kohl 2004-07-13 08:43:35 +00:00
parent 6e5edb7df9
commit eda69bc46f

View file

@ -1,4 +1,4 @@
/* $Id: token.c,v 1.36 2004/07/06 22:07:26 gvg Exp $ /* $Id: token.c,v 1.37 2004/07/13 08:43:35 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -827,40 +827,61 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle,
IN TOKEN_TYPE TokenType, IN TOKEN_TYPE TokenType,
OUT PHANDLE NewTokenHandle) OUT PHANDLE NewTokenHandle)
{ {
PACCESS_TOKEN Token; KPROCESSOR_MODE PreviousMode;
PACCESS_TOKEN NewToken; PACCESS_TOKEN Token;
NTSTATUS Status; PACCESS_TOKEN NewToken;
ULONG ExistingImpersonationLevel; NTSTATUS Status;
ULONG ExistingImpersonationLevel;
Status = ObReferenceObjectByHandle(ExistingTokenHandle, PreviousMode = KeGetPreviousMode();
TOKEN_DUPLICATE, Status = ObReferenceObjectByHandle(ExistingTokenHandle,
SepTokenObjectType, TOKEN_DUPLICATE,
UserMode, SepTokenObjectType,
(PVOID*)&Token, PreviousMode,
NULL); (PVOID*)&Token,
if (!NT_SUCCESS(Status)) NULL);
if (!NT_SUCCESS(Status))
{ {
DPRINT1 ("Failed to reference token (Status %lx)\n", Status); DPRINT1("Failed to reference token (Status %lx)\n", Status);
return Status; return Status;
} }
ExistingImpersonationLevel = Token->ImpersonationLevel; ExistingImpersonationLevel = Token->ImpersonationLevel;
Status = SepDuplicateToken(Token, Status = SepDuplicateToken(Token,
ObjectAttributes, ObjectAttributes,
ImpersonationLevel, TokenType,
TokenType, ImpersonationLevel,
ExistingImpersonationLevel, ExistingImpersonationLevel,
KeGetPreviousMode(), PreviousMode,
&NewToken); &NewToken);
if (!NT_SUCCESS(Status))
ObDereferenceObject(Token);
if (!NT_SUCCESS(Status))
{ {
DPRINT1 ("Failed to duplicate token (Status %lx)\n", Status); DPRINT1("Failed to duplicate token (Status %lx)\n", Status);
return Status; return Status;
} }
return STATUS_SUCCESS; Status = ObInsertObject((PVOID)NewToken,
NULL,
DesiredAccess,
0,
NULL,
NewTokenHandle);
ObDereferenceObject(NewToken);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to create token handle (Status %lx)\n");
return Status;
}
return STATUS_SUCCESS;
} }
VOID SepAdjustGroups(PACCESS_TOKEN Token, VOID SepAdjustGroups(PACCESS_TOKEN Token,
ULONG a, ULONG a,
BOOLEAN ResetToDefault, BOOLEAN ResetToDefault,