SeCopyClientToken
NTSTATUS __stdcall SeCopyClientToken(
VOID *ClientToken,
_SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
UINT8 UseProcessTrust,
VOID *ProcessTrustSid,
VOID **DuplicateToken){
char v5;
int inserted;
VOID *v7;
VOID *v9;
NTSTATUS appended;
UINT64 ImpersonationLevela;
PVOID Object;
_OBJECT_ATTRIBUTES ObjectAttributes;
PVOID *v14;
*(_QWORD *)&ObjectAttributes.Length = 48i64;
v5 = (char)ProcessTrustSid;
Object = 0i64;
memset(&ObjectAttributes.RootDirectory, 0, 40);
inserted = SepDuplicateToken(
(_TOKEN *)ClientToken,
&ObjectAttributes,
0,
TokenImpersonation,
ImpersonationLevel,
0,
0,
(_TOKEN **)&Object);
if( inserted < 0 )
goto LABEL_13;
if( v5 )
inserted = SepSetTokenTrust((_TOKEN *)Object, DuplicateToken);
if( inserted < 0 )
goto LABEL_13;
LODWORD(ImpersonationLevela) = 0;
inserted = ObInsertObjectEx(Object, 0i64, 0i64, 0i64, ImpersonationLevela, 0i64, 0i64);
if( inserted < 0 )
goto LABEL_13;
v7 = Object;
if( (*((_DWORD *)Object + 50) & 0x4000) != 0 )
{
v9 = (VOID *)*((_QWORD *)Object + 98);
if( v9 )
{
appended = SepAppendAceToTokenObjectAcl(Object, 0xF01FFui64, v9);
v7 = Object;
inserted = appended;
if( appended >= 0 )
goto LABEL_8;
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
v7 = Object;
}
}
if( inserted < 0 )
{
LABEL_13:
*v14 = 0i64;
return inserted;
}
LABEL_8:
SepAppendAceToTokenObjectAcl(v7, 8ui64, SeAliasAdminsSid);
*v14 = Object;
return inserted;
}Referenced by:
PsImpersonateClient
SepCopyClientTokenAndSetSilo
SepCreateClientSecurityEx