MiDeleteEmptyPageTableTail
NTSTATUS __stdcall MiDeleteEmptyPageTableTail(INT64 *a1){
int v2;
_MI_TB_FLUSH_LIST *v3;
_MMPTE *v4;
_MMPTE v5;
unsigned __int64 v6;
unsigned int i;
UINT64 v8;
UINT64 SetBits;
unsigned __int64 SizeOfBitMap;
UINT64 v11;
UINT64 NextForwardRunClear;
_EPROCESS *v13;
_MMPFN *v14;
UINT64 v15;
UINT64 v16;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v17;
unsigned __int64 *Buffer;
_RTL_BITMAP_EX BitMapHeader;
UINT64 StartingRunIndex;
UINT64 v22;
v2 = 0;
v3 = (_MI_TB_FLUSH_LIST *)a1[2];
StartingRunIndex = 0i64;
MiFlushTbList(v3);
v4 = (_MMPTE *)a1[21];
BitMapHeader.SizeOfBitMap = 512i64;
v5.u.Long = v4->u.Long;
BitMapHeader.Buffer = &v4[3].u.Long;
if( v5.u.Long )
{
v6 = v5.u.Long & 0xFFFFFFFFFFFFF000ui64;
for( i = 0; i < 2; ++i )
{
v8 = 0i64;
do
{
SetBits = RtlFindSetBitsEx(&BitMapHeader, 1ui64, v8);
SizeOfBitMap = BitMapHeader.SizeOfBitMap;
v11 = SetBits;
if( SetBits < v8 || SetBits == -1i64 )
break;
NextForwardRunClear = RtlFindNextForwardRunClearEx(&BitMapHeader, SetBits, &StartingRunIndex);
v15 = StartingRunIndex;
v22 = NextForwardRunClear;
if( !NextForwardRunClear )
v15 = SizeOfBitMap;
v16 = v15 - v11;
v17.Long = v6 + 8 * v11;
v4->u.Long = v17.Long;
v4[1].u.Long = v17.Long + 8 * v16 - 8;
if( i )
MiDeleteEmptyPageTableCommit(a1);
else
MiDeletePteRun((_MMPTE *)a1[3], v4, v13, v14, (_MI_DELETE_VA_INFO *)BitMapHeader.SizeOfBitMap);
v8 = v22 + v11 + v16;
}
while( v8 < SizeOfBitMap );
if( !i )
{
if( !v4[12].u.Long )
break;
MiReleaseWalkLocks((INT64)a1);
}
}
Buffer = BitMapHeader.Buffer;
v4->u.Long = 0i64;
v4[1].u.Long = 0i64;
LOBYTE(v2) = (SizeOfBitMap & 0x1F) != 0;
memset(Buffer, 0i64, 4 * ((SizeOfBitMap >> 5) + v2));
}
return 0;
}Referenced by:
No references.