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