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