MiObtainRelocationBits

VOID __stdcall MiObtainRelocationBits(
        _RTL_BITMAP **Bitmap,
        UINT16 SizeIn64k,
        UINT64 StartBit,
        UINT64 ClearOriginalBits){
  _ETHREAD *CurrentThread; 
  UINT64 v6; 
  UINT64 ClearBitsAndSet; 
  UINT64 v9; 
  _RTL_BITMAP_EX *v10; 
  UINT64 v11; 
  UINT64 v12; 
  UINT64 v13; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = SizeIn64k;
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockExclusiveEx(&stru_140C4C888, 0i64);
  ClearBitsAndSet = RtlFindClearBitsAndSetEx((_RTL_BITMAP_EX *)*Bitmap, (unsigned int)v6, StartBit);
  v9 = ClearBitsAndSet;
  if( ClearBitsAndSet != -1i64 )
  {
    v10 = (_RTL_BITMAP_EX *)Bitmap[1];
    if( v10 )
    {
      v11 = RtlFindClearBitsAndSetEx(v10, v6, ClearBitsAndSet);
      if( v11 != v9 )
      {
        RtlClearBitsEx((_RTL_BITMAP_EX *)*Bitmap, v9, v6);
        if( v11 != -1i64 )
          RtlClearBitsEx((_RTL_BITMAP_EX *)Bitmap[1], v11, v6);
        MiSelectRelocationStartHint(Bitmap, v6, StartBit, 1i64);
        v13 = v12;
        if( v12 != -1i64 )
        {
          RtlSetBitsEx((_RTL_BITMAP_EX *)*Bitmap, v12, v6);
          RtlSetBitsEx((_RTL_BITMAP_EX *)Bitmap[1], v13, v6);
        }
      }
    }
  }
  if( (_InterlockedExchangeAdd64(&stru_140C4C888._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&stru_140C4C888);
  KeAbPostRelease(&stru_140C4C888);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}

Referenced by:

MiSelectImageBase