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