MiSelectRelocationStartHint
VOID __stdcall MiSelectRelocationStartHint(_RTL_BITMAP **Bitmap, UINT16 SizeIn64k, UINT64 StartBit, INT64 a4){
int v4;
UINT64 v6;
_ETHREAD *CurrentThread;
char v9;
v4 = a4;
v6 = SizeIn64k;
if( Bitmap[1] )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( !(_DWORD)a4 )
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C4C888, 0i64);
}
RtlCopyBitMapEx((_RTL_BITMAP_EX *)*Bitmap, &Destination, 0i64);
RtlMergeBitMapsEx(&Destination.SizeOfBitMap, (INT64 *)Bitmap[1]);
RtlFindClearBitsEx(&Destination, v6, StartBit);
if( !v4 )
{
v9 = _InterlockedExchangeAdd64(&stru_140C4C888._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v9 & 2) != 0 && (v9 & 4) == 0 )
ExfTryToWakePushLock(&stru_140C4C888);
KeAbPostRelease(&stru_140C4C888);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
}
else
{
RtlFindClearBitsEx((_RTL_BITMAP_EX *)*Bitmap, SizeIn64k, StartBit);
}
}Referenced by:
MiObtainRelocationBits
MiSelectImageBase