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