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