CmUpdateFeatureConfiguration
__int64 __fastcall CmUpdateFeatureConfiguration(VOID *Src, size_t Size, _KPROCESSOR_MODE AccessMode){
char v3;
UINT64 v4;
__int64 *v6;
unsigned __int8 v7;
INT64 v8;
unsigned int updated;
__int64 *TransientPoolWithQuotaTag;
unsigned __int64 v11;
__int64 v12;
_KPROCESSOR_MODE AccessModea;
int GrantedAccess[3];
__int64 *v16;
_SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
int AccessStatus;
v3 = AccessMode;
v4 = Size;
AccessStatus = 0;
GrantedAccess[0] = 0;
memset(&SubjectSecurityContext, 0, sizeof(SubjectSecurityContext));
v6 = 0i64;
SeCaptureSubjectContext((INT64)&SubjectSecurityContext);
LOBYTE(AccessModea) = v3;
v7 = (unsigned __int8)SeAccessCheck(
*(&CmpDummyThreadEvent + 245),
&SubjectSecurityContext,
0,
1,
0,
0i64,
&CmFcFeatureConfigMapping,
AccessModea,
(PACCESS_MASK)GrantedAccess,
&AccessStatus);
SeReleaseSubjectContext(&SubjectSecurityContext);
if( !v7 )
{
updated = AccessStatus;
goto LABEL_13;
}
if( (unsigned int)v4 < 0x10 )
goto LABEL_4;
TransientPoolWithQuotaTag = (__int64 *)CmpAllocateTransientPoolWithQuotaTag(v8, v4, 0x63466D43ui64);
v6 = TransientPoolWithQuotaTag;
v16 = TransientPoolWithQuotaTag;
if( TransientPoolWithQuotaTag )
{
memmove(TransientPoolWithQuotaTag, Src, v4);
v11 = 32i64 * *((unsigned int *)v6 + 3);
if( v11 > 0xFFFFFFFF )
goto LABEL_12;
v12 = (unsigned int)(v11 + 16);
if( (unsigned int)v12 < (unsigned int)v11 )
goto LABEL_12;
if( (_DWORD)v12 != (_DWORD)v4 )
{
LABEL_4:
updated = -1073741820;
goto LABEL_13;
}
if( *((_DWORD *)v6 + 2) == 1 )
updated = CmFcManagerUpdateFeatureConfigurations(v12, *v6, 1, (__int64)(v6 + 2));
else
LABEL_12:
updated = -1073741811;
}
else
{
updated = -1073741670;
}
LABEL_13:
if( v6 )
CmSiFreeMemory((PPRIVILEGE_SET)v6);
return updated;
}Referenced by:
NtSetSystemInformation