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.