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