CmpGetNextHive
_CMHIVE *__stdcall CmpGetNextHive(_CMHIVE *OldHive){
_CMHIVE *v1;
_LIST_ENTRY *p_HiveList;
__int64 *Flink;
__int64 **v5;
v1 = 0i64;
p_HiveList = (_LIST_ENTRY *)&CmpHiveListHead;
if( OldHive )
p_HiveList = &OldHive->HiveList;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 340, 0i64);
Flink = (__int64 *)p_HiveList->Flink;
while( Flink != &CmpHiveListHead )
{
v1 = (_CMHIVE *)(Flink - 200);
if( CmpReferenceHive((__int64)(Flink - 200)) )
break;
Flink = *v5;
v1 = 0i64;
}
ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2720, 0);
if( OldHive && _InterlockedExchangeAdd(&OldHive->ReferenceCount, 0xFFFFFFFF) == 1 )
CmpDeleteHive(OldHive);
return v1;
}Referenced by:
CmLoadAppKey
CmpBlockHiveWrites
CmpDoFlushAll
CmpUnblockHiveWrites