IopLiveDumpEstimateMemoryPages

NTSTATUS __stdcall IopLiveDumpEstimateMemoryPages(_LIVEDUMP_CONTEXT *Context){
  _LIVEDUMP_CONTEXT *v1; 
  __int64 v3; 
  _LIVEDUMP_CONTEXT v4; 
  int v5; 
  int v6; 
  UINT64 v7; 
  UINT64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  bool v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  bool v16; 
  bool v18; 
  int v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  _MM_MIRROR_DISPATCH MirrorDispatch[2]; 
  NTSTATUS(__stdcall *v30)(UINT64); 
  NTSTATUS(__stdcall *v31)(_LARGE_INTEGER, _LARGE_INTEGER); 
  __int128 v32; 
  _EVENT_DATA_DESCRIPTOR v33; 
  __int64 *v34; 
  __int64 v35; 
  __int64 *v36; 
  __int64 v37; 
  __int64 *v38; 
  __int64 v39; 
  __int64 *v40; 
  __int64 v41; 
  __int64 *v42; 
  __int64 v43; 
  __int64 *v44; 
  __int64 v45; 
  _EVENT_DATA_DESCRIPTOR v46; 
  char *v47; 
  __int64 v48; 
  int *v49; 
  __int64 v50; 

  v1 = Context + 76;
  v32 = 0i64;
  v3 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  Context[20] |= 1u;
  v20 = 0i64;
  v21 = 0i64;
  v22 = 0i64;
  IopLiveDumpCallRemovePagesCallbacks(Context);
  *(_QWORD *)MirrorDispatch = IopLiveDumpStartMirroringCallback;
  v30 = IopLiveDumpEndMirroringCallback;
  v31 = IopLiveDumpMirrorPhysicalMemoryCallback;
  v4 = Context[20];
  v5 = (Context[10] & 4) != 0 ? 657 : 593;
  DWORD2(v32) = v5;
  if( (v4 & 0x20) != 0 )
    DWORD2(v32) = v5 | 0x100;
  v6 = MmDuplicateMemory(MirrorDispatch);
  if( (Context[20] & 0x80u) != 0 )
    *((_QWORD *)Context + 58) = (unsigned __int64)(1000i64 * *((_QWORD *)Context + 57)) / *(&stru_140C452E0 + 85);
  if( v6 < 0 || v6 == 258 )
  {
    if( (v1[2] & 1) != 0 )
      IopLiveDumpUncorralProcessors(v1, 1u);
    *((_QWORD *)Context + 12) = 0i64;
    *((_QWORD *)Context + 15) = 0i64;
    *((_QWORD *)Context + 16) = 0i64;
    *((_QWORD *)Context + 17) = 0i64;
    IopLiveDumpTraceMmDuplicateMemoryFailure((__int64)Context, v6);
    if( v6 == 258 )
    {
      Context[20] |= 0x40u;
      v6 = -1073740682;
    }
  }
  else
  {
    v7 = RtlNumberOfSetBitsEx((_RTL_BITMAP_EX *)Context + 34);
    *((_QWORD *)Context + 15) = 0i64;
    v8 = v7 + (v7 >> 4);
    *((_QWORD *)Context + 16) = 0i64;
    LODWORD(v7) = Context[11];
    *((_QWORD *)Context + 12) = v8;
    *((_QWORD *)Context + 17) = 0i64;
    if( (v7 & 1) != 0 )
    {
      v9 = 0i64;
      if( (Context[20] & 0x80u) != 0 )
      {
        LODWORD(v10) = IopLiveDumpGetMillisecondCounter(0);
        v9 = v10;
      }
      v6 = HvlCalculateLivedumpSize(&v20, &v21, &v22);
      if( (Context[20] & 0x80u) != 0 )
      {
        LODWORD(v11) = IopLiveDumpGetMillisecondCounter(0);
        *((_QWORD *)Context + 36) = v11 - v9;
      }
      if( v6 < 0 )
      {
        Context[20] |= 0x10u;
        IopLiveDumpTraceQueryHvlDumpSizeFailure(v6);
        if( (unsigned int)dword_140C04498 > 5 && tlgKeywordOn((__int64)&dword_140C04498, 0x200000000000i64) )
        {
          v16 = (Context[20] & 0x10) != 0;
          v48 = 1i64;
          v18 = v16;
          v19 = v6;
          v50 = 4i64;
          v47 = (char *)&v18;
          v49 = &v19;
          tlgWriteTransfer_EtwWriteTransfer(
            (__int64)&dword_140C04498,
            (unsigned __int8 *)byte_140023EAD,
            (const _GUID *)Context + 54,
            (const _GUID *)Context + 53,
            4u,
            &v46);
        }
        v6 = 0;
      }
      else
      {
        v12 = v21;
        v13 = (v21 & 0xFFF) == 0;
        *((_QWORD *)Context + 15) = (v20 >> 12) + ((v20 & 0xFFF) != 0);
        v14 = (v12 >> 12) + !v13;
        v15 = v22;
        v13 = (v22 & 0xFFF) == 0;
        *((_QWORD *)Context + 16) = v14;
        *((_QWORD *)Context + 17) = (v15 >> 12) + !v13;
      }
    }
  }
  *((_QWORD *)Context + 54) = (*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v3) / 0x2710ui64;
  IopLiveDumpTraceBufferEstimation(Context);
  RtlClearAllBitsEx((_RTL_BITMAP_EX *)Context + 34);
  RtlClearAllBitsEx((_RTL_BITMAP_EX *)(Context + 150));
  RtlClearAllBitsEx((_RTL_BITMAP_EX *)Context + 41);
  Context[20] &= ~1u;
  if( (unsigned int)dword_140C04498 > 5 && tlgKeywordOn((__int64)&dword_140C04498, 0x200000000000i64) )
  {
    v23 = *((_QWORD *)Context + 54);
    v34 = &v23;
    v24 = *((_QWORD *)Context + 55);
    v36 = &v24;
    v25 = *((_QWORD *)Context + 56);
    v38 = &v25;
    v26 = *((_QWORD *)Context + 58);
    v40 = &v26;
    v27 = *((_QWORD *)Context + 59);
    v42 = &v27;
    v28 = *((_QWORD *)Context + 36);
    v44 = &v28;
    v35 = 8i64;
    v37 = 8i64;
    v39 = 8i64;
    v41 = 8i64;
    v43 = 8i64;
    v45 = 8i64;
    tlgWriteTransfer_EtwWriteTransfer(
      (__int64)&dword_140C04498,
      (unsigned __int8 *)byte_140023DA1,
      (const _GUID *)Context + 54,
      (const _GUID *)Context + 53,
      8u,
      &v33);
  }
  return v6;
}

Referenced by:

IopLiveDumpAllocAndInitResources