MiObtainRelocationBits
VOID __stdcall MiObtainRelocationBits(
_RTL_BITMAP **Bitmap,
UINT16 SizeIn64k,
UINT64 StartBit,
UINT64 ClearOriginalBits){
_ETHREAD *CurrentThread;
UINT64 v6;
UINT64 ClearBitsAndSet;
UINT64 v9;
UINT64 *v10;
UINT64 v11;
UINT64 v12;
UINT64 v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = SizeIn64k;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)&qword_140C4C888, 0i64);
ClearBitsAndSet = RtlFindClearBitsAndSetEx((UINT64 *)&(*Bitmap)->SizeOfBitMap, (unsigned int)v6, StartBit);
v9 = ClearBitsAndSet;
if( ClearBitsAndSet != -1i64 )
{
v10 = (UINT64 *)Bitmap[1];
if( v10 )
{
v11 = RtlFindClearBitsAndSetEx(v10, v6, ClearBitsAndSet);
if( v11 != v9 )
{
RtlClearBitsEx((INT64)*Bitmap, v9, v6);
if( v11 != -1i64 )
RtlClearBitsEx((INT64)Bitmap[1], v11, v6);
MiSelectRelocationStartHint(Bitmap, v6, StartBit, 1i64);
v13 = v12;
if( v12 != -1i64 )
{
RtlSetBitsEx((INT64)*Bitmap, v12, v6);
RtlSetBitsEx((INT64)Bitmap[1], v13, v6);
}
}
}
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C4C888, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&qword_140C4C888);
KeAbPostRelease(&qword_140C4C888);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}Referenced by:
MiSelectImageBase