MiInitializeDriverPtes
NTSTATUS __stdcall MiInitializeDriverPtes(INT64 LoaderBlock){
_RTL_BALANCED_NODE *v1;
INT64 v2;
_RTL_BALANCED_NODE *v3;
BOOL v4;
_RTL_BALANCED_NODE *Pool;
_RTL_BALANCED_NODE *v6;
_RTL_BALANCED_NODE *v7;
_RTL_BALANCED_NODE *v8;
_RTL_BALANCED_NODE *v9;
_RTL_BALANCED_NODE *v10;
_QWORD *Children;
_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;
__int64 v44;
int v45;
_RTL_BALANCED_NODE *v46;
INT64 *m;
INT64 *v48;
INT64 **v49;
INT64 *v50;
INT64 *v51;
unsigned int v53;
_RTL_BALANCED_NODE *Tree;
v1 = 0i64;
v2 = LoaderBlock + 16;
v3 = *(_RTL_BALANCED_NODE **)(LoaderBlock + 16);
Tree = 0i64;
while( v3 != (_RTL_BALANCED_NODE *)v2 )
{
if( !MI_IS_PHYSICAL_ADDRESS(v3[2].Children[0]) )
{
Pool = (_RTL_BALANCED_NODE *)MiAllocatePool(64i64, 0x20ui64, 0x70446D4Dui64);
v6 = Pool;
if( !Pool )
return 0;
v4 = 0;
Pool[1].Children[0] = v3;
v7 = v3[2].Children[0];
if( v1 )
{
while( 1 )
{
v8 = v1[1].Children[0];
v9 = v8[2].Children[0];
if( v7 <= (_RTL_BALANCED_NODE *)((char *)v9 + (unsigned int)(*(_DWORD *)&v8[2]._bf_0 - 1)) && v7 < v9 )
{
v10 = v1->Children[0];
if( !v1->Children[0] )
break;
}
else
{
v10 = v1->Children[1];
if( !v10 )
{
v4 = 1;
break;
}
}
v1 = v10;
}
}
RtlAvlInsertNodeEx(&Tree, (UINT64)v1, v4, v6);
v1 = Tree;
}
v3 = v3->Children[0];
}
Children = 0i64;
while( v1 )
{
Children = v1->Children;
v1 = v1->Children[0];
}
while( 1 )
{
PteBase = MmGetPteBase();
if( !Children )
break;
if( !MiReserveBootDriverPtes(
(UINT64)PteBase + ((*(_QWORD *)(Children[3] + 48i64) >> 9) & 0x7FFFFFFFF8i64),
*(_DWORD *)(Children[3] + 64i64) >> 12) )
return 0;
v14 = (_QWORD *)Children[1];
v15 = Children;
if( v14 )
{
v12 = (_QWORD *)*v14;
Children = (_QWORD *)Children[1];
if( *v14 )
{
do
{
Children = v12;
v12 = (_QWORD *)*v12;
}
while( v12 );
}
}
else
{
while( 1 )
{
Children = (_QWORD *)(Children[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !Children || (_QWORD *)*Children == v15 )
break;
v15 = Children;
}
}
}
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;
v53 = v17 + 1;
if( v17 + 1 > v18 )
v53 = *((_DWORD *)i + 4);
v20 = v53 - 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;
v45 = v29 + 2;
if( (int)v29 + 2 > v30 )
v45 = *((_DWORD *)i + 4);
v33 = v45 - 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
{
LODWORD(v44) = MI_READ_PTE_LOCK_FREE(v42);
if( v44 )
_bittestandset(*((signed __int32 **)i + 3), v29);
LODWORD(v29) = v29 + 1;
v42 += 8i64;
--v43;
}
while( v43 );
}
}
while( v17 < *((_DWORD *)i + 4) );
}
if( (KiSpeculationFeatures & 0x4000000) != 0 )
*(&stru_140C4DB30 + 97) = (unsigned __int64)(((__int64)((*((_QWORD *)qword_140C4CA70 + 1) << 25)
+ ((unsigned __int64)*((unsigned int *)qword_140C4CA70 + 4) << 28)
- ((_QWORD)MmGetPteBase() << 25)) >> 16)
- *(&stru_140C4DB30 + 98)) >> 21;
v46 = Tree;
m = 0i64;
while( v46 )
{
m = (INT64 *)v46;
v46 = v46->Children[0];
}
while( m )
{
v49 = (INT64 **)m[1];
v50 = m;
v51 = m;
if( v49 )
{
v48 = *v49;
for( m = (INT64 *)m[1]; v48; v48 = (INT64 *)*v48 )
m = v48;
}
else
{
while( 1 )
{
m = (INT64 *)(m[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !m || (INT64 *)*m == v51 )
break;
v51 = m;
}
}
RtlAvlRemoveNode((UINT64 *)&Tree, v50);
ExFreePoolWithTag(v50, 0);
}
return 1;
}Referenced by:
MiInitializeDriverImages