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