MiInitializeDriverPtes
INT64 __stdcall MiInitializeDriverPtes(INT64 LoaderBlock){
_QWORD *v1;
INT64 v2;
__int64 *v3;
bool v4;
_QWORD *v5;
_QWORD *v6;
unsigned __int64 v7;
__int64 v8;
unsigned __int64 v9;
_QWORD *v10;
_QWORD *v11;
_QWORD *v12;
_MMPTE *PteBase;
_QWORD *v14;
_QWORD *v15;
PVOID i;
unsigned int v17;
unsigned int v18;
unsigned int v19;
unsigned int v20;
int v21;
__int64 v22;
unsigned int v23;
unsigned int v24;
__int64 *v25;
__int64 j;
unsigned __int64 v27;
unsigned int v28;
__int64 v29;
unsigned int v30;
unsigned int v31;
unsigned int v32;
unsigned int v33;
int v34;
__int64 v35;
unsigned int v36;
unsigned int v37;
_QWORD *v38;
__int64 k;
unsigned __int64 v40;
unsigned int v41;
INT64 v42;
int v43;
int v44;
__int64 *v45;
__int64 *m;
__int64 *v47;
__int64 **v48;
__int64 *v49;
__int64 *v50;
unsigned int v52;
_QWORD *v53;
v1 = 0i64;
v2 = LoaderBlock + 16;
v3 = *(__int64 **)(LoaderBlock + 16);
v53 = 0i64;
while( v3 != (__int64 *)v2 )
{
if( !(unsigned int)MI_IS_PHYSICAL_ADDRESS((PVOID)v3[6]) )
{
LODWORD(v5) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v6 = v5;
if( !v5 )
return 0i64;
v4 = 0;
v5[3] = v3;
v7 = v3[6];
if( v1 )
{
while( 1 )
{
v8 = v1[3];
v9 = *(_QWORD *)(v8 + 48);
if( v7 <= v9 + (unsigned int)(*(_DWORD *)(v8 + 64) - 1) && v7 < v9 )
{
v10 = (_QWORD *)*v1;
if( !*v1 )
break;
}
else
{
v10 = (_QWORD *)v1[1];
if( !v10 )
{
v4 = 1;
break;
}
}
v1 = v10;
}
}
RtlAvlInsertNodeEx((unsigned __int64 *)&v53, (__int64)v1, v4, v6);
v1 = v53;
}
v3 = (__int64 *)*v3;
}
v11 = 0i64;
while( v1 )
{
v11 = v1;
v1 = (_QWORD *)*v1;
}
while( 1 )
{
PteBase = MmGetPteBase();
if( !v11 )
break;
if( !(unsigned int)MiReserveBootDriverPtes(
(UINT64)PteBase + ((*(_QWORD *)(v11[3] + 48i64) >> 9) & 0x7FFFFFFFF8i64),
*(_DWORD *)(v11[3] + 64i64) >> 12) )
return 0i64;
v14 = (_QWORD *)v11[1];
v15 = v11;
if( v14 )
{
v12 = (_QWORD *)*v14;
v11 = (_QWORD *)v11[1];
if( *v14 )
{
do
{
v11 = v12;
v12 = (_QWORD *)*v12;
}
while( v12 );
}
}
else
{
while( 1 )
{
v11 = (_QWORD *)(v11[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !v11 || (_QWORD *)*v11 == v15 )
break;
v15 = v11;
}
}
}
for( i = qword_140C4CA70; i; i = *(PVOID *)i )
{
v17 = 0;
do
{
v18 = *((_DWORD *)i + 4);
v19 = v17 < v18 ? v17 : 0;
v20 = v18 - 1;
v21 = (*((_DWORD *)i + 6) & 4) != 0i64 ? 0x20 : 0;
v22 = *((_QWORD *)i + 3) - ((*((_QWORD *)i + 3) & 4i64) != 0 ? 4 : 0);
while( 1 )
{
v23 = v21 + v20;
v24 = v21 + v19;
if( v20 - v19 == -1 )
goto LABEL_65;
v25 = (__int64 *)(v22 + 8 * ((unsigned __int64)v24 >> 6));
for( j = *v25 | ((1i64 << (v24 & 0x3F)) - 1); j == -1; j = *v25 )
{
if( (unsigned __int64)++v25 > v22 + 8 * ((unsigned __int64)v23 >> 6) )
goto LABEL_65;
}
_BitScanForward64(&v27, ~j);
v28 = v27 + ((unsigned int)(((__int64)v25 - v22) >> 3) << 6);
if( v28 > v23 )
{
LABEL_65:
v28 = -1;
}
else if( v28 != -1 )
{
break;
}
if( !v19 )
break;
v52 = v17 + 1;
if( v17 + 1 > v18 )
v52 = *((_DWORD *)i + 4);
v20 = v52 - 1;
v19 = 0;
}
v29 = v28 - v21;
if( v28 == -1 )
v29 = 0xFFFFFFFFi64;
if( (unsigned int)v29 < v17 || (_DWORD)v29 == -1 )
break;
v30 = *((_DWORD *)i + 4);
v31 = v29 + 1;
v32 = v31 < v30 ? v31 : 0;
v33 = v30 - 1;
v34 = (*((_DWORD *)i + 6) & 4) != 0i64 ? 0x20 : 0;
v35 = *((_QWORD *)i + 3) - ((*((_QWORD *)i + 3) & 4i64) != 0 ? 4 : 0);
while( 1 )
{
v36 = v34 + v33;
v37 = v34 + v32;
if( v33 - v32 == -1 )
goto LABEL_60;
v38 = (_QWORD *)(v35 + 8 * ((unsigned __int64)v37 >> 6));
for( k = ~*v38 | ((1i64 << (v37 & 0x3F)) - 1); k == -1; k = ~*v38 )
{
if( (unsigned __int64)++v38 > v35 + 8 * ((unsigned __int64)v36 >> 6) )
goto LABEL_60;
}
_BitScanForward64(&v40, ~k);
v41 = v40 + ((unsigned int)(((__int64)v38 - v35) >> 3) << 6);
if( v41 > v36 )
{
LABEL_60:
v41 = -1;
}
else if( v41 != -1 )
{
break;
}
if( !v32 )
break;
v44 = v29 + 2;
if( (int)v29 + 2 > v30 )
v44 = *((_DWORD *)i + 4);
v33 = v44 - 1;
v32 = 0;
}
v17 = v41 - v34;
if( v41 == -1 )
v17 = -1;
if( v17 < v31 || v17 == -1 )
v17 = *((_DWORD *)i + 4);
v42 = *((_QWORD *)i + 1) + 8 * v29;
v43 = v17 - v29;
if( v17 != (_DWORD)v29 )
{
do
{
if( MI_READ_PTE_LOCK_FREE(v42) )
_bittestandset(*((signed __int32 **)i + 3), v29);
LODWORD(v29) = v29 + 1;
v42 += 8i64;
--v43;
}
while( v43 );
}
}
while( v17 < *((_DWORD *)i + 4) );
}
if( (KiSpeculationFeatures & 0x4000000) != 0 )
qword_140C4DE38 = (unsigned __int64)(((__int64)((*((_QWORD *)qword_140C4CA70 + 1) << 25)
+ ((unsigned __int64)*((unsigned int *)qword_140C4CA70 + 4) << 28)
- ((_QWORD)MmGetPteBase() << 25)) >> 16)
- qword_140C4DE40) >> 21;
v45 = v53;
m = 0i64;
while( v45 )
{
m = v45;
v45 = (__int64 *)*v45;
}
while( m )
{
v48 = (__int64 **)m[1];
v49 = m;
v50 = m;
if( v48 )
{
v47 = *v48;
for( m = (__int64 *)m[1]; v47; v47 = (__int64 *)*v47 )
m = v47;
}
else
{
while( 1 )
{
m = (__int64 *)(m[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !m || (__int64 *)*m == v50 )
break;
v50 = m;
}
}
RtlAvlRemoveNode((unsigned __int64 *)&v53, v49);
ExFreePoolWithTag(v49, 0);
}
return 1i64;
}Referenced by:
MiInitializeDriverImages