IopLiveDumpAllocateExtraBuffers

INT64 __fastcall IopLiveDumpAllocateExtraBuffers(INT64 a1, INT64 a2, INT64 r8_0, INT64 a4){
  unsigned int v4; 
  INT64 MillisecondCounter; 
  INT64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  INT64 v15; 
  unsigned __int64 *v16; 
  unsigned __int64 *v17; 
  int v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  UINT64 v25; 
  INT64 IndependentPages; 
  KEVENT *v27; 
  KEVENT *v28; 
  INT64 v29; 
  unsigned int a3; 
  v4 = 0;
  MillisecondCounter = 0i64;
  v7 = 0i64;
  if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
    MillisecondCounter = IopLiveDumpGetMillisecondCounter(0);
  v8 = *(_QWORD *)(a1 + 696);
  if( v8 || *(_QWORD *)(a1 + 704) )
  {
    v9 = (unsigned int)BufferChunkSizeInPages;
    v10 = v8 / (unsigned int)BufferChunkSizeInPages;
    *(_QWORD *)(a1 + 240) = 0i64;
    v11 = v10;
    *(_QWORD *)(a1 + 272) = 0i64;
    v12 = *(_QWORD *)(a1 + 704) / v9;
    v13 = *(_QWORD *)(a1 + 744) - v12;
    a3 = v12;
    LODWORD(v12) = *(_DWORD *)(a1 + 80);
    v14 = v13 - v11;
    *(_QWORD *)(a1 + 216) = v14;
    *(_QWORD *)(a1 + 248) = 0i64;
    *(_QWORD *)(a1 + 280) = 0i64;
    if( (v12 & 0x80u) != 0i64 )
    {
      v15 = IopLiveDumpGetMillisecondCounter(0);
      v14 = *(_QWORD *)(a1 + 216);
      v7 = v15;
    }
    v16 = (unsigned __int64 *)(a1 + 256);
    v17 = (unsigned __int64 *)(a1 + 224);
    v18 = HvlPrepareLivedumpDescriptor(
            (PVOID *)(*(_QWORD *)(a1 + 752) + 8 * v14),
            (unsigned int)v11,
            a3,
            a4,
            (_QWORD *)(a1 + 232),
            (UINT64 *)(a1 + 224),
            (_QWORD *)(a1 + 264),
            (_QWORD *)(a1 + 256),
            (_QWORD *)(a1 + 208));
    if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
      *(_QWORD *)(a1 + 296) = IopLiveDumpGetMillisecondCounter(0) - v7;
    if( v18 >= 0 )
    {
      v19 = *v17;
      v20 = (unsigned int)BufferChunkSizeInBytes;
      v21 = *v16;
      *(_QWORD *)(a1 + 232) <<= 12;
      v22 = v19 << 12;
      *(_QWORD *)(a1 + 264) <<= 12;
      v23 = v21 << 12;
      *v17 = v22;
      *v16 = v23;
      if( v22 % v20 )
        *(_QWORD *)(a1 + 248) = *(_QWORD *)(a1 + 216) + v22 / v20;
      if( v23 % v20 )
        *(_QWORD *)(a1 + 280) = *(_QWORD *)(a1 + 216) + v23 / v20;
    }
    else
    {
      *(_QWORD *)(a1 + 696) = 0i64;
      *(_QWORD *)(a1 + 704) = 0i64;
    }
  }
  v24 = *(_QWORD *)(a1 + 136);
  if( v24 )
  {
    v25 = v24 << 12;
    IndependentPages = MmAllocateIndependentPagesEx(v25, 0xFFFFFFFFi64, 0i64, 0i64);
    *(_QWORD *)(a1 + 144) = IndependentPages;
    if( IndependentPages )
    {
      v27 = *(KEVENT **)(a1 + 832);
      v28 = *(KEVENT **)(a1 + 824);
      *(_DWORD *)(a1 + 152) = v25;
      if( IopLiveDumpIsUnderMemoryPressure(v28, v27) )
      {
        v4 = -1073741248;
      }
      else
      {
        IopLiveDumpDiscardVirtualAddressRange();
        v29 = *(_QWORD *)(a1 + 144);
        *(_QWORD *)(a1 + 176) = v29;
        *(_DWORD *)(a1 + 184) = 0;
        memset(v29, 0i64);
      }
    }
    else
    {
      *(_QWORD *)(a1 + 176) = 0i64;
      *(_DWORD *)(a1 + 184) = 0;
      *(_DWORD *)(a1 + 152) = 0;
    }
  }
  if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
    *(_QWORD *)(a1 + 776) = IopLiveDumpGetMillisecondCounter(0) - MillisecondCounter;
  return v4;
}

Referenced by:

IopLiveDumpAllocAndInitResources