CmpBuildAdminInformation
NTSTATUS __stdcall CmpBuildAdminInformation(TOKEN_ACCESS_INFORMATION **AdminInformation){
INT64 *v1;
void *v2;
_CHILD_LIST *v3;
NTSTATUS v4;
_DWORD **v5;
unsigned int v6;
unsigned int v7;
unsigned int v8;
unsigned int v9;
int v10;
__int64 v11;
PSID v12;
unsigned int v13;
unsigned int v14;
int v15;
unsigned int v16;
INT64 v17;
INT64 v18;
unsigned int *v19;
unsigned int v20;
__int64 v21;
__int64 v22;
UINT64 v23;
__int64 v25;
__int64 v26;
_SID_AND_ATTRIBUTES *v27;
PVOID TokenInformation;
PSID NextTargetSid;
PSE_EXPORTS v30;
_SID_AND_ATTRIBUTES Src[2];
UINT64 SidAreaSize;
NTSTATUS v34;
NextTargetSid = 0i64;
LODWORD(SidAreaSize) = 0;
TokenInformation = 0i64;
v2 = (void *)CmpEffectiveTokenForSubject(v1, 0i64);
v34 = SeQueryInformationToken(v2, TokenAccessInformation, &TokenInformation);
v4 = v34;
if( v34 >= 0 )
{
v5 = (_DWORD **)TokenInformation;
v6 = 0;
v7 = -1;
v8 = -1;
v9 = **(_DWORD **)TokenInformation;
v10 = 16 * v9;
if( v9 )
{
v11 = *(_QWORD *)(*(_QWORD *)TokenInformation + 8i64);
v30 = SeExports;
do
{
v12 = *(PSID *)v11;
NextTargetSid = *(PSID *)v11;
v10 += RtlLengthSid(NextTargetSid);
if( v7 == -1 && RtlEqualSid(v30->SeAliasAdminsSid, v12) )
{
v7 = v6;
}
else if( v8 == -1 && (*(_BYTE *)(v11 + 8) & 0x60) == 96 )
{
v8 = v6;
}
++v6;
v11 += 16i64;
}
while( v6 < v9 );
v5 = (_DWORD **)TokenInformation;
}
v13 = 0;
if( v7 == -1 )
{
v13 = 1;
Src[0].Attributes = 7;
Src[0].Sid = SeExports->SeAliasAdminsSid;
}
if( v8 == -1 )
{
v25 = v13++;
Src[v25].Sid = SeExports->SeHighMandatorySid;
Src[v25].Attributes = 96;
}
if( v13 )
{
v26 = v13;
v27 = Src;
v10 += 16 * v13;
do
{
v10 += RtlLengthSid(v27->Sid);
++v27;
--v26;
}
while( v26 );
}
v14 = (v10 + 7) & 0xFFFFFFF8;
v15 = 12 * *v5[2];
v16 = v15 + v14 + 920 - 12;
if( !v15 )
v16 = v14 + 920;
CmpAllocateTransientPoolWithTag((_HHIVE *)1, v16, 0x20204D43ui64, v3);
v18 = v17;
if( v17 )
{
memset(v17, 0i64);
v19 = (unsigned int *)(v18 + 88);
*(_QWORD *)(v18 + 24) = *((_QWORD *)TokenInformation + 3);
*(_DWORD *)(v18 + 32) = *((_DWORD *)TokenInformation + 8);
*(_DWORD *)(v18 + 36) = *((_DWORD *)TokenInformation + 9);
*(_DWORD *)(v18 + 40) = *((_DWORD *)TokenInformation + 10);
*(_DWORD *)(v18 + 44) = *((_DWORD *)TokenInformation + 11) & 0xFFFF9FFF | 0x2000;
v20 = v13 + **(_DWORD **)TokenInformation;
*(_QWORD *)(v18 + 96) = v18 + 360;
*(_DWORD *)(v18 + 88) = v20;
RtlCopySidAndAttributesArray(
**(unsigned int **)TokenInformation,
*(SID_AND_ATTRIBUTES **)(*(_QWORD *)TokenInformation + 8i64),
v14 - 16 * v20,
(SID_AND_ATTRIBUTES *)(v18 + 360),
(VOID *)(v18 + 360 + 16 * v20),
&NextTargetSid,
&SidAreaSize);
if( v7 != -1 )
*(_DWORD *)(*(_QWORD *)(v18 + 96) + 16i64 * v7 + 8) = 7;
if( v8 != -1 )
*(_DWORD *)(*(_QWORD *)(v18 + 96) + 16i64 * v8 + 8) = 96;
if( v13 )
RtlCopySidAndAttributesArray(
v13,
Src,
(unsigned int)SidAreaSize,
(SID_AND_ATTRIBUTES *)(*(_QWORD *)(v18 + 96) + 16i64 * **(unsigned int **)TokenInformation),
NextTargetSid,
&NextTargetSid,
&SidAreaSize);
RtlSidHashInitialize(*(SID_AND_ATTRIBUTES **)(v18 + 96), *v19, (SID_AND_ATTRIBUTES_HASH *)(v18 + 88));
*(_QWORD *)v18 = v19;
v21 = *(_QWORD *)(v18 + 96) + v14;
*(_DWORD *)v21 = 0;
*(_QWORD *)(v21 + 8) = 0i64;
*(_QWORD *)(v18 + 8) = v21;
v21 += 272i64;
*(_DWORD *)v21 = 0;
v22 = v21 + 272;
*(_QWORD *)(v21 + 8) = 0i64;
*(_QWORD *)(v18 + 64) = v21;
*(_QWORD *)(v18 + 56) = 0i64;
v23 = **((unsigned int **)TokenInformation + 2);
*(_DWORD *)(v21 + 272) = v23;
RtlCopyLuidAndAttributesArray(
v23,
(_LUID_AND_ATTRIBUTES *)(*((_QWORD *)TokenInformation + 2) + 4i64),
(_LUID_AND_ATTRIBUTES *)(v21 + 276));
*(_QWORD *)(v18 + 16) = v22;
v4 = v34;
*AdminInformation = (TOKEN_ACCESS_INFORMATION *)v18;
}
else
{
v4 = -1073741670;
}
}
if( TokenInformation )
ExFreePoolWithTag(TokenInformation, 0);
return v4;
}Referenced by:
CmpCheckAdminAccess