CmpVEExecuteRealStoreParseLogic

INT64 __fastcall CmpVEExecuteRealStoreParseLogic(INT64 a1, __m128i *a2, _DWORD *a3, __m128i *a4, INT64 a5){
  volatile signed __int64 *v8; 
  __int64 v9; 
  INT64 v10; 
  int v11; 
  CHAR PathByName; 
  CHAR v13; 
  WCHAR v14; 
  __int64 v16; 
  void *v17; 
  char ParentReplicated[4]; 
  UINT64 v19; 
  __int16 v20; 
  __int16 v21; 
  INT64 v22; 
  struct _UNICODE_STRING DestinationString; 
  v21 = 0;
  v19 = 0xFFFFFFFF00000000ui64;
  ParentReplicated[0] = 0;
  v20 = 0;
  v22 = 0i64;
  DestinationString = 0i64;
  v8 = 0i64;
  v9 = 0i64;
  v10 = 0i64;
  RtlInitUnicodeString(&DestinationString, 0i64, (WCHAR)a3);
  if( CmpIsKeyDeleted(a1, 0i64) )
  {
    v13 = 0;
  }
  else
  {
    v11 = CmpBlockHiveWrites(*(_CMHIVE **)(a1 + 32), 0i64, 0i64);
    if( v11 < 0 )
      goto LABEL_9;
    v8 = *(volatile signed __int64 **)(a1 + 32);
    PathByName = CmpFindPathByName(a1, a2, 0i64, &v19, &v22);
    v10 = v22;
    v13 = PathByName;
    if( PathByName )
    {
      v16 = (*(__int64(__fastcall **)(INT64, _QWORD, char *))(v22 + 8))(v22, (unsigned int)v19, (char *)&v19 + 4);
      v9 = v16;
      if( !v16 )
      {
        v11 = -1073741670;
        goto LABEL_9;
      }
      if( (*(_DWORD *)(v16 + 52) & 0x200000) != 0 )
      {
LABEL_8:
        v11 = -1073741199;
        goto LABEL_9;
      }
      (*(void(__fastcall **)(INT64, char *))(v10 + 16))(v10, (char *)&v19 + 4);
    }
    CmpUnblockHiveWrites(*(volatile signed __int64 **)(a1 + 32), 0, 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;
  }
  v17 = (void *)a4->m128i_i64[1];
  if( v17 )
    ExFreePoolWithTag(v17, 0);
  *(struct _UNICODE_STRING *)a4 = DestinationString;
  RtlInitUnicodeString(&DestinationString, 0i64, v14);
  v11 = 260;
LABEL_9:
  if( DestinationString.Buffer )
    ExFreePoolWithTag(DestinationString.Buffer, 0);
  if( v9 )
    (*(void(__fastcall **)(INT64, char *))(v10 + 16))(v10, (char *)&v19 + 4);
  if( v8 )
    CmpUnblockHiveWrites(v8, 0, 0i64);
  return(unsigned int)v11;
}

Referenced by:

CmpVEExecuteParseLogic