CmpIsHiveAlreadyLoaded
UINT8 __stdcall CmpIsHiveAlreadyLoaded(
_CM_KEY_BODY *KeyBody,
_FILE_OBJECT *FileObject,
UINT64 Flags,
_CMHIVE **CmHive,
_UNICODE_STRING **PathToRoot){
UINT8 v5;
_CM_KEY_CONTROL_BLOCK *KeyControlBlock;
_CMHIVE *KeyHive;
_CMHIVE *v11;
_CMHIVE *i;
_CMHIVE *NextActiveHive;
_CMHIVE *v14;
_CM_KEY_CONTROL_BLOCK *RootKcb;
_UNICODE_STRING *v16;
v5 = 0;
if( (Flags & 0x20) == 0 )
{
if( KeyBody )
{
if( !CmpIsKeyDeletedForKeyBody(KeyBody, 0i64) )
{
KeyControlBlock = KeyBody->KeyControlBlock;
KeyHive = (_CMHIVE *)KeyControlBlock->KeyHash.KeyHive;
LODWORD(KeyControlBlock) = KeyControlBlock->_bf_b8;
*CmHive = KeyHive;
if( ((unsigned int)KeyControlBlock & 0x40000) != 0 )
{
if( CmpIsThisSameFile(FileObject, KeyHive->FileHandles[0]) )
{
v11 = *CmHive;
if( ((*CmHive)->Flags & 0x40) == 0 && (KeyBody->KeyControlBlock->_bf_8 & 0x40000) == 0 )
{
v5 = 1;
if( v11->Frozen == 1 )
{
CmpUnfreezeHive(v11);
(*CmHive)->Frozen = 0;
}
}
}
}
}
}
else if( (Flags & 0x10) != 0 )
{
for( i = 0i64; ; i = v14 )
{
NextActiveHive = CmpGetNextActiveHive(i);
v14 = NextActiveHive;
if( !NextActiveHive )
break;
if( (NextActiveHive->Flags & 0x20) != 0
&& CmpIsThisSameFile(FileObject, NextActiveHive->FileHandles[0])
&& (v14->Flags & 0x40) == 0 )
{
RootKcb = v14->RootKcb;
*CmHive = v14;
v16 = CmpConstructName(RootKcb);
*PathToRoot = v16;
CmpQuitNextActiveHive((_EX_RUNDOWN_REF *)v14);
return v16 != 0i64;
}
}
}
}
return v5;
}Referenced by:
CmpResolveHiveLoadConflict