MiClearRangeInPartitionTree

NTSTATUS __stdcall MiClearRangeInPartitionTree(_RTL_BALANCED_NODE **Tree, INT64 a2, UINT64 a3){
  UINT64 v3; 
  INT64 v4; 
  INT64 v5; 
  __int64 v7; 
  UINT64 v8; 
  _RTL_BITMAP_EX *v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  _RTL_BITMAP_EX *v12; 
  UINT64 v13; 
  unsigned __int64 SizeOfBitMap; 
  unsigned __int64 *Buffer; 
  unsigned __int64 v16; 
  unsigned __int64 *v17; 
  bool v18; 
  bool i; 

  v3 = a3;
  v4 = a2 & 0x7FFFFFFFFFFC0000i64;
  v5 = a2;
  v7 = a2 - (a2 & 0x7FFFFFFFFFFC0000i64);
  v8 = (v7 + a3 + 0x3FFFF) >> 18;
  if( v8 )
  {
    while( 1 )
    {
      v9 = (_RTL_BITMAP_EX *)*Tree;
      if( *Tree )
      {
        v10 = v4 & 0x7FFFFFFFFFFFFFFFi64;
        do
        {
          v11 = (__int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64;
          if( v10 < v11 )
          {
            v9 = (_RTL_BITMAP_EX *)v9->SizeOfBitMap;
          }
          else
          {
            if( v10 <= v11 )
              break;
            v9 = (_RTL_BITMAP_EX *)v9->Buffer;
          }
        }
        while( v9 );
      }
      v12 = v9 + 2;
      v13 = v3;
      if( ((unsigned __int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64) - v5 + 0x40000 <= v3 )
        v13 = ((__int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64) - v5 + 0x40000;
      RtlClearBitsEx(v9 + 2, v5 - ((__int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64), v13);
      SizeOfBitMap = v12->SizeOfBitMap;
      if( !v12->SizeOfBitMap )
        goto LABEL_24;
      if( SizeOfBitMap <= 1 )
        break;
      Buffer = v9[2].Buffer;
      v16 = *Buffer;
      v17 = &Buffer[(SizeOfBitMap - 1) >> 6];
      if( Buffer != v17 )
      {
        for( i = v16 == 0; i; i = *Buffer == 0 )
        {
          if( ++Buffer == v17 )
          {
            v18 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)SizeOfBitMap - 1)) & *Buffer) == 0;
            goto LABEL_22;
          }
        }
        goto LABEL_24;
      }
      v18 = (v16 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)SizeOfBitMap))) == 0;
LABEL_22:
      if( v18 )
        goto LABEL_23;
LABEL_24:
      v5 += v13;
      v7 = (v4 ^ (v4 + 0x40000)) & 0x7FFFFFFFFFFFFFFFi64;
      v3 -= v13;
      v4 ^= v7;
      if( !--v8 )
        return v7;
    }
    if( _bittest64((const signed __int64 *)v9[2].Buffer, 0) )
      goto LABEL_24;
LABEL_23:
    RtlAvlRemoveNode((UINT64 *)Tree, (INT64 *)v9);
    ExFreePoolWithTag(v9[2].Buffer, 0);
    ExFreePoolWithTag(v9, 0);
    goto LABEL_24;
  }
  return v7;
}

Referenced by:

MiAddMdlToPartitionTree