MiCaptureUlongPtrArray

NTSTATUS __stdcall MiCaptureUlongPtrArray(
        VOID *Destination,
        VOID *Source,
        UINT64 ArraySize,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  _EWOW64PROCESS *WoW64Process; 
  unsigned __int16 Machine; 
  UINT64 v11; 
  UINT64 v12; 
  UINT64 v13; 

  WoW64Process = KeGetCurrentThread()->ApcState.Process->WoW64Process;
  if( WoW64Process && ((Machine = WoW64Process->Machine, Machine == 332) || Machine == 452) )
  {
    v11 = 4 * ArraySize;
    if( 4 * ArraySize )
    {
      if( ((unsigned __int8)Source & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)Source + v11 > 0x7FFFFFFF0000i64 || (char *)Source + v11 < Source )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    v12 = 0i64;
    if( (ArraySize & 0xFFFFFFFFFFFFFFF8ui64) != 0 )
    {
      do
      {
        *((_QWORD *)Destination + v12) = *((unsigned int *)Source + v12);
        *((_QWORD *)Destination + v12 + 1) = *((unsigned int *)Source + v12 + 1);
        *((_QWORD *)Destination + v12 + 2) = *((unsigned int *)Source + v12 + 2);
        *((_QWORD *)Destination + v12 + 3) = *((unsigned int *)Source + v12 + 3);
        *((_QWORD *)Destination + v12 + 4) = *((unsigned int *)Source + v12 + 4);
        *((_QWORD *)Destination + v12 + 5) = *((unsigned int *)Source + v12 + 5);
        *((_QWORD *)Destination + v12 + 6) = *((unsigned int *)Source + v12 + 6);
        *((_QWORD *)Destination + v12 + 7) = *((unsigned int *)Source + v12 + 7);
        v12 += 8i64;
      }
      while( v12 < (ArraySize & 0xFFFFFFFFFFFFFFF8ui64) );
    }
    if( (ArraySize & 7) != 0 )
    {
      do
      {
        *((_QWORD *)Destination + v12) = *((unsigned int *)Source + v12);
        ++v12;
      }
      while( v12 < ArraySize );
    }
  }
  else
  {
    v13 = 8 * ArraySize;
    if( v13 )
    {
      if( ((unsigned __int8)Source & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)Source + v13 > 0x7FFFFFFF0000i64 || (char *)Source + v13 < Source )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    memmove(Destination, Source, v13);
  }
  return 0;
}

Referenced by:

NtFreeUserPhysicalPages
NtMapUserPhysicalPages
NtMapUserPhysicalPagesScatter