CmpBlockTwoHiveWrites
NTSTATUS __stdcall CmpBlockTwoHiveWrites(_CMHIVE *Hive1, _CMHIVE *Hive2, UINT8 Reference){
char v3;
char v4;
_CMHIVE *i;
_CMHIVE *NextActiveHive;
_CMHIVE *v10;
_CMHIVE *v12;
v3 = 0;
v4 = 0;
for( i = 0i64; ; i = v10 )
{
NextActiveHive = CmpGetNextActiveHive(i);
v10 = NextActiveHive;
if( !NextActiveHive )
break;
if( Hive1 == NextActiveHive || Hive2 == NextActiveHive )
{
if( Reference )
CmpReferenceHive((__int64)NextActiveHive);
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&v10->Hive.FlusherLock, 0i64);
if( Hive1 == v10 )
v3 = 1;
else
v4 = 1;
if( (!Hive1 || v3 == 1) && (!Hive2 || v4 == 1) )
{
ExReleaseRundownProtection(&v10->HiveRundown);
break;
}
}
}
if( (!Hive1 || v3) && (!Hive2 || v4) )
return 0;
if( v3 == 1 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Hive1->Hive.FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&Hive1->Hive.FlusherLock);
KeAbPostRelease(&Hive1->Hive.FlusherLock);
if( !Reference || _InterlockedExchangeAdd(&Hive1->ReferenceCount, 0xFFFFFFFF) != 1 )
return -1073741772;
v12 = Hive1;
}
else
{
if( v4 != 1 )
return -1073741772;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Hive2->Hive.FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&Hive2->Hive.FlusherLock);
KeAbPostRelease(&Hive2->Hive.FlusherLock);
if( !Reference || _InterlockedExchangeAdd(&Hive2->ReferenceCount, 0xFFFFFFFF) != 1 )
return -1073741772;
v12 = Hive2;
}
CmpDeleteHive(v12);
return -1073741772;
}Referenced by:
CmSaveMergedKeys
CmpVirtualBranchIsReplicated
CmpVirtualPathPresent