MiCloneCaptureVadCommit
INT64 __fastcall MiCloneCaptureVadCommit(INT64 a1){
_QWORD *v2;
_QWORD *v3;
__int64 *v5;
int v6;
_MMPTE *PteBase;
INT64 v8;
unsigned __int64 v9;
INT64 *SharedVm;
KIRQL v11;
KIRQL v12;
unsigned __int64 v13;
__int64 v14;
unsigned __int64 v15;
__int64 v16;
__int64 v17;
__int64 v18;
unsigned __int64 v19;
_QWORD *v20;
INT64 *v21;
UINT8 v22;
int a6;
INT64 a2;
a6 = 0;
LODWORD(v2) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v3 = v2;
if( !v2 )
return 3221225626i64;
*v2 = 0i64;
v5 = v2 + 1;
v2[1] = 0i64;
v6 = 0;
PteBase = MmGetPteBase();
v8 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
v9 = (unsigned __int64)PteBase
+ 8 * ((*(unsigned int *)(a1 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 32) << 32)) & 0xFFFFFFFFFi64);
a2 = (INT64)PteBase
+ 8 * ((*(unsigned int *)(a1 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 33) << 32)) & 0xFFFFFFFFFi64);
SharedVm = MiGetSharedVm(v8);
v11 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
v12 = v11;
v13 = a2;
v22 = v11;
while( v9 <= v13 )
{
MiGetNextPageTable(v9, v13, 0i64, v12, 4, &a6);
if( !v14 )
break;
v15 = v14 & 0xFFFFFFFFFFFFF000ui64;
v16 = *v5;
v17 = (__int64)(((v14 & 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(v8, v22);
LODWORD(v20) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
if( !v20 )
{
v6 = -1073741670;
goto LABEL_18;
}
v5 = v20 + 1;
*v20 = v3;
v20[1] = 0i64;
v3 = v20;
v21 = MiGetSharedVm(v8);
ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v21);
*((_DWORD *)v21 + 1) = 0;
v16 = *v5;
v13 = a2;
}
v3[v16 + 2] = v17;
++*v5;
}
v12 = v22;
v9 = v15 + 4096;
}
MiUnlockWorkingSetExclusive(v8, v12);
LABEL_18:
*(_QWORD *)(a1 + 8) = v3;
if( v6 < 0 )
MiCloneDiscardVadCommit(a1);
return(unsigned int)v6;
}Referenced by:
MiAllocateChildVads