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