HvpViewMapMakeViewRangeCOWByCaller

INT64 __fastcall HvpViewMapMakeViewRangeCOWByCaller(UINT64 a1, _QWORD *a2, INT64 a3, INT64 a4){
  INT64 v4; 
  UINT64 v8; 
  int v9; 
  INT64 v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  VOID *v14; 
  UINT64 v16; 
  UINT64 NewAccessProtection; 
  UINT64 NewAccessProtectiona; 
  INT64 a6; 
  LODWORD(a6) = 0;
  v4 = a3;
  LODWORD(NewAccessProtection) = 8;
  v9 = CmSiProtectViewOfSection(
         a1,
         *(VOID ***)(a1 + 24),
         (VOID *)(a2[7] + a3 - a2[3]),
         a4 - a3,
         NewAccessProtection,
         (INT64)&a6);
  if( v9 >= 0 )
  {
    v10 = v4;
    if( v4 >= a4 )
    {
      return 0;
    }
    else
    {
      while( 1 )
      {
        v11 = a2[3];
        if( (*((_BYTE *)a2 + ((unsigned __int64)(v10 - v11) >> 12) + 72) & 2) == 0 )
        {
          v9 = HvpViewMapTouchPages((BYTE *)(a2[7] + v10 - v11), 4096i64, 1);
          if( v9 < 0 )
            break;
        }
        v10 += 4096i64;
        if( v10 >= a4 )
        {
          while( v4 < a4 )
          {
            v12 = a2[3];
            v13 = (unsigned __int64)(v4 - v12) >> 12;
            v14 = (VOID *)(a2[7] + v4 - v12);
            LOBYTE(v12) = *((_BYTE *)a2 + v13 + 72) | 0xA;
            *((_BYTE *)a2 + v13 + 72) = v12;
            if( (v12 & 0x10) != 0 )
            {
              CmSiUnlockViewOfSection(v8, *(VOID ***)(a1 + 24), v14, 0x1000ui64);
              *((_BYTE *)a2 + v13 + 72) &= ~0x10u;
              --a2[8];
              *((_BYTE *)a2 + v13 + 72) |= 4u;
            }
            v4 += 4096i64;
          }
          return 0;
        }
      }
      do
      {
        v16 = a2[3];
        if( (*((_BYTE *)a2 + ((v4 - v16) >> 12) + 72) & 6) == 0 )
        {
          LODWORD(NewAccessProtectiona) = -2147483646;
          CmSiProtectViewOfSection(
            v16,
            *(VOID ***)(a1 + 24),
            (VOID *)(a2[7] + v4 - v16),
            0x1000ui64,
            NewAccessProtectiona,
            (INT64)&a6);
        }
        v4 += 4096i64;
      }
      while( v4 < a4 );
    }
  }
  return(unsigned int)v9;
}

Referenced by:

HvpViewMapCOWAndUnsealRange