CmpCompareNewValueDataAgainstKCBCache

__int64 __fastcall CmpCompareNewValueDataAgainstKCBCache(
        _CM_KEY_CONTROL_BLOCK *KeyControlBlock,
        _UNICODE_STRING *ValueName,
        unsigned int Type,
        void *Data,
        unsigned int DataSize){
  char v8; 
  _CELL_DATA *v9; 
  unsigned int v10; 
  _CM_KEY_VALUE *v11; 
  unsigned int LowPart; 
  unsigned int v13; 
  VOID *p_Data; 
  unsigned int v15; 
  bool ValueData; 
  unsigned int ValueCell; 
  unsigned int ValueCell_4; 
  INT64 v20; 
  INT64 v21; 
  int v22[2]; 
  INT64 v23; 

  LOBYTE(v23) = 0;
  v20 = 0i64;
  ValueCell = 0;
  v22[1] = 0;
  v21 = 0xFFFFFFFFi64;
  v22[0] = -1;
  v8 = 0;
  if( (int)CmpFindNameInListWithStatus(
              KeyControlBlock->KeyHash.KeyHive,
              &KeyControlBlock->ValueList,
              ValueName,
              0,
              0i64,
              &ValueCell) < 0 )
    return 2;
  v9 = KeyControlBlock->KeyHash.KeyHive->GetCellRoutine(KeyControlBlock->KeyHash.KeyHive, ValueCell, v22);
  v10 = 2;
  v11 = (_CM_KEY_VALUE *)v9;
  if( (v9->u.KeyString[8] & 2) == 0 && Type == v9->u.KeyValue.Type )
  {
    LowPart = v9->u.KeyNode.LastWriteTime.anonymous_0.LowPart;
    if( DataSize == (LowPart & 0x7FFFFFFF) )
    {
      if( DataSize )
      {
        v13 = LowPart + 0x80000000;
        if( LowPart < 0x80000000 )
          v13 = LowPart;
        ValueCell_4 = v13;
        if( LowPart < 0x80000000 )
        {
          v8 = 1;
          ValueData = CmpGetValueData(
                        KeyControlBlock->KeyHash.KeyHive,
                        ValueCell,
                        v11,
                        &ValueCell_4,
                        (void **)&v20,
                        (unsigned __int8 *)&v23,
                        (_HV_GET_CELL_CONTEXT *)&v21);
          p_Data = (VOID *)v20;
          if( !ValueData )
            goto LABEL_11;
        }
        else
        {
          p_Data = &v11->Data;
        }
        v15 = (unsigned int)RtlCompareMemory(p_Data, Data, DataSize & 0x7FFFFFFF);
        v10 = DataSize != v15 ? 2 : 0;
LABEL_11:
        if( p_Data && v8 )
        {
          if( (_BYTE)v23 == 1 )
            ExFreePoolWithTag(p_Data, 0);
          else
            KeyControlBlock->KeyHash.KeyHive->ReleaseCellRoutine(
              KeyControlBlock->KeyHash.KeyHive,
              (_HV_GET_CELL_CONTEXT *)&v21);
        }
        goto LABEL_13;
      }
      v10 = 0;
    }
  }
LABEL_13:
  ((void(__fastcall *)(_HHIVE *, int *, _CM_KEY_VALUE *))KeyControlBlock->KeyHash.KeyHive->ReleaseCellRoutine)(
    KeyControlBlock->KeyHash.KeyHive,
    v22,
    v11);
  return v10;
}

Referenced by:

CmSetValueKey