CmpVEExecuteParseLogic
INT64 __fastcall CmpVEExecuteParseLogic(INT64 a1, __m128i *a2, INT64 a3, __m128i *a4, CHAR a5, INT64 a6){
__int64 v10;
__int16 i;
__int64 v12;
INT64 result;
int *v14;
char v15;
void **p_SubjectContext;
void *v17;
void *v18;
bool v19;
bool v20;
int v21;
int v22;
_EPROCESS *CurrentThreadProcess;
PVOID TokenInformation;
int v25;
__int16 v26;
__int16 v27;
__int64 v28[3];
struct _SECURITY_SUBJECT_CONTEXT SubjectContext;
if( !CmpVEEnabled || (*(_DWORD *)(a3 + 24) & 0x10) != 0 || *(_WORD *)(a1 + 66) )
return 3221226097i64;
v10 = *(_QWORD *)(a1 + 32);
if( v10 == CmpMasterHive )
return 3221226097i64;
v26 = 0;
v27 = 0;
v28[1] = 0i64;
v25 = 0;
v28[2] = 0i64;
v28[0] = a1;
for( i = 0; i >= 0; --i )
{
if( i >= 2 )
v12 = *(_QWORD *)(8i64 * i - 16);
else
v12 = v28[i];
if( *(_WORD *)(v12 + 66) && *(_BYTE *)(v12 + 65) == 1 )
goto LABEL_14;
if( *(_DWORD *)(v12 + 40) != -1 )
break;
}
if( (*(_DWORD *)(v10 + 4152) & 0x10) == 0 && (*(_DWORD *)(a1 + 184) & 0x2000000) == 0 )
return 3221226097i64;
LABEL_14:
v14 = (int *)(a3 + 16);
v15 = 0;
memset(&SubjectContext, 0, sizeof(SubjectContext));
if( a3 != -16 && (*v14 & 1) != 0 )
{
v20 = (*v14 & 2) != 0;
}
else
{
if( !a5 )
return 3221226097i64;
if( a6 )
{
p_SubjectContext = (void **)a6;
}
else
{
CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
SeCaptureSubjectContextEx((_ETHREAD *)KeGetCurrentThread(), CurrentThreadProcess, &SubjectContext);
p_SubjectContext = (void **)&SubjectContext;
v15 = 1;
}
v17 = *p_SubjectContext;
LODWORD(TokenInformation) = 0;
if( v17 )
v18 = v17;
else
v18 = p_SubjectContext[2];
v19 = 1;
if( !v17 )
{
SeQueryInformationToken(v18, TokenVirtualizationEnabled, &TokenInformation);
if( (_DWORD)TokenInformation )
v19 = 0;
}
v20 = v19;
if( v14 )
{
v21 = *v14;
if( v19 )
{
v22 = v21 | 3;
}
else
{
v22 = v21 | 5;
v20 = 0;
}
*v14 = v22;
}
if( v15 )
SeReleaseSubjectContext(&SubjectContext);
}
if( v20 || (*(_DWORD *)a3 & 8) != 0 )
return 3221226097i64;
if( (*(_DWORD *)(a3 + 160) & 1) == 0 )
{
CmpAttachToRegistryProcess((KAPC_STATE *)(a3 + 168));
*(_DWORD *)(a3 + 160) |= 1u;
}
if( (*(_DWORD *)(a1 + 184) & 0x2000000) == 0 )
return CmpVEExecuteRealStoreParseLogic(a1, a2, (_DWORD *)a3, a4, a6);
CmpVEExecuteVirtualStoreParseLogic((_CM_KEY_CONTROL_BLOCK *)a1, (_UNICODE_STRING *)a2);
return result;
}Referenced by:
CmpDoParseKey