IopLiveDumpEstimateMemoryPages

__int64 __fastcall IopLiveDumpEstimateMemoryPages(__int64 a1){
  INT64 v1; 
  __int64 v3; 
  int v4; 
  int v5; 
  int v6; 
  UINT64 v7; 
  UINT64 v8; 
  INT64 MillisecondCounter; 
  unsigned __int64 v10; 
  bool v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  bool v14; 
  bool v16; 
  int v17; 
  unsigned __int64 a1a; 
  unsigned __int64 a2; 
  unsigned __int64 a3; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27[3]; 
  __int128 v28; 
  struct _EVENT_DATA_DESCRIPTOR v29; 
  __int64 *v30; 
  __int64 v31; 
  __int64 *v32; 
  __int64 v33; 
  __int64 *v34; 
  __int64 v35; 
  __int64 *v36; 
  __int64 v37; 
  __int64 *v38; 
  __int64 v39; 
  __int64 *v40; 
  __int64 v41; 
  struct _EVENT_DATA_DESCRIPTOR v42; 
  char *v43; 
  __int64 v44; 
  int *v45; 
  __int64 v46; 
  v1 = a1 + 304;
  v28 = 0i64;
  v3 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  *(_DWORD *)(a1 + 80) |= 1u;
  a1a = 0i64;
  a2 = 0i64;
  a3 = 0i64;
  IopLiveDumpCallRemovePagesCallbacks(a1);
  v27[0] = (__int64)IopLiveDumpStartMirroringCallback;
  v27[1] = (__int64)IopLiveDumpEndMirroringCallback;
  v27[2] = (__int64)IopLiveDumpMirrorPhysicalMemoryCallback;
  v4 = *(_DWORD *)(a1 + 80);
  v5 = (*(_BYTE *)(a1 + 40) & 4) != 0 ? 657 : 593;
  DWORD2(v28) = v5;
  if( (v4 & 0x20) != 0 )
    DWORD2(v28) = v5 | 0x100;
  v6 = MmDuplicateMemory((__int64)v27);
  if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
    *(_QWORD *)(a1 + 464) = (unsigned __int64)(1000i64 * *(_QWORD *)(a1 + 456)) / PerformanceFrequency.QuadPart;
  if( v6 < 0 || v6 == 258 )
  {
    if( (*(_DWORD *)(v1 + 8) & 1) != 0 )
      IopLiveDumpUncorralProcessors(v1, 1);
    *(_QWORD *)(a1 + 96) = 0i64;
    *(_QWORD *)(a1 + 120) = 0i64;
    *(_QWORD *)(a1 + 128) = 0i64;
    *(_QWORD *)(a1 + 136) = 0i64;
    IopLiveDumpTraceMmDuplicateMemoryFailure(a1, (unsigned int)v6);
    if( v6 == 258 )
    {
      *(_DWORD *)(a1 + 80) |= 0x40u;
      v6 = -1073740682;
    }
  }
  else
  {
    v7 = RtlNumberOfSetBitsEx((_RTL_BITMAP_EX *)(a1 + 544));
    *(_QWORD *)(a1 + 120) = 0i64;
    v8 = v7 + (v7 >> 4);
    *(_QWORD *)(a1 + 128) = 0i64;
    LODWORD(v7) = *(_DWORD *)(a1 + 44);
    *(_QWORD *)(a1 + 96) = v8;
    *(_QWORD *)(a1 + 136) = 0i64;
    if( (v7 & 1) != 0 )
    {
      MillisecondCounter = 0i64;
      if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
        MillisecondCounter = IopLiveDumpGetMillisecondCounter(0);
      v6 = HvlCalculateLivedumpSize(&a1a, &a2, &a3);
      if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
        *(_QWORD *)(a1 + 288) = IopLiveDumpGetMillisecondCounter(0) - MillisecondCounter;
      if( v6 < 0 )
      {
        *(_DWORD *)(a1 + 80) |= 0x10u;
        IopLiveDumpTraceQueryHvlDumpSizeFailure(v6);
        if( (unsigned int)dword_140C04498 > 5 && tlgKeywordOn((__int64)&dword_140C04498, 0x200000000000i64) )
        {
          v14 = (*(_DWORD *)(a1 + 80) & 0x10) != 0;
          v44 = 1i64;
          v16 = v14;
          v17 = v6;
          v46 = 4i64;
          v43 = (char *)&v16;
          v45 = &v17;
          tlgWriteTransfer_EtwWriteTransfer(
            (__int64)&dword_140C04498,
            (unsigned __int8 *)byte_140023EAD,
            (const GUID *)(a1 + 864),
            (const GUID *)(a1 + 848),
            4u,
            &v42);
        }
        v6 = 0;
      }
      else
      {
        v10 = a2;
        v11 = (a2 & 0xFFF) == 0;
        *(_QWORD *)(a1 + 120) = (a1a >> 12) + ((a1a & 0xFFF) != 0);
        v12 = (v10 >> 12) + !v11;
        v13 = a3;
        v11 = (a3 & 0xFFF) == 0;
        *(_QWORD *)(a1 + 128) = v12;
        *(_QWORD *)(a1 + 136) = (v13 >> 12) + !v11;
      }
    }
  }
  *(_QWORD *)(a1 + 432) = (*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v3) / 0x2710ui64;
  IopLiveDumpTraceBufferEstimation();
  RtlClearAllBitsEx((_RTL_BITMAP_EX *)(a1 + 544));
  RtlClearAllBitsEx((_RTL_BITMAP_EX *)(a1 + 600));
  RtlClearAllBitsEx((_RTL_BITMAP_EX *)(a1 + 656));
  *(_DWORD *)(a1 + 80) &= ~1u;
  if( (unsigned int)dword_140C04498 > 5 && tlgKeywordOn((__int64)&dword_140C04498, 0x200000000000i64) )
  {
    v21 = *(_QWORD *)(a1 + 432);
    v30 = &v21;
    v22 = *(_QWORD *)(a1 + 440);
    v32 = &v22;
    v23 = *(_QWORD *)(a1 + 448);
    v34 = &v23;
    v24 = *(_QWORD *)(a1 + 464);
    v36 = &v24;
    v25 = *(_QWORD *)(a1 + 472);
    v38 = &v25;
    v26 = *(_QWORD *)(a1 + 288);
    v40 = &v26;
    v31 = 8i64;
    v33 = 8i64;
    v35 = 8i64;
    v37 = 8i64;
    v39 = 8i64;
    v41 = 8i64;
    tlgWriteTransfer_EtwWriteTransfer(
      (__int64)&dword_140C04498,
      (unsigned __int8 *)byte_140023DA1,
      (const GUID *)(a1 + 864),
      (const GUID *)(a1 + 848),
      8u,
      &v29);
  }
  return(unsigned int)v6;
}

Referenced by:

IopLiveDumpAllocAndInitResources