CmpCreateRegistryProcessToken
INT64 __fastcall CmpCreateRegistryProcessToken(VOID **a1){
_ADAPTER_OBJECT *v2;
_TOKEN_GROUPS *v3;
_ADAPTER_OBJECT *v4;
NTSTATUS v5;
char *TransientPoolWithTag;
PVOID P;
PACCESS_TOKEN NewToken;
VOID *TokenInformation;
TokenInformation = 0i64;
v2 = 0i64;
P = 0i64;
v3 = 0i64;
NewToken = 0i64;
v4 = (_ADAPTER_OBJECT *)PsReferencePrimaryToken(PsInitialSystemProcess);
v5 = SeQueryInformationToken(v4, TokenUser, &TokenInformation);
if( v5 >= 0 )
{
v5 = SeQueryInformationToken(v4, TokenGroups, &P);
if( v5 >= 0 )
{
TransientPoolWithTag = (char *)CmpAllocateTransientPoolWithTag(
1ui64,
16i64 * (unsigned int)(*(_DWORD *)P + 1) + 8);
v3 = (_TOKEN_GROUPS *)TransientPoolWithTag;
if( TransientPoolWithTag )
{
*(_DWORD *)TransientPoolWithTag = *(_DWORD *)P + 1;
*(_OWORD *)(TransientPoolWithTag + 8) = *(_OWORD *)TokenInformation;
memmove(TransientPoolWithTag + 24, (char *)P + 8, 16 * *(_DWORD *)P);
v5 = SeFilterToken(v4, 1ui64, v3, 0i64, 0i64, &NewToken);
if( v5 < 0 )
{
v2 = (_ADAPTER_OBJECT *)NewToken;
}
else
{
v5 = 0;
*a1 = NewToken;
}
}
else
{
v5 = -1073741670;
}
}
}
if( v4 )
HalPutDmaAdapter(v4);
if( v2 )
HalPutDmaAdapter(v2);
if( TokenInformation )
ExFreePoolWithTag(TokenInformation, 0);
if( P )
ExFreePoolWithTag(P, 0);
if( v3 )
CmSiFreeMemory((PPRIVILEGE_SET)v3);
return(unsigned int)v5;
}Referenced by:
CmpInitializeRegistryProcess