CmpFindSecurityCellCacheIndex

UINT8 __stdcall CmpFindSecurityCellCacheIndex(CMHIVE *CmHive, UINT64 SecurityCell, UINT64 *Index){
  UINT64 SecurityCount; 
  int v5; 
  UINT8 result; 
  __int64 SecurityHitHint; 
  _CM_KEY_SECURITY_CACHE_ENTRY *SecurityCache; 
  UINT64 *LowerBoundInSortedArray; 
  unsigned __int64 v11; 
  UINT64 v12; 

  LODWORD(v12) = SecurityCell;
  SecurityCount = CmHive->SecurityCount;
  v5 = SecurityCell;
  if( (_DWORD)SecurityCount )
  {
    SecurityHitHint = CmHive->SecurityHitHint;
    if( (int)SecurityHitHint >= 0
      && (unsigned int)SecurityHitHint < (unsigned int)SecurityCount
      && CmHive->SecurityCache[SecurityHitHint].Cell == v5 )
    {
      *(_DWORD *)Index = SecurityHitHint;
      return 1;
    }
    else
    {
      SecurityCache = CmHive->SecurityCache;
      LowerBoundInSortedArray = CmpFindLowerBoundInSortedArray(&v12, (UINT64 *)&SecurityCache->Cell, SecurityCount);
      v11 = (unsigned __int64)((char *)LowerBoundInSortedArray - (char *)SecurityCache) >> 4;
      if( (unsigned int)v11 < (unsigned int)SecurityCount && *(_DWORD *)LowerBoundInSortedArray == v5 )
      {
        CmHive->SecurityHitHint = v11;
        result = 1;
        *(_DWORD *)Index = v11;
      }
      else
      {
        *(_DWORD *)Index = v11;
        return 0;
      }
    }
  }
  else
  {
    *(_DWORD *)Index = 0;
    return 0;
  }
  return result;
}

Referenced by:

CmpAddSecurityCellToCache
CmpAssignSecurityToKcb
CmpCheckKey
CmpCopyKeyPartial
CmpCreateKeyControlBlock
CmpRemoveFromSecurityCache
CmpSetSecurityDescriptorInfo
CmpSyncKeyValues
CmpValidateHiveSecurityDescriptors