IopLiveDumpAllocateExtraBuffers

NTSTATUS __stdcall IopLiveDumpAllocateExtraBuffers(_LIVEDUMP_CONTEXT *Context, INT64 a2, INT64 a3, INT64 a4){
  NTSTATUS v4; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  _LIVEDUMP_CONTEXT *v17; 
  _LIVEDUMP_CONTEXT *v18; 
  int v19; 
  int v20; 
  __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  __int64 IndependentPages; 
  _KEVENT *v30; 
  _KEVENT *v31; 
  VOID *v32; 
  VOID *v33; 
  __int64 v34; 
  unsigned int v36; 

  v4 = 0;
  v6 = 0i64;
  v7 = 0i64;
  if( (Context[20] & 0x80u) != 0 )
  {
    LODWORD(v8) = IopLiveDumpGetMillisecondCounter(0);
    v6 = v8;
  }
  v9 = *((_QWORD *)Context + 87);
  if( v9 || *((_QWORD *)Context + 88) )
  {
    v10 = (unsigned int)BufferChunkSizeInPages;
    v11 = v9 / (unsigned int)BufferChunkSizeInPages;
    *((_QWORD *)Context + 30) = 0i64;
    v12 = v11;
    *((_QWORD *)Context + 34) = 0i64;
    v13 = *((_QWORD *)Context + 88) / v10;
    v14 = *((_QWORD *)Context + 93) - v13;
    v36 = v13;
    LODWORD(v13) = Context[20];
    v15 = v14 - v12;
    *((_QWORD *)Context + 27) = v15;
    *((_QWORD *)Context + 31) = 0i64;
    *((_QWORD *)Context + 35) = 0i64;
    if( (v13 & 0x80u) != 0i64 )
    {
      LODWORD(v16) = IopLiveDumpGetMillisecondCounter(0);
      v15 = *((_QWORD *)Context + 27);
      v7 = v16;
    }
    v17 = Context + 64;
    v18 = Context + 56;
    HvlPrepareLivedumpDescriptor(
      (_QWORD *)(*((_QWORD *)Context + 94) + 8 * v15),
      v12,
      v36,
      a4,
      (_QWORD *)Context + 29,
      (unsigned __int64 *)Context + 28,
      (_QWORD *)Context + 33,
      (_QWORD *)Context + 32,
      (_QWORD *)Context + 26);
    v20 = v19;
    if( (Context[20] & 0x80u) != 0 )
    {
      LODWORD(v21) = IopLiveDumpGetMillisecondCounter(0);
      *((_QWORD *)Context + 37) = v21 - v7;
    }
    if( v20 >= 0 )
    {
      v22 = *(_QWORD *)v18;
      v23 = (unsigned int)BufferChunkSizeInBytes;
      v24 = *(_QWORD *)v17;
      *((_QWORD *)Context + 29) <<= 12;
      v25 = v22 << 12;
      *((_QWORD *)Context + 33) <<= 12;
      v26 = v24 << 12;
      *(_QWORD *)v18 = v25;
      *(_QWORD *)v17 = v26;
      if( v25 % v23 )
        *((_QWORD *)Context + 31) = *((_QWORD *)Context + 27) + v25 / v23;
      if( v26 % v23 )
        *((_QWORD *)Context + 35) = *((_QWORD *)Context + 27) + v26 / v23;
    }
    else
    {
      *((_QWORD *)Context + 87) = 0i64;
      *((_QWORD *)Context + 88) = 0i64;
    }
  }
  v27 = *((_QWORD *)Context + 17);
  if( v27 )
  {
    v28 = v27 << 12;
    IndependentPages = MmAllocateIndependentPagesEx(v28, -1, 0i64, 0);
    *((_QWORD *)Context + 18) = IndependentPages;
    if( IndependentPages )
    {
      v30 = (_KEVENT *)*((_QWORD *)Context + 104);
      v31 = (_KEVENT *)*((_QWORD *)Context + 103);
      Context[38] = v28;
      if( IopLiveDumpIsUnderMemoryPressure(v31, v30) )
      {
        v4 = -1073741248;
      }
      else
      {
        IopLiveDumpDiscardVirtualAddressRange(Context, v32, v28);
        v33 = (VOID *)*((_QWORD *)Context + 18);
        *((_QWORD *)Context + 22) = v33;
        Context[46] = 0;
        memset(v33, 0i64, v28);
      }
    }
    else
    {
      *((_QWORD *)Context + 22) = 0i64;
      Context[46] = 0;
      Context[38] = 0;
    }
  }
  if( (Context[20] & 0x80u) != 0 )
  {
    LODWORD(v34) = IopLiveDumpGetMillisecondCounter(0);
    *((_QWORD *)Context + 97) = v34 - v6;
  }
  return v4;
}

Referenced by:

IopLiveDumpAllocAndInitResources