CmpVEExecuteOpenLogic
INT64 __fastcall CmpVEExecuteOpenLogic(UINT64 a1, INT64 a2, WCHAR a3, INT64 a4, CHAR a5){
char v8;
NTSTATUS v9;
CHAR PathByName;
WCHAR v12;
void *v13;
__int64 v14;
__int64 v15;
UINT64 v16;
__int64 v17;
_CMHIVE *TerminalHive;
INT64 v19;
PVOID P[2];
LODWORD(v16) = 0;
v8 = a3;
v19 = 0i64;
TerminalHive = 0i64;
*(_OWORD *)P = 0i64;
RtlInitUnicodeString((PUNICODE_STRING)P, 0i64, a3);
v17 = 0xFFFFFFFFi64;
if( CmpVEEnabled )
{
if( (*(_DWORD *)(a2 + 24) & 0x10) != 0 )
{
v9 = -1073741199;
}
else if( *(_WORD *)(a1 + 66) )
{
v9 = -1073741199;
}
else if( (*(_DWORD *)(a1 + 184) & 0x2000000) != 0 )
{
if( (*(_DWORD *)(a1 + 8) & 0x7FE00000u) > 0xA00000 )
{
if( CmpIsSystemEntity((UINT64 *)(unsigned __int8)a5) )
{
v9 = -1073741199;
}
else if( CmpVEEnabled && (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
{
v9 = -1073741199;
}
else
{
if( (*(_DWORD *)(a2 + 160) & 1) == 0 )
{
CmpAttachToRegistryProcess((KAPC_STATE *)(a2 + 168));
*(_DWORD *)(a2 + 160) |= 1u;
}
v9 = CmVirtualKCBToRealPath((_CM_KEY_CONTROL_BLOCK *)a1, (_UNICODE_STRING *)P);
if( v9 >= 0 )
{
v9 = CmpBlockHiveWrites(0i64, 0x10ui64, &TerminalHive);
if( v9 < 0 )
{
if( TerminalHive )
CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)TerminalHive);
}
else
{
PathByName = CmpFindPathByName(0i64, (__m128i *)P, 0i64, &v16, &v19);
CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)TerminalHive);
if( PathByName )
{
v13 = *(void **)(a4 + 8);
if( v13 )
ExFreePoolWithTag(v13, 0);
*(_OWORD *)a4 = *(_OWORD *)P;
RtlInitUnicodeString((PUNICODE_STRING)P, 0i64, v12);
*(_DWORD *)a2 |= 8u;
v9 = 260;
}
else if( v8 || (CmpUnlockKcb(a1), CmpLockKcbExclusive(a1), !CmpIsKeyDeleted(a1, 0i64)) )
{
ExAcquirePushLockSharedEx(*(_QWORD *)(a1 + 32) + 72i64, 0i64);
v14 = *(_QWORD *)(a1 + 32);
v15 = (*(__int64(__fastcall **)(__int64, _QWORD, __int64 *))(v14 + 8))(
v14,
*(unsigned int *)(a1 + 40),
&v17);
if( v15 )
{
if( HvpMarkCellDirty(*(_QWORD *)(a1 + 32), *(unsigned int *)(a1 + 40), 1) )
{
*(_WORD *)(v15 + 2) |= 0x100u;
*(_WORD *)(a1 + 186) |= 0x100u;
*(_DWORD *)a2 |= 8u;
v9 = 260;
}
else
{
v9 = -1073741443;
}
(*(void(__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)(a1 + 32) + 16i64))(*(_QWORD *)(a1 + 32), &v17);
}
else
{
v9 = -1073741670;
}
if( v14 )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v14 + 72), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v14 + 72));
KeAbPostRelease((PVOID)(v14 + 72));
}
}
else
{
v9 = -1073741772;
}
}
}
}
}
else
{
v9 = -1073741199;
}
}
else
{
v9 = -1073741199;
}
}
else
{
v9 = -1073741199;
}
if( P[1] )
ExFreePoolWithTag(P[1], 0);
return(unsigned int)v9;
}Referenced by:
CmpDoParseKey