MmManagePartitionMoveMemory

NTSTATUS __fastcall MmManagePartitionMoveMemory(_MI_PARTITION **a1, _MI_PARTITION **a2, __int64 a3, CHAR a4){
  _MI_PARTITION *v4; 
  INT64 v6; 
  _MI_PARTITION *v7; 
  unsigned int v9; 
  int v10; 
  bool v11; 
  INT64 Flags; 
  INT64 v13; 

  v4 = *a2;
  v6 = *(_QWORD *)a3;
  v7 = *a1;
  if( !*(_QWORD *)a3 )
    return 0;
  v9 = *(_DWORD *)(a3 + 8);
  if( v9 == -1 )
  {
    v9 = (*(&KiProcessorBlock + KeGetCurrentThread()->IdealProcessor))->ParentNode->Affinity.Reserved[0];
  }
  else if( v9 >= (unsigned __int16)KeNumberNodes )
  {
    return -1073741811;
  }
  v10 = *(_DWORD *)(a3 + 12);
  if( (v10 & 0xFFFFFC00) != 0 )
    return -1073741811;
  if( (v10 & 0x200) != 0 )
    return -1073741637;
  if( (v10 & 0x12) != 0 )
  {
    v11 = (*(_DWORD *)(a3 + 12) & 0x1E0) == 0;
  }
  else
  {
    if( (v10 & 0x60) == 0 )
    {
      if( (v10 & 0x180) != 0 && (((unsigned __int64)KeFeatureBits & 0x2000000000i64) == 0 || (v6 & 0x3FFFF) != 0) )
        return -1073741811;
      goto LABEL_19;
    }
    v11 = (*(_DWORD *)(a3 + 12) & 0x180) == 0;
  }
  if( !v11 || (v6 & 0x1FF) != 0 )
    return -1073741811;
LABEL_19:
  if( (v10 & 8) == 0 )
    goto LABEL_24;
  if( v7 != &Irp || v4 == &Irp )
    return -1073741811;
  if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeLockMemoryPrivilege, a4) )
    return -1073741727;
LABEL_24:
  LODWORD(v13) = 0;
  LODWORD(Flags) = v10;
  return MiAllocatePartitionPhysicalPages(v4, v7, *(_QWORD *)a3, v9, Flags, v13);
}

Referenced by:

NtManagePartition