CmpUnblockHiveWrites
__int64 __fastcall CmpUnblockHiveWrites(volatile signed __int64 *P, int a2, volatile signed __int32 *a3){
volatile signed __int32 *v5;
volatile signed __int64 *v6;
char v7;
__int64 result;
__int64 *i;
volatile INT64 *v10;
v5 = (volatile signed __int32 *)P;
if( P )
{
v6 = P + 9;
v7 = _InterlockedExchangeAdd64(P + 9, 0xFFFFFFFFFFFFFFFFui64);
if( (v7 & 2) != 0 && (v7 & 4) == 0 )
ExfTryToWakePushLock(P + 9);
KeAbPostRelease((PVOID)v6);
}
else
{
for( i = CmpGetNextHive(0i64); ; i = CmpGetNextHive(v5) )
{
v5 = (volatile signed __int32 *)i;
if( !a2 || (a2 & (_DWORD)i[519]) == a2 || i == (__int64 *)CmpMasterHive )
{
v10 = i + 9;
if( (_InterlockedExchangeAdd64(i + 9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v10);
KeAbPostRelease((PVOID)v10);
if( _InterlockedExchangeAdd(v5 + 1068, 0xFFFFFFFF) == 1 )
CmpDeleteHive((PVOID)v5);
}
if( v5 == a3 )
break;
}
}
result = (unsigned int)_InterlockedDecrement(v5 + 1068);
if( !(_DWORD)result )
return CmpDeleteHive((PVOID)v5);
return result;
}Referenced by:
CmpVEExecuteOpenLogic
CmpVEExecuteRealStoreParseLogic
CmpVEExecuteVirtualStoreParseLogic