MiMarkSharedImageCfgBits

__int64 __fastcall MiMarkSharedImageCfgBits(__int64 a1, __int64 a2, __int64 a3){
  _QWORD *v3; 
  LARGE_INTEGER **v4; 
  _EPROCESS *v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  volatile signed __int64 *v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  int IsCfgBitMapPageShared; 
  void *v20; 
  int v21; 
  INT64 v23; 
  unsigned int v24; 
  UINT64 Src; 
  INT64 v26; 
  UINT64 v27; 
  UINT AnyPageLocked; 
  UINT CapturedOldProtect; 
  _EPROCESS *v30; 
  UINT64 v31; 
  _QWORD *v32; 
  UINT64 v33[2]; 
  int v34; 
  AnyPageLocked = 0;
  v3 = (_QWORD *)a1;
  CapturedOldProtect = 0;
  v32 = (_QWORD *)a1;
  v4 = *(LARGE_INTEGER ***)(a3 + 72);
  v5 = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
  v30 = v5;
  LODWORD(v6) = MiGetControlAreaLoadConfig(*v4);
  v8 = v3[2];
  v9 = (unsigned __int64)*(unsigned __int8 *)(v7 + 33) << 32;
  v10 = (unsigned __int64)*(unsigned __int8 *)(v7 + 32) << 32;
  v31 = *(_QWORD *)(v6 + 16);
  v11 = (volatile signed __int64 *)(v8 + 40);
  v12 = (*(unsigned int *)(v7 + 24) | v10) << 12;
  v13 = 2 * (((((*(unsigned int *)(v7 + 28) | v9) + 1) << 12) - v12) >> 4);
  v14 = *v3 + ((2 * (v12 >> 4)) >> 3);
  v15 = v13 >> 3;
  ExAcquirePushLockExclusiveEx(v8 + 40, 0i64);
  if( (unsigned int)MiVadDeleted(v8) )
  {
    if( (_InterlockedExchangeAdd64(v11, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(v8 + 40));
    KeAbPostRelease((PVOID)(v8 + 40));
    return 3221225738i64;
  }
  v16 = v15 + v14;
  v34 = 0;
  v17 = (v15 + v14 - 1) | 0xFFF;
  v18 = v14 & 0xFFFFFFFFFFFFF000ui64;
  *(_OWORD *)v33 = 0i64;
  while( v18 <= v17 )
  {
    IsCfgBitMapPageShared = MiIsCfgBitMapPageShared(v18, v8);
    if( IsCfgBitMapPageShared == 2 )
    {
      v20 = (void *)(v18 | 0xFFF);
      goto LABEL_6;
    }
    if( IsCfgBitMapPageShared != 1 )
    {
      if( IsCfgBitMapPageShared == 3 )
      {
        v20 = (void *)v17;
        if( (v18 | 0x1FFFFF) <= v17 )
          v20 = (void *)(v18 | 0x1FFFFF);
LABEL_6:
        LODWORD(v26) = 0;
        LODWORD(Src) = 2;
        v21 = MiSetProtectionOnSection(
                v5,
                (_MMVAD *)v8,
                (void *)v18,
                v20,
                Src,
                v26,
                &CapturedOldProtect,
                &AnyPageLocked);
        if( v21 < 0 )
          goto LABEL_11;
        v18 = (unsigned __int64)v20 - 4095;
        v3 = v32;
      }
      else
      {
        if( v18 < v14 )
          v23 = (unsigned int)(v14 - v18);
        else
          v23 = 0i64;
        if( v18 + 4096 <= v16 )
        {
          v24 = 4096 - v23;
        }
        else
        {
          v24 = v16 - v18 - v23;
          if( (_DWORD)v16 - (_DWORD)v18 == (_DWORD)v23 )
            break;
        }
        LODWORD(v27) = (unsigned int)(v23 + v18 - v14) >> 1 << 7;
        v21 = MiCopyToCfgBitMap((INT64)v3, v31, v23, 0i64, v18 + (unsigned int)v23, v8, v27, v33, v24);
        if( v21 < 0 )
          goto LABEL_11;
      }
      v5 = v30;
    }
    v18 += 4096i64;
  }
  v21 = 0;
LABEL_11:
  if( (_InterlockedExchangeAdd64(v11, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)(v8 + 40));
  KeAbPostRelease((PVOID)(v8 + 40));
  return(unsigned int)v21;
}

Referenced by:

MiMarkProcessCfgBits