MiReplacePageOfProtoPool
VOID __fastcall MiReplacePageOfProtoPool(
_MMPTE *ProtoPoolVa,
UINT64 OldProtoPoolPage,
UINT64 NewProtoPoolPage,
_MMPTE *MappingToNewProtoPage){
unsigned int v6;
unsigned int m;
int v8;
char *v9;
unsigned int v10;
unsigned int v11;
unsigned int v12;
unsigned int v13;
char *v14;
__int64 j;
unsigned __int64 v16;
unsigned int v17;
_MMPFN *PfnDb;
__int64 v19;
unsigned int v20;
char *v21;
int v22;
int v23;
unsigned int k;
int v25;
_MMPTE *v26;
_QWORD *v27;
_MMPFN *v28;
char v29;
bool v30;
char *v31;
INT64 v32;
__int64 v33;
unsigned __int64 v34;
int v35;
unsigned int v36;
__int64 v37;
_MMPTE *v38;
unsigned int v39;
unsigned int v40;
unsigned int v41;
unsigned int v42;
_QWORD *v43;
__int64 n;
unsigned __int64 v45;
unsigned int v46;
__int64 v47;
UINT64 v48;
__int64 v49;
_MMPFN *v50;
char *v51;
unsigned int SizeOfBitMap;
unsigned int v53;
unsigned int v54;
int v55;
UINT64 SpinCount;
char *i;
_MMPTE *v58;
UINT64 v59;
UINT64 v60;
RTL_BITMAP v61;
UINT64 v62;
__int128 v63;
__int128 v64;
__int128 v65;
signed __int32 result[14];
_BYTE v67[3];
int v68;
*(&v61.SizeOfBitMap + 1) = 0;
v62 = OldProtoPoolPage;
v60 = NewProtoPoolPage;
v58 = ProtoPoolVa;
v61.Buffer = (unsigned int *)result;
v61.SizeOfBitMap = 512;
v63 = 0i64;
v64 = 0i64;
v65 = 0i64;
memset((INT64)result, 0i64);
if( !(unsigned int)MiGetPrototypePteRanges((UINT64)ProtoPoolVa, &v61) )
return;
v6 = 0;
KeCopyPage(MappingToNewProtoPage);
m = 0;
v8 = (((unsigned __int8)v67 - 57) & 4) != 0i64 ? 0x20 : 0;
v55 = v8;
v9 = (char *)result - ((((unsigned __int8)v67 - 57) & 4) != 0i64 ? 4 : 0);
for( i = v9; ; v9 = i )
{
v10 = m < v61.SizeOfBitMap ? m : 0;
v11 = v61.SizeOfBitMap - 1;
while( 1 )
{
v12 = v8 + v11;
v13 = v8 + v10;
if( v11 - v10 == -1 )
goto LABEL_44;
v14 = &v9[8 * ((unsigned __int64)v13 >> 6)];
for( j = ~*(_QWORD *)v14 | ((1i64 << (v13 & 0x3F)) - 1); j == -1; j = ~*(_QWORD *)v14 )
{
v14 += 8;
if( v14 > &v9[8 * ((unsigned __int64)v12 >> 6)] )
goto LABEL_44;
}
_BitScanForward64(&v16, ~j);
v17 = v16 + ((unsigned int)((v14 - v9) >> 3) << 6);
if( v17 > v12 )
{
LABEL_44:
v17 = -1;
}
else if( v17 != -1 )
{
break;
}
if( !v10 )
break;
SizeOfBitMap = m + 1;
if( m + 1 > v61.SizeOfBitMap )
SizeOfBitMap = v61.SizeOfBitMap;
v11 = SizeOfBitMap - 1;
v10 = 0;
}
PfnDb = MmGetPfnDb();
v19 = v17 - v8;
if( v17 == -1 )
v19 = 0xFFFFFFFFi64;
if( (unsigned int)v19 < m || (_DWORD)v19 == -1 )
break;
if( (unsigned int)v19 < 0x200 )
{
v20 = v19;
v21 = (char *)&result[(unsigned __int64)(unsigned int)v19 >> 5];
if( v21 != (char *)&v68 && (*(_DWORD *)v21 | *((_DWORD *)qword_140011CE0 + (v19 & 0x1F))) == -1 )
{
v20 = v19 - (v19 & 0x1F) + 32;
for( v21 += 4; v21 < (char *)&v68 && *(_DWORD *)v21 == -1; v21 += 4 )
v20 += 32;
}
while( v20 < 0x200 && _bittest(result, v20) )
++v20;
v22 = 0;
if( v21 == (char *)&v68 )
goto LABEL_27;
v23 = v20 & 0x1F;
if( (*(_DWORD *)v21 & ~*((_DWORD *)qword_140011CE0 + (v20 & 0x1F))) != 0 )
goto LABEL_27;
v22 = 32 - v23;
if( v23 != 33 )
{
v51 = v21 + 4;
while( v51 < (char *)&v68 && !*(_DWORD *)v51 )
{
v51 += 4;
v22 += 32;
if( v22 == -1 )
goto LABEL_32;
}
LABEL_27:
for( k = v22 + v20; k < 0x200 && !_bittest(result, k) && v22 != -1; ++k )
++v22;
}
LABEL_32:
if( v22 )
goto LABEL_33;
goto LABEL_81;
}
v22 = 0;
LABEL_81:
v20 = 512;
LABEL_33:
v25 = v20 - v19;
v26 = (_MMPTE *)((char *)v58 + 8 * v19);
v27 = (_QWORD *)((char *)MappingToNewProtoPage + 8 * v19);
for( m = v19 + v22 + v25; v25; --v25 )
{
v28 = MiLockLeafPage(v26, v6);
if( v28 )
{
v54 = v6 + 1;
v29 = *((_BYTE *)v28 + 34);
if( (v29 & 8) != 0 )
{
v6 = v54;
goto LABEL_93;
}
if( (MI_READ_PTE_LOCK_FREE((INT64)v26) & 1) != 0 )
{
v6 = v54;
}
else
{
v30 = (v29 & 0x20) == 0;
v6 = v54;
if( !v30 )
goto LABEL_93;
}
}
else
{
_bittestandreset(result, v19);
}
LODWORD(v19) = v19 + 1;
*v27 = *(_QWORD *)v26;
v26 = (_MMPTE *)((char *)v26 + 8);
++v27;
}
if( m >= 0x200 )
{
PfnDb = MmGetPfnDb();
break;
}
v8 = (((unsigned __int8)v67 - 57) & 4) != 0i64 ? 0x20 : 0;
}
v31 = (char *)PfnDb + 48 * v62;
v32 = (INT64)PfnDb + 48 * v60;
if( v6 )
{
MiLockNestedPageAtDpcInline((INT64)PfnDb + 48 * v62);
}
else
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v31 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v31 + 3) < 0 );
}
}
if( *((_WORD *)v31 + 16) == 2
&& (v33 = *((_QWORD *)v31 + 3), (unsigned __int16)v33 == (unsigned __int64)(v6 + 1))
&& (v34 = v33 & 0x3FFFFFFFFFFFFFFFi64, v34 < 0x10000) )
{
MiLockNestedPageAtDpcInline(v32);
*(_QWORD *)(v32 + 24) = v34 | *(_QWORD *)(v32 + 24) & 0xC000000000000000ui64;
_InterlockedAnd64((volatile signed __int64 *)(v32 + 24), 0x7FFFFFFFFFFFFFFFui64);
v35 = 1;
}
else
{
_InterlockedAnd64((volatile signed __int64 *)v31 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_93:
v35 = 0;
}
v36 = 0;
v37 = (__int64)i;
v38 = v58;
while( v6 )
{
v39 = v36 < v61.SizeOfBitMap ? v36 : 0;
v40 = v61.SizeOfBitMap - 1;
while( 1 )
{
HIDWORD(SpinCount) = 0;
v41 = v55 + v40;
v42 = v55 + v39;
if( v40 - v39 == -1 )
goto LABEL_72;
v43 = (_QWORD *)(v37 + 8 * ((unsigned __int64)v42 >> 6));
for( n = ~*v43 | ((1i64 << (v42 & 0x3F)) - 1); n == -1; n = ~*v43 )
{
if( (unsigned __int64)++v43 > v37 + 8 * ((unsigned __int64)v41 >> 6) )
goto LABEL_72;
}
_BitScanForward64(&v45, ~n);
v46 = v45 + ((unsigned int)(((__int64)v43 - v37) >> 3) << 6);
HIDWORD(SpinCount) = v45;
if( v46 > v41 )
{
LABEL_72:
v46 = -1;
}
else if( v46 != -1 )
{
break;
}
if( !v39 )
break;
v53 = v36 + 1;
if( v36 + 1 > v61.SizeOfBitMap )
v53 = v61.SizeOfBitMap;
v40 = v53 - 1;
v39 = 0;
}
v47 = v46 - v55;
if( v46 == -1 )
v47 = 0xFFFFFFFFi64;
v59 = MI_READ_PTE_LOCK_FREE((INT64)v38 + 8 * v47);
v48 = v59;
if( (v59 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v59);
}
else if( qword_140C4DC80 )
{
if( (v59 & 0x10) != 0 )
v48 = v59 & 0xFFFFFFFFFFFFFFEFui64;
else
v48 = ~qword_140C4DC80 & v59;
}
v49 = (v48 >> 12) & 0xFFFFFFFFFi64;
v50 = MmGetPfnDb();
if( v35 == 1 )
{
*((_QWORD *)&v65 + 1) = *((_QWORD *)v50 + 6 * v49 + 5) ^ (v60 ^ *((_QWORD *)v50 + 6 * v49 + 5)) & 0xFFFFFFFFFi64;
*((_QWORD *)v50 + 6 * v49 + 5) = *((_QWORD *)&v65 + 1);
}
--v6;
_InterlockedAnd64((volatile signed __int64 *)v50 + 6 * v49 + 3, 0x7FFFFFFFFFFFFFFFui64);
v36 = v47 + 1;
}
}Referenced by:
No references.