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