Fix NtOpenThreadToken() and NtSetInformationThread().

svn path=/trunk/; revision=8791
This commit is contained in:
Eric Kohl 2004-03-19 12:45:07 +00:00
parent d037d068ff
commit c89688b59d
2 changed files with 134 additions and 96 deletions

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.71 2004/03/14 18:12:07 ekohl Exp $ /* $Id: create.c,v 1.72 2004/03/19 12:45:07 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -183,10 +183,10 @@ NtImpersonateThread(IN HANDLE ThreadHandle,
IN HANDLE ThreadToImpersonateHandle, IN HANDLE ThreadToImpersonateHandle,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService) IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService)
{ {
SECURITY_CLIENT_CONTEXT ClientContext;
PETHREAD Thread; PETHREAD Thread;
PETHREAD ThreadToImpersonate; PETHREAD ThreadToImpersonate;
NTSTATUS Status; NTSTATUS Status;
SECURITY_CLIENT_CONTEXT ClientContext;
Status = ObReferenceObjectByHandle (ThreadHandle, Status = ObReferenceObjectByHandle (ThreadHandle,
0, 0,
@ -196,7 +196,7 @@ NtImpersonateThread(IN HANDLE ThreadHandle,
NULL); NULL);
if (!NT_SUCCESS (Status)) if (!NT_SUCCESS (Status))
{ {
return(Status); return Status;
} }
Status = ObReferenceObjectByHandle (ThreadToImpersonateHandle, Status = ObReferenceObjectByHandle (ThreadToImpersonateHandle,
@ -208,7 +208,7 @@ NtImpersonateThread(IN HANDLE ThreadHandle,
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ObDereferenceObject (Thread); ObDereferenceObject (Thread);
return(Status); return Status;
} }
Status = SeCreateClientSecurity (ThreadToImpersonate, Status = SeCreateClientSecurity (ThreadToImpersonate,
@ -217,17 +217,22 @@ NtImpersonateThread(IN HANDLE ThreadHandle,
&ClientContext); &ClientContext);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ObDereferenceObject(Thread);
ObDereferenceObject (ThreadToImpersonate); ObDereferenceObject (ThreadToImpersonate);
return(Status); ObDereferenceObject (Thread);
return Status;
} }
SeImpersonateClient(&ClientContext, Thread); SeImpersonateClient (&ClientContext,
Thread);
if (ClientContext.Token != NULL) if (ClientContext.Token != NULL)
{ {
ObDereferenceObject (ClientContext.Token); ObDereferenceObject (ClientContext.Token);
} }
return(STATUS_SUCCESS);
ObDereferenceObject (ThreadToImpersonate);
ObDereferenceObject (Thread);
return STATUS_SUCCESS;
} }
@ -237,10 +242,9 @@ NtOpenThreadToken (IN HANDLE ThreadHandle,
IN BOOLEAN OpenAsSelf, IN BOOLEAN OpenAsSelf,
OUT PHANDLE TokenHandle) OUT PHANDLE TokenHandle)
{ {
#if 0 PACCESS_TOKEN Token;
PETHREAD Thread; PETHREAD Thread;
NTSTATUS Status; NTSTATUS Status;
PACCESS_TOKEN Token;
Status = ObReferenceObjectByHandle (ThreadHandle, Status = ObReferenceObjectByHandle (ThreadHandle,
0, 0,
@ -253,12 +257,38 @@ NtOpenThreadToken (IN HANDLE ThreadHandle,
return(Status); return(Status);
} }
Token = PsReferencePrimaryToken(Thread->ThreadsProcess); if (OpenAsSelf)
SepCreateImpersonationTokenDacl(Token); {
#endif if (Thread->ActiveImpersonationInfo == FALSE)
{
ObDereferenceObject (Thread);
return STATUS_NO_TOKEN; return STATUS_NO_TOKEN;
} }
Token = Thread->ImpersonationInfo->Token;
}
else
{
Token = Thread->ThreadsProcess->Token;
}
if (Token == NULL)
{
ObDereferenceObject (Thread);
return STATUS_NO_TOKEN;
}
Status = ObCreateHandle (PsGetCurrentProcess(),
Token,
DesiredAccess,
FALSE,
TokenHandle);
ObDereferenceObject (Thread);
return Status;
}
/* /*
* @implemented * @implemented

View file

@ -1,4 +1,4 @@
/* $Id: tinfo.c,v 1.24 2003/12/30 18:52:05 fireball Exp $ /* $Id: tinfo.c,v 1.25 2004/03/19 12:45:07 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -23,10 +23,10 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
NTSTATUS STDCALL NTSTATUS STDCALL
NtSetInformationThread(HANDLE ThreadHandle, NtSetInformationThread (IN HANDLE ThreadHandle,
THREADINFOCLASS ThreadInformationClass, IN THREADINFOCLASS ThreadInformationClass,
PVOID ThreadInformation, IN PVOID ThreadInformation,
ULONG ThreadInformationLength) IN ULONG ThreadInformationLength)
{ {
PETHREAD Thread; PETHREAD Thread;
NTSTATUS Status; NTSTATUS Status;
@ -77,6 +77,7 @@ NtSetInformationThread(HANDLE ThreadHandle,
case ThreadBasePriority: case ThreadBasePriority:
{ {
LONG Increment; LONG Increment;
if (ThreadInformationLength != sizeof(LONG)) if (ThreadInformationLength != sizeof(LONG))
{ {
Status = STATUS_INFO_LENGTH_MISMATCH; Status = STATUS_INFO_LENGTH_MISMATCH;
@ -106,7 +107,8 @@ NtSetInformationThread(HANDLE ThreadHandle,
break; break;
} }
TokenHandle = *((PHANDLE)ThreadInformation); TokenHandle = *((PHANDLE)ThreadInformation);
Status = PsAssignImpersonationToken(Thread, TokenHandle); Status = PsAssignImpersonationToken (Thread,
TokenHandle);
break; break;
} }
@ -199,7 +201,9 @@ NtSetInformationThread(HANDLE ThreadHandle,
default: default:
Status = STATUS_UNSUCCESSFUL; Status = STATUS_UNSUCCESSFUL;
} }
ObDereferenceObject (Thread); ObDereferenceObject (Thread);
return Status; return Status;
} }
@ -364,11 +368,14 @@ NtQueryInformationThread (IN HANDLE ThreadHandle,
return(Status); return(Status);
} }
VOID KeSetPreviousMode(ULONG Mode)
VOID
KeSetPreviousMode (ULONG Mode)
{ {
PsGetCurrentThread()->Tcb.PreviousMode = (UCHAR)Mode; PsGetCurrentThread()->Tcb.PreviousMode = (UCHAR)Mode;
} }
/* /*
* @implemented * @implemented
*/ */
@ -378,6 +385,7 @@ KeGetPreviousMode (VOID)
return (ULONG)PsGetCurrentThread()->Tcb.PreviousMode; return (ULONG)PsGetCurrentThread()->Tcb.PreviousMode;
} }
/* /*
* @implemented * @implemented
*/ */