IopLiveDumpAllocateDumpBuffers

NTSTATUS __stdcall IopLiveDumpAllocateDumpBuffers(_LIVEDUMP_CONTEXT *Context){
  __int64 v1; 
  __int64 v3; 
  __int64 v4; 
  unsigned __int64 v5; 
  _LIVEDUMP_CONTEXT *v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  _LIVEDUMP_CONTEXT v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  VOID **PoolWithTag; 
  NTSTATUS v17; 
  VOID **v18; 
  char v19; 
  __int64 v20; 
  _LIVEDUMP_CONTEXT v21; 
  _MDL *v22; 
  UINT64 IndependentPages; 
  _LIVEDUMP_CONTEXT v24; 
  UINT64 v25; 
  VOID *v26; 
  UINT64 v27; 
  __int64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  _MDL *v35; 

  v1 = 0i64;
  v3 = 0i64;
  if( (Context[20] & 0x80u) != 0 )
  {
    LODWORD(v4) = IopLiveDumpGetMillisecondCounter(0);
    v3 = v4;
  }
  v5 = (unsigned int)BufferChunkSizeInPages;
  v6 = Context + 170;
  *((_QWORD *)Context + 89) = 0i64;
  *((_QWORD *)Context + 93) = 0i64;
  *((_QWORD *)Context + 85) = 0i64;
  v7 = *((_QWORD *)Context + 12);
  v8 = ~(v5 - 1);
  v9 = v8 & (*((_QWORD *)Context + 15) + v5 - 1);
  *((_QWORD *)Context + 13) = v8 & (v5 + *((_QWORD *)Context + 13) - 1i64);
  v10 = *((_QWORD *)Context + 16) - 1i64;
  *((_QWORD *)Context + 15) = v9;
  v11 = v8 & (v5 + v7 - 1);
  v12 = v8 & (v5 + v10);
  *((_QWORD *)Context + 12) = v11;
  *((_QWORD *)Context + 16) = v12;
  v13 = Context[20];
  v14 = v11 / v5 + v9 / v5 + v12 / v5;
  if( (v13 & 0x200) != 0 )
  {
    v15 = (*((_QWORD *)Context + 131) >> 12) + ((*((_QWORD *)Context + 131) & 0xFFFi64) != 0);
    if( v14 * (unsigned int)v5 > v15 )
    {
      Context[20] = v13 | 0x400;
      v14 = (v8 & v15) / v5;
    }
  }
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (8 * v14 + 4095) & 0xFFFFFFFFFFFFF000ui64, 1886217292i64);
  *((_QWORD *)Context + 94) = PoolWithTag;
  if( !PoolWithTag )
    goto LABEL_35;
  if( IopLiveDumpIsUnderMemoryPressure(*((_KEVENT **)Context + 103), *((_KEVENT **)Context + 104)) )
    goto LABEL_8;
  v18 = ExAllocatePoolWithTag(0x200ui64, (8 * v14 + 4095) & 0xFFFFFFFFFFFFF000ui64, 1886217292i64);
  *((_QWORD *)Context + 95) = v18;
  if( !v18 )
    goto LABEL_35;
  if( IopLiveDumpIsUnderMemoryPressure(*((_KEVENT **)Context + 103), *((_KEVENT **)Context + 104)) )
    goto LABEL_8;
  IopLiveDumpDiscardVirtualAddressRange(Context, *((VOID **)Context + 94), (8 * v14 + 4095) & 0xFFFFFFFFFFFFF000ui64);
  memset(*((VOID **)Context + 94), 0i64, (8 * v14 + 4095) & 0xFFFFF000);
  IopLiveDumpDiscardVirtualAddressRange(Context, *((VOID **)Context + 95), (8 * v14 + 4095) & 0xFFFFFFFFFFFFF000ui64);
  memset(*((VOID **)Context + 95), 0i64, (8 * v14 + 4095) & 0xFFFFF000);
  v19 = 0;
  v20 = 0i64;
  if( !v14 )
  {
LABEL_31:
    if( IopLiveDumpIsUnderMemoryPressure(*((_KEVENT **)Context + 103), *((_KEVENT **)Context + 104)) )
      goto LABEL_8;
    v29 = *(_QWORD *)v6;
    v30 = *((_QWORD *)Context + 13);
    if( *(_QWORD *)v6 >= v30 )
    {
      v17 = 0;
      goto LABEL_37;
    }
LABEL_35:
    v17 = -1073741670;
    goto LABEL_36;
  }
  while( 1 )
  {
    v21 = Context[260];
    v22 = 0i64;
    v35 = 0i64;
    if( ((v21 - 2) & 0xFFFFFFFD) == 0 && !v19 )
    {
      IndependentPages = MmAllocateIndependentPagesEx((unsigned int)BufferChunkSizeInBytes, -1, 0i64, 0);
      goto LABEL_17;
    }
    if( ((v21 - 1) & 0xFFFFFFFD) == 0 )
    {
      IndependentPages = IopLiveDumpAllocateFromVMMemoryPartition(
                           (INT64)Context,
                           (unsigned int)BufferChunkSizeInBytes,
                           &v35);
      v22 = v35;
LABEL_17:
      if( IndependentPages )
        goto LABEL_24;
    }
    v24 = Context[260];
    if( (unsigned int)(v24 - 1) <= 1 )
      goto LABEL_31;
    if( v24 == 4 )
    {
      v25 = IopLiveDumpAllocateFromVMMemoryPartition((INT64)Context, (unsigned int)BufferChunkSizeInBytes, &v35);
      v22 = v35;
    }
    else
    {
      if( v24 != 3 )
        goto LABEL_31;
      v25 = MmAllocateIndependentPagesEx((unsigned int)BufferChunkSizeInBytes, -1, 0i64, 0);
    }
    if( !v25 )
      goto LABEL_31;
LABEL_24:
    if( !IopLiveDumpIsUnderMemoryPressure(*((_KEVENT **)Context + 103), *((_KEVENT **)Context + 104)) )
    {
      v27 = (unsigned int)BufferChunkSizeInBytes;
      *(_QWORD *)(*((_QWORD *)Context + 94) + 8 * v20) = v26;
      *(_QWORD *)v6 += (unsigned int)BufferChunkSizeInPages;
      v28 = *((_QWORD *)Context + 95);
      ++*((_QWORD *)Context + 93);
      *(_QWORD *)(v28 + 8 * v20) = v22;
      IopLiveDumpDiscardVirtualAddressRange(Context, v26, v27);
      goto LABEL_30;
    }
    if( v22 )
      break;
    MmFreeIndependentPages(v26, (unsigned int)BufferChunkSizeInBytes);
    if( v19 || Context[260] != 4 )
      goto LABEL_8;
    --v20;
    v19 = 1;
LABEL_30:
    if( ++v20 >= v14 )
      goto LABEL_31;
  }
  MmFreePagesFromMdl(v22);
  ExFreePoolWithTag(v22, 0);
LABEL_8:
  v17 = -1073741248;
LABEL_36:
  IopLiveDumpFreeDumpBuffers(Context + 170);
  *(_QWORD *)v6 = 0i64;
  v29 = 0i64;
  v30 = *((_QWORD *)Context + 13);
LABEL_37:
  v31 = *((_QWORD *)Context + 16);
  v32 = *((_QWORD *)Context + 15);
  if( v29 < v30 + v31 + v32 )
  {
    if( v29 )
    {
      *((_QWORD *)Context + 86) = v30;
      *((_QWORD *)Context + 87) = v29 - v30;
    }
    else
    {
      *((_QWORD *)Context + 86) = 0i64;
      *((_QWORD *)Context + 87) = 0i64;
    }
  }
  else
  {
    *((_QWORD *)Context + 86) = v29 - v31 - v32;
    *((_QWORD *)Context + 87) = *((_QWORD *)Context + 15);
    v1 = *((_QWORD *)Context + 16);
  }
  *((_QWORD *)Context + 88) = v1;
  if( (Context[20] & 0x80u) != 0 )
  {
    LODWORD(v33) = IopLiveDumpGetMillisecondCounter(0);
    *((_QWORD *)Context + 96) = v33 - v3;
  }
  IopLiveDumpTraceEstimatedAndAllocatedPageCount((__int64)Context, v14 * (unsigned int)BufferChunkSizeInPages);
  return v17;
}

Referenced by:

IopLiveDumpAllocAndInitResources