MiPopulateCfgBitMap
NTSTATUS __stdcall MiPopulateCfgBitMap(
_MI_CFG_BITMAP_INFO *ProcessBitMapInfo,
VOID *RvaList,
_MI_RVA_LIST_TYPE ListType,
VOID *StartVa,
VOID *EndVa,
_MI_CFG_COPY_TO_BITMAP_OPTION CopyOption){
_MMVAD_SHORT *CopyIterator;
__int128 *v7;
volatile signed __int64 *p_bf_0;
UINT64 ImageStartRva;
_MI_RVA_LIST_TYPE v12;
VOID *v13;
NTSTATUS v14;
UINT64 v16;
__int128 v17;
int v18;
CopyIterator = (_MMVAD_SHORT *)*((_QWORD *)ProcessBitMapInfo + 2);
v7 = &v17;
v18 = 0;
p_bf_0 = &CopyIterator->PushLock._bf_0;
ImageStartRva = *(_QWORD *)ProcessBitMapInfo + ((2 * ((unsigned __int64)EndVa >> 4)) >> 3);
v12 = (int)StartVa;
v17 = 0i64;
if( (unsigned __int64)RvaList <= 1 )
LODWORD(v7) = 0;
ExAcquirePushLockExclusiveEx(&CopyIterator->PushLock, 0i64);
if( MiVadDeleted(CopyIterator) )
{
if( (_InterlockedExchangeAdd64(p_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&CopyIterator->PushLock);
KeAbPostRelease(&CopyIterator->PushLock);
return -1073741558;
}
else
{
LODWORD(v16) = 0;
v14 = MiCopyToCfgBitMap(
ProcessBitMapInfo,
(_MMVAD *)RvaList,
v13,
v12,
ImageStartRva,
(_MI_CFG_COPY_TO_BITMAP_ITERATOR *)CopyIterator,
v16,
(_MI_CFG_COPY_TO_BITMAP_OPTION)v7,
(unsigned __int64)(2i64 * ((*(_QWORD *)&CopyOption - (_QWORD)EndVa) >> 4)) >> 3);
if( (_InterlockedExchangeAdd64(p_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&CopyIterator->PushLock);
KeAbPostRelease(&CopyIterator->PushLock);
return v14;
}
}Referenced by:
MiCfgMarkValidEntries
MiMarkPrivateImageCfgBits
MiMarkPrivateOpenCfgBits