CmpVEExecuteRealStoreParseLogic

INT64 __fastcall CmpVEExecuteRealStoreParseLogic(INT64 a1, __m128i *a2, _DWORD *a3, __m128i *a4, INT64 a5){
  _CMHIVE *v8; 
  __int64 v9; 
  __int64 v10; 
  int v11; 
  char PathByName; 
  char v13; 
  __int64 v15; 
  void *v16; 
  char ParentReplicated[4]; 
  unsigned int v18; 
  __int64 v19; 
  __int64 v20; 
  _UNICODE_STRING DestinationString; 

  v19 = 0xFFFFFFFFi64;
  v18 = 0;
  ParentReplicated[0] = 0;
  v20 = 0i64;
  DestinationString = 0i64;
  v8 = 0i64;
  v9 = 0i64;
  v10 = 0i64;
  RtlInitUnicodeString(&DestinationString, 0i64);
  if( CmpIsKeyDeleted(a1, 0i64) )
  {
    v13 = 0;
  }
  else
  {
    v11 = CmpBlockHiveWrites(*(_CMHIVE **)(a1 + 32), 0i64, 0i64);
    if( v11 < 0 )
      goto LABEL_9;
    v8 = *(_CMHIVE **)(a1 + 32);
    PathByName = CmpFindPathByName(a1, a2, 0i64, &v18, &v20);
    v10 = v20;
    v13 = PathByName;
    if( PathByName )
    {
      v15 = (*(__int64(__fastcall **)(__int64, _QWORD, __int64 *))(v20 + 8))(v20, v18, &v19);
      v9 = v15;
      if( !v15 )
      {
        v11 = -1073741670;
        goto LABEL_9;
      }
      if( (*(_DWORD *)(v15 + 52) & 0x200000) != 0 )
      {
LABEL_8:
        v11 = -1073741199;
        goto LABEL_9;
      }
      (*(void(__fastcall **)(__int64, __int64 *))(v10 + 16))(v10, &v19);
    }
    CmpUnblockHiveWrites(*(_CMHIVE **)(a1 + 32), 0i64, 0i64);
  }
  v8 = 0i64;
  v9 = 0i64;
  v11 = CmRealKCBToVirtualPath(a1, a2, a5, &DestinationString);
  if( v11 < 0 )
    goto LABEL_9;
  *a3 |= 8u;
  if( !(unsigned __int8)CmpVirtualBranchIsReplicated(0i64, &DestinationString, (UINT8 *)ParentReplicated)
    && ((*a3 & 1) == 0 || v13 || !ParentReplicated[0]) )
  {
    goto LABEL_8;
  }
  v16 = (void *)a4->m128i_i64[1];
  if( v16 )
    ExFreePoolWithTag(v16, 0);
  *(_UNICODE_STRING *)a4 = DestinationString;
  RtlInitUnicodeString(&DestinationString, 0i64);
  v11 = 260;
LABEL_9:
  if( DestinationString.Buffer )
    ExFreePoolWithTag(DestinationString.Buffer, 0);
  if( v9 )
    (*(void(__fastcall **)(__int64, __int64 *))(v10 + 16))(v10, &v19);
  if( v8 )
    CmpUnblockHiveWrites(v8, 0i64, 0i64);
  return(unsigned int)v11;
}

Referenced by:

CmpVEExecuteParseLogic