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