MiCloneCaptureVadCommit
NTSTATUS __stdcall MiCloneCaptureVadCommit(INT64 a1){
_QWORD *Pool;
_QWORD *v3;
__int64 *v5;
NTSTATUS v6;
_MMPTE *PteBase;
_MMSUPPORT_FULL *p_Vm;
_MMPTE *v9;
_MMSUPPORT_SHARED *SharedVm;
UINT8 v11;
UINT8 v12;
_MMPTE *v13;
_MMPTE *NextPageTable;
unsigned __int64 v15;
__int64 v16;
__int64 v17;
__int64 v18;
unsigned __int64 v19;
_QWORD *v20;
_MMSUPPORT_SHARED *v21;
UINT64 PageTableFlags;
UINT64 v23;
UINT8 WsIrql;
UINT64 LargePage;
_MMPTE *LastPte;
LODWORD(LargePage) = 0;
Pool = MiAllocatePool(64i64, 0x90ui64, 0x6356694Dui64);
v3 = Pool;
if( !Pool )
return -1073741670;
*Pool = 0i64;
v5 = Pool + 1;
Pool[1] = 0i64;
v6 = 0;
PteBase = MmGetPteBase();
p_Vm = &KeGetCurrentThread()->ApcState.Process->Vm;
v9 = &PteBase[(*(unsigned int *)(a1 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 32) << 32)) & 0xFFFFFFFFFi64];
LastPte = &PteBase[(*(unsigned int *)(a1 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 33) << 32)) & 0xFFFFFFFFFi64];
SharedVm = MiGetSharedVm(&p_Vm->Instance);
v11 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
v12 = v11;
v13 = LastPte;
WsIrql = v11;
while( v9 <= v13 )
{
LODWORD(PageTableFlags) = 4;
NextPageTable = MiGetNextPageTable(v9, v13, 0i64, v12, PageTableFlags, &LargePage, v23);
if( !NextPageTable )
break;
v15 = (unsigned __int64)NextPageTable & 0xFFFFFFFFFFFFF000ui64;
v16 = *v5;
v17 = (__int64)((((unsigned __int64)NextPageTable & 0xFFFFFFFFFFFFF000ui64) << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( *v5
&& (v18 = v3[v16 + 1], v19 = v18 & 0x1FFFFF, v19 + 1 > v19)
&& v19 != 0x1FFFFF
&& (v18 & 0xFFFFFFFFFFE00000ui64) + ((v19 + 1) << 21) == v17 )
{
v3[v16 + 1] = v18 & 0xFFFFFFFFFFE00000ui64 | (v18 + 1) & 0x1FFFFF;
}
else
{
if( v16 == 16 )
{
MiUnlockWorkingSetExclusive(&p_Vm->Instance, WsIrql);
v20 = MiAllocatePool(64i64, 0x90ui64, 0x6356694Dui64);
if( !v20 )
{
v6 = -1073741670;
goto LABEL_18;
}
v5 = v20 + 1;
*v20 = v3;
v20[1] = 0i64;
v3 = v20;
v21 = MiGetSharedVm(&p_Vm->Instance);
ExAcquireSpinLockExclusive((INT64 *)&v21->WorkingSetLock);
v21->GoodCitizenWaiting = 0;
v16 = *v5;
v13 = LastPte;
}
v3[v16 + 2] = v17;
++*v5;
}
v12 = WsIrql;
v9 = (_MMPTE *)(v15 + 4096);
}
MiUnlockWorkingSetExclusive(&p_Vm->Instance, v12);
LABEL_18:
*(_QWORD *)(a1 + 8) = v3;
if( v6 < 0 )
MiCloneDiscardVadCommit(a1);
return v6;
}Referenced by:
MiAllocateChildVads