PspAssignPrimaryToken
NTSTATUS __stdcall PspAssignPrimaryToken(
_ETHREAD *CurrentThread,
INT8 PreviousMode,
VOID *ProcessHandle,
VOID *TokenHandle){
NTSTATUS result;
UINT64 v8;
_ADAPTER_OBJECT *v9;
int IsTokenAssignableToProcess;
INT64 v11;
_EPROCESS *v12;
signed __int64 v13;
UINT64 Tag;
char pbIsAssignable[8];
PVOID Object;
VOID *pAccessToken;
VOID *OldAccessToken;
Object = 0i64;
pAccessToken = 0i64;
pbIsAssignable[0] = 0;
result = ObReferenceObjectByHandle(
TokenHandle,
1ui64,
(_OBJECT_TYPE *)SeTokenObjectType,
PreviousMode,
&pAccessToken,
0i64);
if( result >= 0 )
{
v9 = (_ADAPTER_OBJECT *)pAccessToken;
IsTokenAssignableToProcess = SeIsTokenAssignableToProcess(pAccessToken, (UINT8 *)pbIsAssignable, v8);
if( IsTokenAssignableToProcess >= 0 )
{
if( pbIsAssignable[0]
|| (LOBYTE(v11) = PreviousMode,
SeCheckPrivilegedObject(SeAssignPrimaryTokenPrivilege, ProcessHandle, 0x200ui64, v11)) )
{
LODWORD(Tag) = 1699967824;
IsTokenAssignableToProcess = ObReferenceObjectByHandleWithTag(
ProcessHandle,
0x200ui64,
(_OBJECT_TYPE *)PsProcessType,
PreviousMode,
Tag,
&Object,
0i64);
if( IsTokenAssignableToProcess >= 0 )
{
v12 = (_EPROCESS *)Object;
OldAccessToken = 0i64;
if( (*((_DWORD *)Object + 280) & 0x8000) != 0 )
{
IsTokenAssignableToProcess = -1073741637;
}
else
{
PspLockProcessSecurityShared((PEPROCESS)Object, CurrentThread);
if( (v12->Flags2 & 0x8000) != 0 )
{
IsTokenAssignableToProcess = -1073741637;
}
else
{
IsTokenAssignableToProcess = SeExchangePrimaryToken(v12, v9, &OldAccessToken);
if( IsTokenAssignableToProcess >= 0 )
{
v12 = (_EPROCESS *)Object;
v13 = _InterlockedIncrement64(&PsNextSecurityDomain);
v9 = (_ADAPTER_OBJECT *)pAccessToken;
*((_QWORD *)Object + 316) = v13;
v12->ParentSecurityDomain = v13;
}
}
PspUnlockProcessSecurityShared(v12, CurrentThread);
}
if( IsTokenAssignableToProcess >= 0 )
{
PspLockUnlockProcessExclusive(v12, CurrentThread);
HalPutDmaAdapter((PADAPTER_OBJECT)OldAccessToken);
ObDereferenceDeviceMap(v12);
}
ObfDereferenceObjectWithTag(v12, 0x65537350ui64);
}
}
else
{
IsTokenAssignableToProcess = -1073741727;
}
}
HalPutDmaAdapter(v9);
return IsTokenAssignableToProcess;
}
return result;
}Referenced by:
NtSetInformationProcess