CmpQueryKeyDataFromCache
INT64 __fastcall CmpQueryKeyDataFromCache(
_CM_KEY_CONTROL_BLOCK *Kcb,
_KEY_INFORMATION_CLASS KeyInformationClass,
VOID *KeyInformation,
UINT64 Length,
UINT64 *ResultLength,
_CM_TRANS *CmTrans){
unsigned int v6;
_CM_NAME_CONTROL_BLOCK *NameBlock;
unsigned __int16 NameLength;
int VisibleMaxNameLenAndClassLen;
int v12;
int v13;
_CELL_DATA *v14;
UINT64 MaxValueNameLen;
int v17;
int v18[4];
UINT64 v19;
v6 = Length;
v18[0] = -1;
v18[1] = 0;
LODWORD(v19) = 0;
MaxValueNameLen = 0i64;
NameBlock = Kcb->NameBlock;
if( !NameBlock )
return 3221225626i64;
NameLength = NameBlock->NameHash.NameLength;
if( (*(_DWORD *)NameBlock & 1) != 0 )
NameLength *= 2;
if( KeyInformationClass == KeyCachedInformation )
{
VisibleMaxNameLenAndClassLen = CmGetVisibleMaxNameLenAndClassLen((INT64)Kcb, 0i64, (INT64)CmTrans, &v19, 0i64);
if( VisibleMaxNameLenAndClassLen >= 0 )
{
VisibleMaxNameLenAndClassLen = CmGetVisibleMaxValueNameLenAndDataLen(
Kcb,
0i64,
CmTrans,
&MaxValueNameLen,
(UINT64 *)((char *)&MaxValueNameLen + 4));
if( VisibleMaxNameLenAndClassLen >= 0 )
{
*(_DWORD *)ResultLength = 40;
if( v6 < 0x28 )
{
VisibleMaxNameLenAndClassLen = -1073741789;
v17 = -1073741789;
}
else
{
*(_QWORD *)KeyInformation = CmGetKeyLastWriteTime((LIST_ENTRY *)Kcb, 0i64, (INT64)CmTrans);
*((_DWORD *)KeyInformation + 2) = 0;
*((_DWORD *)KeyInformation + 8) = NameLength;
*((_DWORD *)KeyInformation + 5) = CmGetVisibleValueCount();
*((_DWORD *)KeyInformation + 4) = v19;
*((_QWORD *)KeyInformation + 3) = MaxValueNameLen;
v13 = *((_DWORD *)Kcb + 2);
if( (v13 & 0x40) != 0 || Kcb->KCBUoWListHead.Flink != &Kcb->KCBUoWListHead )
{
v14 = Kcb->KeyHash.KeyHive->GetCellRoutine(Kcb->KeyHash.KeyHive, Kcb->KeyHash.KeyCell, v18);
if( v14 )
{
*((_DWORD *)KeyInformation + 3) = CmGetVisibleSubkeyCount((LIST_ENTRY *)Kcb, (INT64)v14, (INT64)CmTrans);
Kcb->KeyHash.KeyHive->ReleaseCellRoutine(Kcb->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v18);
}
else
{
VisibleMaxNameLenAndClassLen = -1073741670;
v17 = -1073741670;
}
}
else if( (v13 & 1) != 0 )
{
*((_DWORD *)KeyInformation + 3) = v12;
}
else if( (v13 & 2) != 0 )
{
*((_DWORD *)KeyInformation + 3) = 1;
}
else if( (v13 & 4) != 0 )
{
*((_DWORD *)KeyInformation + 3) = Kcb->IndexHint->Count;
}
else
{
*((_DWORD *)KeyInformation + 3) = Kcb->HashKey;
}
}
}
}
}
else
{
return(unsigned int)-1073741811;
}
return(unsigned int)VisibleMaxNameLenAndClassLen;
}Referenced by:
CmpQueryKeyData