MiCopyLargeVad
NTSTATUS __stdcall MiCopyLargeVad(ULONG_PTR ProcessToInitialize, _MMVAD_SHORT *SourceVad, _MMVAD_SHORT *TargetVad){
int v5;
__int64 ********VadEvent;
__int64 v7;
void *v8;
int v9;
int v11;
unsigned __int64 v12;
unsigned int v13;
unsigned __int64 v14;
char *v15;
unsigned __int64 v16;
unsigned __int64 v17;
VOID *v18;
VOID *v19;
VOID *LockedBuffer;
VOID *v21;
VOID *LockVariable;
VOID *Src;
PVOID Process;
_KAPC_STATE ApcState;
Process = *(PVOID *)&ProcessToInitialize;
Src = 0i64;
LockVariable = 0i64;
v21 = 0i64;
LockedBuffer = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
MiLocateLockedVadEvent((__int64)TargetVad, 16);
VadEvent = MiLocateVadEvent((__int64)SourceVad, v5);
if( v7 )
{
*(_BYTE *)(v7 + 8) = *((_BYTE *)VadEvent + 8);
*(_QWORD *)(v7 + 16) = VadEvent[2];
}
KiStackAttachProcess(v8, 0i64, &ApcState);
v9 = MiMapUserLargePages(TargetVad, 0i64);
KiUnstackDetachProcess(&ApcState, 0i64);
if( v9 < 0 )
return v9;
v11 = 0;
v12 = 4292870144i64;
v13 = TargetVad->u.LongFlags & 0x200;
v14 = SourceVad->StartingVpn | ((unsigned __int64)SourceVad->StartingVpnHigh << 32);
v15 = (char *)(v14 << 12);
v16 = ((SourceVad->EndingVpn | ((unsigned __int64)SourceVad->EndingVpnHigh << 32)) - v14 + 1) << 12;
while( v16 )
{
v17 = v12;
if( v16 <= v12 )
v17 = v16;
v11 = ExLockUserBuffer(v15, (unsigned int)v17, 1, IoReadAccess, &Src, &LockVariable);
if( v11 < 0 )
goto LABEL_9;
KiStackAttachProcess(Process, 0i64, &ApcState);
v18 = v15;
if( v13 )
{
v19 = 0i64;
LockedBuffer = v15;
v21 = 0i64;
}
else
{
v11 = ExLockUserBuffer(v15, (unsigned int)v17, 1, IoWriteAccess, &LockedBuffer, &v21);
if( v11 < 0 )
{
KiUnstackDetachProcess(&ApcState, 0i64);
ExUnlockUserBuffer(LockVariable);
LABEL_9:
v12 = (v17 >> 1) & 0x7FFFFFFFFFE00000i64;
if( v12 < 0x200000 )
return v11;
continue;
}
v19 = v21;
v18 = LockedBuffer;
}
memmove(v18, Src, v17);
if( !v13 )
ExUnlockUserBuffer(v19);
KiUnstackDetachProcess(&ApcState, 0i64);
ExUnlockUserBuffer(LockVariable);
v16 -= v17;
v15 += v17;
}
return v11;
}Referenced by:
MiMapChildLargePageVads