HvpViewMapMakeViewRangeCOWByCaller

__int64 __fastcall HvpViewMapMakeViewRangeCOWByCaller(UINT64 a1, _QWORD *a2, __int64 a3, __int64 a4){
  __int64 v4; 
  UINT64 v8; 
  NTSTATUS v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  VOID *v14; 
  UINT64 v16; 
  UINT64 NewProtectWin32; 
  UINT64 NewProtectWin32a; 
  __int64 v19; 

  LODWORD(v19) = 0;
  v4 = a3;
  LODWORD(NewProtectWin32) = 8;
  v9 = CmSiProtectViewOfSection(
         a1,
         *(VOID ***)(a1 + 24),
         (VOID *)(a2[7] + a3 - a2[3]),
         a4 - a3,
         NewProtectWin32,
         (__int64)&v19);
  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(NewProtectWin32a) = -2147483646;
          CmSiProtectViewOfSection(
            v16,
            *(VOID ***)(a1 + 24),
            (VOID *)(a2[7] + v4 - v16),
            0x1000ui64,
            NewProtectWin32a,
            (__int64)&v19);
        }
        v4 += 4096i64;
      }
      while( v4 < a4 );
    }
  }
  return(unsigned int)v9;
}

Referenced by:

HvpViewMapCOWAndUnsealRange