MiCaptureUlongPtrArray
INT64 __stdcall MiCaptureUlongPtrArray(PVOID Destination, PVOID Source, UINT64 ArraySize){
__int64 v4;
__int16 v5;
UINT64 v6;
UINT64 v7;
UINT64 v8;
v4 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1408i64);
if( v4 && ((v5 = *(_WORD *)(v4 + 8), v5 == 332) || v5 == 452) )
{
v6 = 4 * ArraySize;
if( 4 * ArraySize )
{
if( ((unsigned __int8)Source & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)Source + v6 > 0x7FFFFFFF0000i64 || (char *)Source + v6 < Source )
MEMORY[0x7FFFFFFF0000] = 0;
}
v7 = 0i64;
if( (ArraySize & 0xFFFFFFFFFFFFFFF8ui64) != 0 )
{
do
{
*((_QWORD *)Destination + v7) = *((unsigned int *)Source + v7);
*((_QWORD *)Destination + v7 + 1) = *((unsigned int *)Source + v7 + 1);
*((_QWORD *)Destination + v7 + 2) = *((unsigned int *)Source + v7 + 2);
*((_QWORD *)Destination + v7 + 3) = *((unsigned int *)Source + v7 + 3);
*((_QWORD *)Destination + v7 + 4) = *((unsigned int *)Source + v7 + 4);
*((_QWORD *)Destination + v7 + 5) = *((unsigned int *)Source + v7 + 5);
*((_QWORD *)Destination + v7 + 6) = *((unsigned int *)Source + v7 + 6);
*((_QWORD *)Destination + v7 + 7) = *((unsigned int *)Source + v7 + 7);
v7 += 8i64;
}
while( v7 < (ArraySize & 0xFFFFFFFFFFFFFFF8ui64) );
}
if( (ArraySize & 7) != 0 )
{
do
{
*((_QWORD *)Destination + v7) = *((unsigned int *)Source + v7);
++v7;
}
while( v7 < ArraySize );
}
}
else
{
v8 = 8 * ArraySize;
if( v8 )
{
if( ((unsigned __int8)Source & 7) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)Source + v8 > 0x7FFFFFFF0000i64 || (char *)Source + v8 < Source )
MEMORY[0x7FFFFFFF0000] = 0;
}
memmove((UINT8 *)Destination, (UINT8 *)Source, v8);
}
return 0i64;
}Referenced by:
NtFreeUserPhysicalPages
NtMapUserPhysicalPages
NtMapUserPhysicalPagesScatter