MiTerminateWsleCluster
INT64 __fastcall MiTerminateWsleCluster(INT64 a1){
__int64 v2;
unsigned __int64 PteBase;
INT64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
char v7;
unsigned __int8 v8;
int v9;
_MMPTE *PxeUserLimit;
_MMPFN *PfnDb;
volatile __int64 *v12;
_MMPTE *PteLimit;
_MMPTE *Pml4eBase;
unsigned __int64 v15;
volatile __int64 v16;
unsigned __int64 v17;
char v18;
__int64 v19;
unsigned __int64 v20;
unsigned int v21;
char v22;
INT64 v23;
unsigned __int64 v24;
UINT64 v25;
INT64 v26;
unsigned __int64 *v27;
INT64 v28;
INT64 v29;
INT64 v30;
__int64 v31;
unsigned __int64 v32;
char v33;
char v34;
int v35;
unsigned __int64 v36;
unsigned int v37;
UINT64 v38;
int HasShadow;
unsigned __int64 v40;
__int64 v41;
unsigned __int64 *v42;
_MMPFN *v43;
unsigned __int64 v44;
INT64 v45;
INT64 v46;
INT64 v47;
UINT64 v48;
__int64 v49;
unsigned __int64 v50;
UINT64 v51;
INT64 v52[2];
__int128 v53;
__int128 v54;
int v55;
__int16 v56;
__int16 v57;
__int64 v58;
__int64 v59;
__int64 Base;
INT64 result[20];
_OWORD a3[2];
v57 = 0;
memset((INT64)result, 0i64);
v2 = *(_QWORD *)(a1 + 8);
v49 = v2;
*(_OWORD *)v52 = 0i64;
v53 = 0i64;
v54 = 0i64;
if( !v2 )
return 0i64;
PteBase = (unsigned __int64)MmGetPteBase();
v4 = *(_QWORD *)a1;
v5 = 0i64;
v47 = *(_QWORD *)a1;
v6 = (__int64)((v2 << 25) - (PteBase << 25)) >> 16;
v7 = *(_BYTE *)(*(_QWORD *)a1 + 184i64);
v50 = v6;
v8 = v7 & 7;
if( v8 )
{
v9 = 2;
if( v8 >= 2u )
v9 = 0;
}
else
{
v9 = 1;
}
v58 = 20i64;
v55 = v9;
v56 = 0;
v59 = 0i64;
Base = 0i64;
PxeUserLimit = MmGetPxeUserLimit();
PfnDb = MmGetPfnDb();
if( (*(_BYTE *)(v4 + 184) & 7) == 0 )
{
if( !*(_QWORD *)(a1 + 16) )
goto LABEL_23;
v12 = (volatile __int64 *)v2;
PteLimit = MmGetPteLimit();
Pml4eBase = MmGetPml4eBase();
v15 = v6;
while( 1 )
{
v16 = *v12;
v17 = *v12 & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
v48 = v17;
if( v12 >= (volatile __int64 *)Pml4eBase && v12 <= (volatile __int64 *)PxeUserLimit )
{
HasShadow = MiPteHasShadow();
PteLimit = MmGetPteLimit();
if( HasShadow )
LOBYTE(v16) = v16 | 0x20;
}
if( (MiFlags & 0x800) != 0 )
{
LOBYTE(v16) = 32;
}
else if( (MiFlags & 0x4000000) != 0 )
{
_mm_lfence();
}
if( (v16 & 0x20) != 0 )
{
*v12 = v17;
PteBase = (unsigned __int64)MmGetPteBase();
PteLimit = MmGetPteLimit();
}
else
{
v33 = _InterlockedExchange64(v12, v17);
if( v12 >= (volatile __int64 *)Pml4eBase && v12 <= (volatile __int64 *)PxeUserLimit )
{
MiWritePteShadow();
PteBase = (unsigned __int64)MmGetPteBase();
PteLimit = MmGetPteLimit();
}
if( (v33 & 0x20) == 0 )
goto LABEL_21;
}
v18 = v56;
v19 = 1i64;
v20 = v15;
if( v55 != 1 && (v56 & 8) == 0 && v15 >= PteBase && v15 <= (unsigned __int64)PteLimit )
{
v18 = v56 | 8;
LOBYTE(v56) = v56 | 8;
}
v21 = HIDWORD(v58);
if( !HIDWORD(v58) )
{
LABEL_31:
if( HIDWORD(v58) >= (unsigned int)v58 )
{
HIBYTE(v56) = 1;
}
else
{
while( 1 )
{
v31 = (unsigned __int64)(v19 - 1) > 0x3FF ? 1024i64 : v19;
v32 = v20 & 0xFFFFFFFFFFFFF000ui64 | ((_WORD)v31 - 1) & 0x3FF;
v19 -= v31;
v20 += v31 << 12;
result[v21 - 1] = v32;
v59 += v31;
v21 = HIDWORD(v58) + 1;
HIDWORD(v58) = v21;
if( v21 == (_DWORD)v58 && (v56 & 4) == 0 )
{
qsort((WCHAR *)&Base, v21, (const WCHAR *)8, MiTbFlushSort);
MiCompressTbFlushList((INT64)&v55);
v21 = HIDWORD(v58);
if( HIDWORD(v58) == (_DWORD)v58 )
break;
}
if( !v19 )
goto LABEL_21;
}
if( v19 )
{
HIBYTE(v56) = 1;
v59 = HIDWORD(v58);
}
}
goto LABEL_21;
}
v22 = v18 & 4;
if( v22
|| (v23 = result[(unsigned int)(HIDWORD(v58) - 1) - 1], (v23 & 0xC00) != 0)
|| (v24 = result[(unsigned int)(HIDWORD(v58) - 1) - 1] & 0x3FF,
(v23 & 0xFFFFFFFFFFFFF000ui64) + ((v24 + 1) << 12) != v15)
|| v24 + 1 <= v24
|| v24 + 1 > 0x3FF )
{
if( v22 )
goto LABEL_31;
v30 = result[(unsigned int)(HIDWORD(v58) - 1) - 1];
if( (v30 & 0xC00) != 0 )
goto LABEL_31;
if( (v30 & 0xFFFFFFFFFFFFF000ui64) != v15 + 4096 )
goto LABEL_31;
v40 = result[(unsigned int)(HIDWORD(v58) - 1) - 1] & 0x3FF;
if( v40 + 1 <= v40 || v40 + 1 > 0x3FF )
goto LABEL_31;
++v59;
result[(unsigned int)(HIDWORD(v58) - 1) - 1] = (v30 - 4096) ^ ((unsigned __int16)(v30 - 4096) ^ (unsigned __int16)(v30 - 4096 + 1)) & 0x3FF;
}
else
{
++v59;
result[(unsigned int)(HIDWORD(v58) - 1) - 1] = v23 ^ ((unsigned __int16)v23 ^ (unsigned __int16)(v23 + 1)) & 0x3FF;
}
LABEL_21:
++v5;
PteBase = (unsigned __int64)MmGetPteBase();
++v12;
PteLimit = MmGetPteLimit();
v15 += 4096i64;
PxeUserLimit = MmGetPxeUserLimit();
if( v5 >= *(_QWORD *)(a1 + 16) )
{
v2 = v49;
v6 = v50;
v4 = v47;
PfnDb = MmGetPfnDb();
goto LABEL_23;
}
}
}
if( (*(_BYTE *)(a1 + 28) & 0xF) == 8 && *(_QWORD *)(a1 + 16) )
{
v41 = (__int64)((v2 << 25) - (PteBase << 25)) >> 16;
v42 = (unsigned __int64 *)v2;
v43 = MmGetPfnDb();
do
{
v44 = *v42;
MiPteInShadowRange((UINT64)v42);
MiUnlockWsle(v47, v41, (INT64)v43 + 48 * ((v44 >> 12) & 0xFFFFFFFFFi64));
++v5;
++v42;
v41 += 4096i64;
}
while( v5 < *(_QWORD *)(a1 + 16) );
v2 = v49;
v6 = v50;
v4 = v47;
PfnDb = MmGetPfnDb();
}
if( (*(_DWORD *)(a1 + 24) & 4) == 0 )
MiInsertTbFlushEntry((INT64)&v55, v6, *(_QWORD *)(a1 + 16), 0i64);
LABEL_23:
LODWORD(v46) = *(_DWORD *)(a1 + 24) & 1;
LODWORD(v45) = 10;
MiRemoveWsle(v4, v6, *(UINT8 **)(a1 + 16), *(_BYTE *)(a1 + 28), v45, v46);
v25 = *(_QWORD *)((char *)MmGetPdeBase() + ((v6 >> 18) & 0x3FFFFFF8));
v51 = v25;
MiPteInShadowRange((UINT64)&v51);
v27 = (unsigned __int64 *)((char *)PfnDb + 48 * ((v25 >> 12) & 0xFFFFFFFFFi64));
if( ((*(_DWORD *)v27 >> 4) & 0x3FF) == 0 )
{
MiCountWslesInPageTable(v26, v6, a3);
v34 = 8;
while( 1 )
{
v35 = *((_DWORD *)a3 + (unsigned __int8)--v34);
if( v35 )
break;
if( !v34 )
goto LABEL_24;
}
*v27 = *v27 & 0xFFFFFFFFFFFE000Fui64 | (16 * (v35 & 0x3FF | ((unsigned __int64)(v34 & 7) << 10)));
}
LABEL_24:
if( (*(_BYTE *)(v4 + 184) & 7) != 0 )
{
v36 = 0i64;
v37 = (2 * (*(_DWORD *)(a1 + 24) & 8)) | 4;
if( (*(_DWORD *)(a1 + 24) & 0x10) == 0 )
v37 = 2 * (*(_DWORD *)(a1 + 24) & 8);
if( *(_QWORD *)(a1 + 16) )
{
do
{
MiDeleteValidSystemPage(v47, (MMPTE *)v2, v37, (INT64)v52);
if( (*(_DWORD *)(a1 + 24) & 4) != 0 )
{
v48 = 0i64;
MiInitializeTbFlushStamps(&v48);
*(_QWORD *)v2 = v48;
v38 = v48;
if( qword_140C4DC80 && (v48 & 0x10) == 0 )
v38 = v48 & ~qword_140C4DC80;
if( (v38 & 0xFFFFFFFF00000000ui64) == 0 )
MiInsertTbFlushEntry((INT64)&v55, v6, 1i64, 0i64);
}
++v36;
v2 += 8i64;
v6 += 4096i64;
}
while( v36 < *(_QWORD *)(a1 + 16) );
}
}
v28 = 0i64;
if( (*(_BYTE *)(a1 + 24) & 1) != 0 )
v28 = v52[1];
MiFlushTbList((__int64)&v55);
v29 = v28;
*(_QWORD *)(a1 + 8) = 0i64;
*(_QWORD *)(a1 + 16) = 0i64;
return v29;
}Referenced by:
MiAppendWsleCluster
MiDecommitPages
MiDeletePteWsleCluster
MiDeleteSystemPagableVm
MiDeleteVa
MiDeleteVaTail
MiRemoveMappedPtes