HvlSetupLiveDumpBuffer

INT64 __fastcall HvlSetupLiveDumpBuffer(_QWORD *a1, UINT64 a2, UINT64 a3, _QWORD *a4, UINT64 *a5, _QWORD *a6){
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  PHYSICAL_ADDRESS **v17; 
  PHYSICAL_ADDRESS *v18; 
  PHYSICAL_ADDRESS PhysicalAddress; 
  _QWORD *v20; 
  unsigned __int64 v21; 
  char *v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  PHYSICAL_ADDRESS **v26; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  PHYSICAL_ADDRESS *v29; 
  unsigned __int64 v30; 
  unsigned __int64 v31; 
  char *v32; 
  PHYSICAL_ADDRESS **v33; 
  void **v34; 
  unsigned __int64 v35; 
  unsigned __int64 v36; 
  PHYSICAL_ADDRESS *v37; 
  UINT64 v38; 
  char **v39; 
  char *v40; 
  void **v41; 
  unsigned __int64 v42; 
  unsigned __int64 v43; 
  unsigned __int64 v44; 
  PHYSICAL_ADDRESS **v45; 
  UINT64 v46; 
  __int64 v47; 
  unsigned __int64 v49; 
  PHYSICAL_ADDRESS **v50; 
  v6 = (unsigned int)a3;
  v7 = (unsigned int)a3 * (unsigned __int64)(unsigned int)a2;
  if( v7 < 5 )
    return 3221225507i64;
  v9 = v7 - 2;
  v10 = v9 / 0x40201;
  if( v9 / 0x40201 >= 0x200 )
    v10 = 512i64;
  v11 = v10 << 9;
  v42 = v10 << 9;
  v12 = v10 << 18;
  v49 = v10 << 18;
  v13 = v9 - 262657 * v10;
  if( v13 >= 3 && v10 < 0x200 )
  {
    v14 = v13 - 1;
    ++v10;
    v11 += v14 / 0x201;
    v12 += (v14 / 0x201) << 9;
    v42 = v11;
    v49 = v12;
    v15 = v14 % 0x201;
    if( v15 >= 2 )
    {
      ++v11;
      v12 = v15 + v12 - 1;
      v42 = v11;
      v49 = v12;
    }
  }
  *a4 = v10 + 2;
  v44 = v10 + 2;
  v46 = v10 + 2 + v11;
  *a5 = v46;
  v47 = *a1;
  *(_DWORD *)(v47 + 8) = 3;
  *(_QWORD *)v47 = v12;
  v16 = 1 % v6;
  v17 = (PHYSICAL_ADDRESS **)&a1[1 / v6];
  v18 = &(*v17)[512 * (1 % v6)];
  v45 = v17;
  PhysicalAddress = MmGetPhysicalAddress(v18);
  v20 = a1;
  *(_QWORD *)(v47 + 16) = (unsigned __int64)PhysicalAddress.QuadPart >> 12;
  v21 = 2 / v6;
  v43 = 2 % v6;
  v22 = (char *)(a1[2 / v6] + ((2 % v6) << 12));
  v41 = (void **)&a1[2 / v6];
  if( v10 )
  {
    v23 = 0i64;
    v24 = 2 % v6;
    do
    {
      *v18 = MmGetPhysicalAddress(v22);
      v22 += 4096;
      ++v18;
      if( (++v23 & 0x1FF) == 0 && !(++v16 % v6) )
      {
        ++v45;
        v16 = 0i64;
        v18 = *v45;
      }
      v25 = (v24 + 1) % v6;
      if( !v25 )
        v22 = (char *)*++v41;
      v24 = (v24 + 1) & -(__int64)(v25 != 0);
    }
    while( v23 < v10 );
    v11 = v42;
    v12 = v49;
    v20 = a1;
    v21 = 2 / v6;
  }
  v26 = (PHYSICAL_ADDRESS **)&v20[v21];
  v27 = v44 / v6;
  v28 = 0i64;
  v29 = &(*v26)[512 * (2 % v6)];
  v30 = v44 % v6;
  v31 = v44 % v6;
  v32 = (char *)(v20[v44 / v6] + ((v44 % v6) << 12));
  if( v11 )
  {
    v33 = v26;
    v34 = (void **)&v20[v44 / v6];
    do
    {
      *v29 = MmGetPhysicalAddress(v32);
      v32 += 4096;
      ++v29;
      if( (++v28 & 0x1FF) == 0 && !(++v43 % v6) )
      {
        ++v33;
        v43 = 0i64;
        v29 = *v33;
      }
      v35 = (v31 + 1) % v6;
      if( !v35 )
        v32 = (char *)*++v34;
      v31 = (v31 + 1) & -(__int64)(v35 != 0);
    }
    while( v28 < v11 );
    v12 = v49;
    v30 = v44 % v6;
    v20 = a1;
    v27 = v44 / v6;
  }
  v36 = 0i64;
  v37 = (PHYSICAL_ADDRESS *)(v20[v27] + (v30 << 12));
  v38 = v46 % v6;
  v50 = (PHYSICAL_ADDRESS **)&v20[v27];
  v39 = (char **)&v20[v46 / v6];
  v40 = &(*v39)[4096 * (v46 % v6)];
  while( v36 < v12 )
  {
    *v37 = MmGetPhysicalAddress(v40);
    v40 += 4096;
    ++v37;
    if( (++v36 & 0x1FF) == 0 && !(++v30 % v6) )
    {
      ++v50;
      v30 = 0i64;
      v37 = *v50;
    }
    if( !(++v38 % v6) )
    {
      if( v36 >= v12 )
        break;
      ++v39;
      v38 = 0i64;
      v40 = *v39;
    }
  }
  *a6 = v47;
  return 0i64;
}

Referenced by:

HvlPrepareLivedumpDescriptor