HvlpDepositPages
NTSTATUS __stdcall HvlpDepositPages(UINT16 Node){
char v1;
unsigned int v2;
char v3;
unsigned int v4;
__int64 v5;
int v6;
__int64 v7;
unsigned int v8;
MDL *PartitionNodePagesForMdl;
UINT8 *v10;
unsigned int v12;
unsigned int v13;
LONGLONG *v14;
unsigned int v15;
unsigned int v16;
UINT8 *v17;
int v18;
UINT64 IdealNode;
UINT64 Flags;
__int64 v21;
__int128 v22[6];
int v23;
char v24;
v24 = v1;
v2 = 128;
memset(v22, 0, 32);
v3 = v1;
v4 = 113;
v5 = 0x200000i64;
v6 = *(unsigned __int16 *)(*((_QWORD *)&KeNodeBlock + Node) + 148i64);
v23 = v6;
while( 1 )
{
v21 = v5;
v7 = v5;
v8 = (v4 & 0x20) != 0 ? (v2 + 511) & 0xFFFFFE00 : v2;
LODWORD(Flags) = v4;
LODWORD(IdealNode) = v6;
PartitionNodePagesForMdl = MmAllocatePartitionNodePagesForMdlEx(
0i64,
(LARGE_INTEGER)-1i64,
(LARGE_INTEGER)v5,
v8 << 12,
MmCached,
IdealNode,
Flags,
0i64);
v10 = (UINT8 *)PartitionNodePagesForMdl;
if( PartitionNodePagesForMdl )
{
v12 = (PartitionNodePagesForMdl->ByteCount >> 12) + ((PartitionNodePagesForMdl->ByteCount & 0xFFF) != 0);
v13 = v2;
v2 -= v12;
if( v13 < v12 )
v2 = 0;
v14 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v22, 1, 0i64, 8i64);
v15 = 0;
*v14 = HvlPartitionId;
if( v12 )
{
v16 = 0;
v17 = (UINT8 *)(v14 + 1);
do
{
if( v12 - v15 < 0x1FF )
v16 ^= ((unsigned __int16)v16 ^ (unsigned __int16)(v12 - v15)) & 0xFFF;
else
v16 = v16 & 0xFFFFF000 | 0x1FF;
memmove(v17, &v10[8 * v15 + 48], 8i64 * (v16 & 0xFFF));
HvcallInitiateHypercall();
v15 += 511;
}
while( v15 < v12 );
}
HvlpReleaseHypercallPage((unsigned int *)v22);
ExFreePoolWithTag(v10, 0);
v7 = v21;
v3 = v24;
}
else if( (v4 & 0x20) == 0 || v3 && (v4 & 0x40) == 0 )
{
return -1073741801;
}
if( !v2 )
break;
v18 = v4 & 0x40;
if( (v4 & 0x40) != 0 )
v4 &= ~0x40u;
else
v4 = v4 & 0xFFFFFFDB | 4;
v6 = v23;
v5 = v7 & -(__int64)(v18 != 0);
}
return 0;
}Referenced by:
HvlpAddPhysicalMemory
HvlpCreateRootVirtualProcessor
HvlpHandleInsufficientMemory
HvlpStartLogicalProcessor
PsDispatchIumService