CmpBlockHiveWrites
NTSTATUS __stdcall CmpBlockHiveWrites(_CMHIVE *Hive, UINT64 Flags, _CMHIVE **TerminalHive){
volatile signed __int32 *v5;
int v6;
__int64 *NextHive;
__int64 *v8;
v5 = 0i64;
v6 = Flags;
while( 1 )
{
NextHive = CmpGetNextHive(v5);
v8 = NextHive;
if( !NextHive )
break;
if( Hive == (_CMHIVE *)NextHive || !Hive )
{
if( !v6 || (v6 & (_DWORD)NextHive[519]) == v6 || NextHive == (__int64 *)CmpMasterHive )
{
CmpReferenceHive((_CMHIVE *)NextHive);
if( TerminalHive )
*TerminalHive = (_CMHIVE *)v8;
ExAcquirePushLockExclusiveEx((UINT64)(v8 + 9), 0i64);
}
if( Hive == (_CMHIVE *)v8 )
{
if( _InterlockedExchangeAdd((volatile signed __int32 *)v8 + 1068, 0xFFFFFFFF) == 1 )
CmpDeleteHive(v8);
return 0;
}
}
v5 = (volatile signed __int32 *)v8;
}
if( !Hive )
return 0;
return -1073741772;
}Referenced by:
CmpVEExecuteOpenLogic
CmpVEExecuteRealStoreParseLogic
CmpVEExecuteVirtualStoreParseLogic