MiGetPrototypePteRanges
NTSTATUS __stdcall MiGetPrototypePteRanges(UINT64 a1, _RTL_BITMAP *a2){
UINT64 v2;
NTSTATUS v4;
unsigned __int8 v5;
_RTL_BALANCED_NODE *Root;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
UINT64 v12;
UINT64 v13;
__int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 j;
_QWORD *i;
_QWORD *v20;
unsigned __int64 v21;
UINT64 v22;
__int64 v23;
__int64 v24;
unsigned __int64 v25;
UINT64 NumberToSet;
_RTL_BITMAP *BitMapHeader;
__int64 v29;
BitMapHeader = a2;
NumberToSet = 0i64;
v2 = a1 + 4096;
v4 = 1;
v5 = ExAcquireSpinLockShared(&qword_140C4C880);
Root = RootPointer.Root;
v7 = v5;
while( Root )
{
v29 = 0i64;
v8 = MiObtainProtoBaseFromNode(Root, &v29);
if( v9 >= v8 )
{
if( a1 < v8 + 8 * v29 )
break;
Root = Root->Children[1];
}
else
{
Root = Root->Children[0];
}
}
v10 = (unsigned __int64)Root;
if( Root )
{
while( 1 )
{
v11 = MiObtainProtoBaseFromNode((_QWORD *)v10, &NumberToSet);
v12 = NumberToSet;
v13 = v11;
if( v11 < a1 )
{
if( v11 + 8 * NumberToSet > a1 )
{
v13 = a1;
v12 = NumberToSet - ((__int64)(a1 - v11) >> 3);
NumberToSet = v12;
}
if( v13 < a1 )
break;
}
if( v13 >= v2 )
break;
if( (*(_BYTE *)(v10 + 24) & 7) == 4 )
{
v4 = 0;
break;
}
v14 = (__int64)(v13 - a1) >> 3;
if( v12 + (unsigned int)v14 > 0x200 )
{
LODWORD(v12) = 512 - v14;
NumberToSet = (unsigned int)(512 - v14);
}
RtlSetBits(BitMapHeader, (unsigned int)v14, (unsigned int)v12);
if( (_DWORD)v14 )
{
v15 = *(_QWORD *)v10;
v16 = v10;
if( *(_QWORD *)v10 )
{
while( 1 )
{
v10 = v15;
if( !*(_QWORD *)(v15 + 8) )
break;
v15 = *(_QWORD *)(v15 + 8);
}
}
else
{
while( 1 )
{
v10 = *(_QWORD *)(v10 + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !v10 || *(_QWORD *)(v10 + 8) == v16 )
break;
v16 = v10;
}
}
if( v10 )
continue;
}
break;
}
v17 = (unsigned __int64)Root->Children[1];
if( v17 )
{
for( i = *(_QWORD **)v17; i; i = (_QWORD *)*i )
v17 = (unsigned __int64)i;
}
else
{
for( j = Root->ParentValue; ; j = *(_QWORD *)(v17 + 16) )
{
v17 = j & 0xFFFFFFFFFFFFFFFCui64;
if( !v17 || *(_RTL_BALANCED_NODE **)v17 == Root )
break;
Root = (_RTL_BALANCED_NODE *)v17;
}
}
while( v17 )
{
v21 = MiObtainProtoBaseFromNode((_QWORD *)v17, &NumberToSet);
if( v21 >= v2 || v21 < a1 )
break;
if( (*(_BYTE *)(v17 + 24) & 7) == 4 )
{
v4 = 0;
break;
}
v22 = NumberToSet;
v23 = (__int64)(v21 - a1) >> 3;
v24 = (unsigned int)v23;
if( (unsigned int)v23 + NumberToSet > 0x200 )
{
v22 = (unsigned int)(512 - v23);
NumberToSet = v22;
}
RtlSetBits(BitMapHeader, (unsigned int)v23, (unsigned int)v22);
if( v24 + v22 == 512 )
break;
v20 = *(_QWORD **)(v17 + 8);
v25 = v17;
if( v20 )
{
do
{
v17 = (unsigned __int64)v20;
v20 = (_QWORD *)*v20;
}
while( v20 );
}
else
{
while( 1 )
{
v17 = *(_QWORD *)(v17 + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !v17 || *(_QWORD *)v17 == v25 )
break;
v25 = v17;
}
}
}
}
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&qword_140C4C880);
__writecr8(v7);
return v4;
}Referenced by:
MiReplacePageOfProtoPool